开篇
本体来源为《编程珠玑》第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