开篇
本体来源为《编程珠玑》第3章课后习题4的第一问。
问题概要
给定两个日期,计算两者之间的天数。
思路分析
以2022年1月22号和2024年2月3号为例:
- 首先根据年月日确定2022年1月22号是2022年的第22天,距离2023年还差(365 - 22 = 341)天(这里需要确定是否是闰年还是平年,以确定是365还是366
- 2024年2月3号是2024年的第34天
- 两个年月日的差即为: 341 + 365(2023年的天数) + 34
综上:主要需要的函数有:
判断是否是闰年isLeapYear();
根据年月日计算出属于当前年的第多少天cntDays();
还需要求出两个年份之间的年份,然后根据是否是平年还是闰年,在和上加上365或者366
代码实现
#include <stdio.h>
// 判断是否是闰年
int isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 计算当前日期是当年的第几天
int cntDays(int year, int month, int day) {
int days = 0;
int days_in_month[] = { 31, 28 + isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
for (int i = 0; i < month - 1; ++i) {
days += days_in_month[i];
}
days += day;
return days;
}
// 计算两个日期之间的天数差
int daysBetweenDates(int y1, int m1, int d1, int y2, int m2, int d2) {
int days = 0;
// 计算第一个日期距离年底的天数
days += isLeapYear(y1) ? 366 - cntDays(y1, m1, d1) : 365 - cntDays(y1, m1, d1);
// 计算中间年份的天数
for (int y = y1 + 1; y < y2; y++) {
days += isLeapYear(y) ? 366 : 365;
}
// 计算第二个日期距离当年年初的天数
days += cntDays(y2, m2, d2);
return days;
}
int main() {
int y1, m1, d1;
int y2, m2, d2;
// 用户输入两个日期
printf("请输入第一个日期(YYYY MM DD): ");
scanf_s("%d %d %d", &y1, &m1, &d1);
printf("请输入第二个日期(YYYY MM DD): ");
scanf_s("%d %d %d", &y2, &m2, &d2);
// 计算两个日期的天数之差,并输出
int daysDiff = daysBetweenDates(y1, m1, d1, y2, m2, d2);
printf("天数之差为: %d\n", daysDiff);
return 0;
}
注
啊哈哈,感觉这篇文章有点水,当作是日常记录的一个证明吧w