C语言每日一题——第六天
第六天
小明想了想,发现他已经写过数个用于计算日期的程序了。今天他决定更进一步,要实现一个可以计算两个日期实际相差天数的代码。另外,为了方便,不考虑闰年情况。
运行:main.exe B B A A
输出:
1-1 to 2-2 :
1?32
解释:前两个参数B B
表示目标日期为 2 月 2 日, A A
表示起始日期为 1 月 1日,1月与2月相隔1个月,1月 1日距离2月 2日相隔32天。
运行:main.exe B A A B
输出:
1-2 to 2-1 :
1?30
解释:前两个参数B A
表示目标日期为 2 月 1 日, A B
表示起始日期为 1 月 2日,1月与2月相隔1个月,2月 1日距离2月 1日相隔30天。
运行:main.exe A A B B
输出:
2-2 to 1-1 :
11?333
解释:前两个参数A A
表示目标日期为 1 月 1 日, B B
表示起始日期为 2 月 2日,2月与来年1月相隔11个月,2月 1日距离来年1月 1日相隔333天。
输入
程序通过命令行参数输入获取参数,参数格式为目标月 目标日 起始月 起始日
。
为了方便输入,将数字统一移动64个,即 ASSCII 码表为 65 的符号(即A
)代表数字1。
输出
程序第一行输出用于计算的起始月-起始日 to 目标月-目标日 :,
,第二行以问号?
为分隔,输出相隔月数
和相隔日数
。
关键
函数的使用,代码能力
解答
#include <stdio.h>
#include <iso646.h>
int get_day_number_of_month(int month) {
if (month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12) {
// "本"月有31天
return 31;
} else if (month == 2) {
// 2月28天
return 28;
} else {
// "本"月有30天
return 30;
}
}
int main(int cnt, char **argv) {
int target_month, target_day, start_month, start_day, pnt_month, day = 0;
if (cnt != 5) {
printf("Input value error!\n");
return -1;
}
// 获取输入
target_month = (int) (*argv[1] - 'A') + 1;
target_day = (int) (*argv[2] - 'A') + 1;
start_month = pnt_month = (int) (*argv[3] - 'A') + 1;
start_day = (int) (*argv[4] - 'A') + 1;
printf("%d-%d to %d-%d :\n", start_month, start_day, target_month, target_day);
// Month
if (target_month >= start_month) {
printf("%d?", target_month - start_month);
} else {
printf("%d?", 12 + target_month - start_month);
}
// Day
if (target_day > start_day) {
day += target_day - start_day;
} else {
day += get_day_number_of_month(start_month) - start_day + target_day;
pnt_month += 1;
}
while (pnt_month != target_month) {
day += get_day_number_of_month(pnt_month);
pnt_month += 1;
if (pnt_month > 12) {
pnt_month = 1;
}
}
printf("%d\n", day);
return 0;
}