代码如下
//输入年月日求是该年的第几天?并判断闰年,若是闰年返回1,不是则返回0
#include <stdio.h>
int LeapYear(int year);//判断是不是闰年的函数。函数原型声明
int main()
{
int year,month,day;
printf("请输入日期:\n");
while(1) //控制用户输入格式,输入的 月份和天数 正确才可继续,否则需要重新输入
{
scanf("%d,%d,%d",&year,&month,&day);
if(month<1 || month>12 || day<1 || day>31)
printf("输入日期错误!请您重新输入!\n");
else
break; //若正确,则跳出while循环,继续执行下面步骤
}
//下面数组中的0值得思考。
//可以这么想,如果用户输入2020,1,15。(假设用户输入正确)
//那么由于是1月份,所以用户输入的第三个数字 是 几 就是第几天
int array[]={
0,28,31,30,31,30,31,31,30,31,30,31};
int sum=0; //sum即为该年的"第多少天"
if(month==1)
sum=day;
else if(month==2)//若是2月份,"第多少天"应该再加上前边1月份的天数
sum=day+31;
else{
//若既不是1月份,也不是2月份,那么开始求是"第多少天"
for(int i=0;i<month;i++)
sum+=array[i];//比如:2018,3,23。那么即:array[0]+array[1]+array[2]=0+28+31。还应再 +23。最后=第82天
sum+=day;//因为下标是从0开始的,故应再添加上输入的天数(日子)
if(LeapYear(year)) //若是闰年,算出来的天数应该再加上1
sum++;
}
printf("该日期是第%d天\n",sum);
return 0;
}
int LeapYear(int year)
{
if((year%4==0 && year%100!=0) || (year%400==0))
{
return 1;
}
else
return 0;
}
测试
代码分析其实在注释中已经写的很清楚啦!
下面是几个测试输入及其输出结果。
这个例子亦即我在注释中所写的例子:
2018年不是闰年,故不需要+1。
下面再测试个闰年的例子:
显然,相较于上一个结果,这次测试中,由于2020年是闰年,那么在求3月份的某一天是这一年的第几天时,2月份是29天,所以最后结果应该是82+1=83。
接下来再测试一下用户错误输出的提示:
这是输入的月份不符的情况:
换个月份和年份再试试:
下面是天数不对的情况:
由于仅仅改动的输出语句,就不再放全部代码了,上面有啊!
printf("输入日期错误!请您重新输入:\n");
printf("该日期是%d年的第%d天\n",year,sum);
几个测试:
——————————————————————————————————
有一个小的bug,不知你发现没:
…所以说,也是输入判断的“锅”,哈哈!就留给读者再去完善吧!!!