题目内容
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C/C++/java/python实现程序解决问题。
算法设计
- 输入要查询的年、月、日,中间用空格隔开。
- while语句判断输入日期的合法性。
- 计算从2010年1月1日开始至指定日期共有多少天。
3.1 judgeyear( )函数判断输入年份是否是闰年,二月为29天,平年为28天。如果年份能被4除尽,且不能被100除尽,或能被400除尽,则该年是闰年,否则不是闰年。
3.2 totaldays( )函数计算从2010年1月1日开始至指定日期的总天数。
a) 从2010年开始遍历,遍历到输入年份的前一年,若为闰年,总天数count加366,若为平年,总天数count加365。
b) 结合输入年份是否为闰年,将输入月份之前的天数加到总天数count。
c) 再将输入日期累加到总天数count。 - 由于“打鱼”和“晒网”的周期为5天,所以将计算出的总天数用5去除,得到余数,若余数为1、2、3,则当天打鱼,否则为晒网。
代码如下
#include <stdio.h>
struct date{ /*创建日期结构体*/
int year;
int month;
int day;
};
/*判断闰年函数*/
int judgeyear(int year)
{
if((year%4==0&&year%100!=0)||(year%400==0))
return 1; /*闰年*/
else
return 0; /*平年*/
}
/*计算天数函数*/
int totaldays(struct date days)
{
int nolp[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; /*平均每月的天数*/
int lp[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; /*lp为闰年,nolp为平年*/
int count=0,year,month; /*count表示总天数*/
for(year=2010;year<days.year;year++) /*年份遍历,计算count*/
{
if(judgeyear(year)) /*判断是否闰年*/
count=count+366; /*若为闰年,count累加366*/
else
count=count+365; /*若为平年,count累加365*/
}
for(month=1;month<=days.month;month++){ /*遍历月份*/
count=count+nolp[month-1]; /*若不是闰年*/
if(judgeyear(days.year))
count=count+lp[month-1]; /*若是闰年*/
}
count+=days.day; /*加上日期*/
return count;
}
int main()
{
struct date today;
int count;
printf("Enter year/month/day:\n"); /*输入年月日,中间用空格隔开*/
scanf("%d%d%d",&today.year,&today.month,&today.day); /*输入日期*/
while((today.year<2010)||(today.month<1||today.month>12)||
(today.month==2&&(today.year%4!=0||today.year%400!=0)&&today.day>=29)||today.day>31) /*判断输入日期的合法性*/
{
printf("输入错误,请重新输入:\n");
scanf("%d%d%d",&today.year,&today.month,&today.day);
}
count=totaldays(today); /*求出从2010 1 1到输入日期的总天数*/
printf("%d\n",count);
if(count%5>0&&count%5<4) /*判断是打鱼还是晒网*/
printf("fishing!\n");
else
printf("resting!\n");
return 0;
}
测试截屏
1.调试计算天数的部分,验证间隔天数是否正确
2. 日期合法性测试
3.结果测试