1 题目
输入某年某月某日,判断这一天是这一年的第几天?
2 分析
本题涉及到日历中平年和闰年的概念,平年和闰年的区别在于2月份的天数,平年2月份天数为28天,闰年2月份天数为29天,其他月份天数一样。
- 判断平年和闰年的方法:如果年份能被4整除,但不能被100整除,或则能被400整除,则是闰年。用于判断的
if
表达式如下:
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
下面给出每月的天数
1月 | 2月 | 3月 | 4月 | 5月 | 6月 | 7月 | 8月 | 9月 | 10月 | 11月 | 12月 |
---|---|---|---|---|---|---|---|---|---|---|---|
31天 | 平年28天/闰年29天 | 31天 | 30天 | 31天 | 30天 | 31天 | 31天 | 30天 | 31天 | 30天 | 31天 |
可以发现,在计算时只需给出平年的天数算法,在验证给出的时间年份是否是闰年且月份数大于2,若是则在天数上加1,把每个月对应的天数都事先计算出来,用switch
语句选择月份即可,实现如下:
注意:在程序中通过月份计算天数时,是从0月开始算的,比如输入的月日是1月20号,那么这一天必然是该年的第20天,所以在选择月份的时候,
case 1
处的sum
为0
。
3 实现
#include<stdio.h>
int main (void) {
int day, month, year, sum;
printf("请输入年月日,格式为年月日,中间空格隔开:");
scanf("%d%d%d", &year, &month, &day);
switch (month) {
case 1: sum = 0; break;
case 2: sum = 31; break;
case 3: sum = 59; break;
case 4: sum = 90; break;
case 5: sum = 120; break;
case 6: sum = 151; break;
case 7: sum = 181; break;
case 8: sum = 212; break;
case 9: sum = 243; break;
case 10: sum = 273; break;
case 11: sum = 304; break;
case 12: sum = 334; break;
}
sum = sum + day; // 再加上天数
if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {// 判断是不是闰年
if (month > 2) { // 改年是闰年,还要输入的月份大于2才加一
sum = sum + 1; // 该年是闰年,天数要加一
}
}
printf("这是这一年的第%d天", sum);
return 0;
}
4 运行结果
请输入年月日,格式为年月日,中间空格隔开:2019 4 17
这是这一年的第107天