先上代码,我们只需要20行
#include<stdio.h> int main() { int day = 0, i; int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//将月份对应天数设置为平年的模式 struct date { int y; int m; int d; }date1; scanf("%d %d %d", &date1.y, &date1.m, &date1.d); for (i = 0; i < date1.m - 1; i++) day += a[i];//在不考虑闰年平年的情况下计算天数 if (((date1.y % 4 == 0 && date1.y % 100 != 0) || (date1.y % 400 == 0)) && (date1.m > 2)) printf("%d\n", day + date1.d + 1);//如果是闰年,并且月份在2月以后(很重要的细节),就加1天 else printf("%d\n", day + date1.d); return 0; }
解题思路:
这道题主要是想考结构体,但很多同学是卡在了闰年平年的问题上,所以我们先把闰年平年的问题讲了
一、闰年平年
1.计算一个日期是这一年的第几天,就是前几个月份的天数 + 这个月的号数,很容易想到用数组来定义每月的天数。
2.要考虑闰年和平年,二者的唯一区别就是2月份,所以我们有以下思路:
如果是闰年,2月就多一天;但是我们不用去改变2月的天数,直接对最终结果 + 1就行了。
但是!这只能用在「月份大于2月」的闰年的计算中,所以我们的判断标准还要加上月份大于2。
月份小于等于2月的闰年日期,和平年其实是一回事,所以可以把它归入平年的情况。
有同学可能会问,那 2000 2 29 呢?实际上,其结果是31 + 29,也就是第60天,没有问题的。
3.补充一下闰年平年的知识
公历闰年判定遵循的规律为: 四年一闰,百年不闰,四百年再闰.
公历闰年的简单计算方法(符合以下条件之一的年份即为闰年,反之则是平年)
1.能被4整除而不能被100整除。
2.能被100整除也能被400整除。
所以判断标准是 (y % 4 ==0 && y % 100 != 0 || y % 100 ==0 && y % 400 ==0)
能被400整除的数也能被100整除
可优化为 ((y % 4 ==0 && y % 100 != 0) || ( y % 400 ==0))
二、结构体
1.一般形式
struct 结构名
{
成员表列
}变量名表列;
2.输入 || 赋值
采用 变量名.成员 的方式(具体看程序,一目了然)
注意事项:
1.数组中a[0]是一月份,a[1]是二月份,以此类推
参考代码:
#include<stdio.h> int main() { int day = 0, i; int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };//将月份对应天数设置为平年的模式 struct date { int y; int m; int d; }date1; scanf("%d %d %d", &date1.y, &date1.m, &date1.d); for (i = 0; i < date1.m - 1; i++) day += a[i];//在不考虑闰年平年的情况下计算天数 if (((date1.y % 4 == 0 && date1.y % 100 != 0) || (date1.y % 400 == 0)) && (date1.m > 2)) printf("%d\n", day + date1.d + 1);//如果是闰年,并且月份在2月以后(很重要的细节),就加1天 else printf("%d\n", day + date1.d); return 0; }
0.0分
1 人评分