C语言编写程序计算某年某月某日是该年中的第几天

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

编写程序计算某年某月某日是该年中的第几天?

例如输入fool girl 的出生日期1999-5-27
输出147

这种程序在编写实现的时候很简单,我们只需要判别出我们需要特别注意的地方即可。比如闰年之类的。

注意:闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。并且闰年当中的2月有29天。

第1种 switch 语句代码实现

第一种方法是我们可以利用 switch ... case... 的特性,将都是 31 天的月份归到一类,都是 30 天的归位一类,特殊的归为一类,最后再判断出是否是闰年,天数加1即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
c复制代码    int year,month,day,sum=0,i;
scanf("%d-%d-%d",&year,&month,&day);
if(month==1) //如果是1月,直接输出day就行
printf("%d ",day);
else{
for(i=1;i<month;i++)
switch(i)
{
case 1:case 3:case 5:case 7:case 8:case 10:case 12:
sum+=31;
break;
case 4:case 6:case 9:case 11:
sum+=30;
break;
case 2:sum+=28;
}
sum+=day; //如果是闰年,3月之后的都需要+1
if(year%400==0||year%4==0&&year%100!=0&&month>2)
sum+=1;
printf("%d ",sum);
}

第2种(将之前的月天数直接给出)

第二种方法就是将第一种归类的月份分开,每个月每个月依次累加即可,最后再判断出是否是闰年,天数加1即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
c复制代码    int year, month, day,sum=0;
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+=day;
if(year%4==0&&year%100!=0||year%400==0&&month>2)
sum++;
printf("%d",sum);

第3种最简方法(纯属个人认为)

个人感觉第3种方法最简单,将所有天数存成一个数组,数组的下标就是当前月,只需要依次循环遍历数组即可。最后再判断出是否是闰年,天数加1即可。

1
2
3
4
5
6
7
8
9
10
11
c复制代码        int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},year,month,day,sum=0,i;
//数组下标和月份一一对应,内容为对应月份的天数
scanf("%d-%d-%d",&year,&month,&day);
if(year%400==0||year%4==0&&year%100!=0)
a[0]=day,a[2]=29;
else a[0]=day;
//将day存放到a[0]的位置,方便后续统计,如果是闰年,需要将2月份改为29天
for(i=0;i<month;i++)
sum+=a[i];
//因为a[0]存放的是day,所以就可以直接从a[0]遍历相加
printf("%d ",sum);

第3种运算实例

在这里插入图片描述

第3种扩展方法(总天数倒着减)

最后一种方法跟第三种方法相差不大,无聊的时候写的,还是将所有天数存成一个数组,数组的下标就是当前月,我们先判断是否是闰年,得出当年的总天数,然后只需要依次循环遍历数组递减即可。

1
2
3
4
5
6
7
c复制代码int year,month,day,sum=365,i,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
scanf("%d-%d-%d",&year,&month,&day);
if(year%400==0||year%4==0&&year%100!=0) //闰年366天
a[2]=29,sum=366; //因为是从a[12]开始,所以a[0]就用不到了
for(i=12;i>month;i--) //从12月份开始往前减
sum-=a[i];
printf("%d ",sum-a[month]+day); //天数减去该月的该天之后的天数

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%