Christ


私信TA

用户名:christ

访问量:5249

签 名:

等  级
排  名 2787
经  验 2149
参赛次数 0
文章发表 9
年  龄 19
在职情况 学生
学  校 四川师范大学
专  业

  自我简介:

先上代码,我们只需要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 人评分

  评论区

  • «
  • »