一、应用到的知识:闰年问题,数组,for循环,命令行参数,atoi函数
1. 闰年问题:
闰年 是指该年有366日,即较平常年份多出一日。每400年就会有一次闰年;或者年份是4的倍数,但不是100的倍数的,也是闰年。如2000年是闰年,2004年也是闰年,但2001年却不是闰年。
2. 数组:
连续有顺序的,大小固定并且里面的数据类型一致的内存空间
3.for循环:
for (初始化; 判断表达式; 变量处理){
代码块;
}
初始化:用于初始化变量,只有刚进入for循环时执行
判断表达式:只要结果为真(不为0,NULL等),就会执行代码块
变量处理:对变量进行处理的,如 i++, i = i * 2, i--等
注意:
a. 首次进入for循环时,变量处理不会进行,只会进行初始化和判断表达式的。
b. 以上三个并不是必须填写的,可以和while循环互相替换
// 代码输出:
// 0
for (int i = 0; i < 1; i++){
printf("%d\n", i);
}
// 将i < 1改为 i < 0 则第一次进入不满足条件,不输出
4. 命令行参数(以下列代码为例):
#include <stdio.h>
int main(int argc, char* argv[]) {
for (int i = 0; i < argc; i++) {
printf("arg %d: %s\n", i, argv[i]);
}
}
上面示例中,main()函数有两个参数argc(argument count)和argv(argument variable)。这两个参数的名字可以任意取,但是一般来说,约定俗成就是使用这两个词。
第一个参数argc是命令行参数的数量,程序名也被计算在内。
第二个参数argv是一个数组,保存了所有的命令行输入,它的每个成员是一个字符串指针。
5.atoi函数:
该函数在头文件stdlib.h中,功能是将字符串转为整数(ASCII to int);
函数原型:int atoi(const char* nptr);
返回值:整型
参数:字符串(字符类型的数组)
二、完整代码和功能演示视频
#include <stdio.h>
#include <stdlib.h>
// 返回一年中的第几天的函数
int Day(int year, int month, int day){
// 初始化月份天数,没有0月,空置 二月
int months[13] = {0, 31, 0, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){
months[2] = 29;
} else {
months[2] = 28;
}
int ret = 0;
for (int i = 1; i < month; i++){
ret += months[i];
}
return ret + day;
}
// 主函数的参数:argc和argv
int main(int argc, char *argv[]){
if (argc != 4){
printf("Usage: %s 2020 12 3\n", argv[0]);
return 1;
}
int count = 0;
count = Day(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
printf("The %s-%s-%s is %d days.\n", argv[1], argv[2], argv[3], count);
return 0;
}
计算当天年天数20231227
三、介绍
1. 定义数组装载一年中12个月的每天天数,并且计算闰年将2月天数单独装载
2. 先封装一个函数Day(), 然后通过命令行参数输入日期
3. 在Day函数中,计算从1月1日截止至输入日期的天数,最后在主函数中输出
四、简单说一下外话
注意,本次的代码仅仅做一个小练习,所以并未对输入的参数进行设限,故输入一些错误数据,如13月,或者51号,或者 -2013年都是可以的。如果想要使代码更完善一些,不妨自己添加一些判断。
本次代码难度很小,可以利用库函数time.h中的函数简单完成,但本次仅仅是为了了解一些知识,并不对time.h库进行介绍
制作不易,还望点赞评论支持一下,谢谢