问题分析1:
因为有十二个月份,如果用if语句太过于复杂,可以使用 switch语句。在switch里面,进行一个简单的加法就可以计算出是几天了;当然我们必须考虑是否是润年,这里只要记得瑞年的判断语句,就比较简单,因为它们只相差一天,所以使用if语句就可以进行输出了,代码如下:
#include<stdio.h>
// 输入某年某月某日,判断这一天是这一年的第几天
int main()
{
int year,month,day,sum;
printf("请输入您想查询的年月日(使用英文逗号隔开):\n");
scanf("%d,%d,%d",&year,&month,&day);
if(month>12||day>31||month<0||day<0||year<0)
{
printf("您输入的日期不合法");
return 1;
}
switch(month)
{
case 1: sum=day; break;
case 2: sum=31+day; break; //29
case 3: sum=60+day; break;
case 4: sum=91+day; break;
case 5: sum=121+day;break;
case 6: sum=152+day;break;
case 7: sum=182+day;break;
case 8: sum=213+day;break;
case 9: sum=244+day;break;
case 10:sum=274+day;break;
case 11:sum=305+day;break;
case 12:sum=335+day;break;
default: printf("请输入正确的日期");break;
}
if(month<3)
{
printf("%d年%d月%d日是这年的第%d天",year,month,day,sum);
}
else if((year%4==0&&year%100!=0)||year%400==0) //是四的公倍数,但不是100的公倍数,或者是400的公倍数
{
printf("%d年%d月%d日是这年的第%d天",year,month,day,sum);
}
else
printf("%d年%d月%d日是这年的第%d天",year,month,day,sum-1);
return 0;
}
问题分析2:
有朋友在评论区指出代码有bug,因此我改进一下。增加了对输入不合法的日期判断:
1、4、6、9、11月每个月仅仅有30天,此时如果输入31天要报错;
2、二月最多29天,如果2月输入30、31天时要报错;
3、不是润年的2月输入了29天也要报错。
改进代码2:
#include<stdio.h>
// 输入某年某月某日,判断这一天是这一年的第几天
int main()
{
int year,month,day,sum;
printf("请输入您想查询的日期(年月日使用英文逗号隔开):\n");
scanf("%d,%d,%d",&year,&month,&day);
if(month>12||day>31||month<0||day<0||year<0)
{
printf("您输入的日期不合法");
return 0;
}
else if((month==4||month==6||month==9||month==11)&&day==31) // 4 6 9 11 月仅有 30天
{
printf("您输入的日期不合法");
return 0;
}
else if(month==2&&(day==30||day==31)) // 2月最多29天
{
printf("您输入的日期不合法");
return 0;
}
else if(!((year%4==0&&year%100!=0)||year%400==0)&&month==2&&day==29) //如果不是闰年 输入了 2月29号,报错
{
printf("您输入的日期不合法");
return 0;
}
switch(month)
{
case 1: sum=day; break;
case 2: sum=31+day; break; //29
case 3: sum=60+day; break;
case 4: sum=91+day; break;
case 5: sum=121+day;break;
case 6: sum=152+day;break;
case 7: sum=182+day;break;
case 8: sum=213+day;break;
case 9: sum=244+day;break;
case 10:sum=274+day;break;
case 11:sum=305+day;break;
case 12:sum=335+day;break;
default: printf("请输入正确的日期");break;
}
if(month<3)
{
printf("%d年%d月%d日是这年的第%d天",year,month,day,sum);
}
else if((year%4==0&&year%100!=0)||year%400==0) //是四的公倍数,但不是100的公倍数,或者是400的公倍数?
{
printf("%d年%d月%d日是这年的第%d天",year,month,day,sum);
}
else
printf("%d年%d月%d日是这年的第%d天",year,month,day,sum-1);
return 0;
}
若有写得不好的地方,请各位多多指教!