一、题目名称:“三天打鱼两天晒网
二、题目内容:中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
三、算法设计:
1.输入当前日期的年、月、日。
2.检验当前日期是否合法。
3.从2010年开始累加计算天数
3.1若当前年份小于输入年份
3.1.1若当前年份为闰年,则在daylist[1][i]将每月的天数累加
3.1.2若当前年份不是闰年,则在daylist[0][i]中将每月的天数相
4.再加上输入日期年份的总天数
5.将总天数对5取模,得到余数
6.若余数为1、2、3时,则当天打鱼,否则为晒网。
图 1 主函数算法流程图
图 2 days()函数算法流程图
四、测试结果:
输出结果正常。
源代码:
#include<stdio.h>
typedef struct date{ //定义日期的结构体
int year;
int month;
int day;
}Date;
int days(Date day) //计算输入对象的该年的天数
{
int daylist[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31,}, //平均每月的天数
{0,31,29,31,30,31,30,31,31,30,31,30,31,}};
int i,lp;
lp=day.year%4==0&&day.year%100!=0||day.year%400==0;//判定year为闰年还是平年,lp=0为平年,非0为闰年
for(i=1;i<day.month;i++) //计算本年中自1月1日起的天数
day.day+=daylist[lp][i];
return day.day;
}
void main()
{
Date today,temp;
int allday,year,day;
loop:printf("请输入日期,中间用空格隔开(如2010 1 1):");
scanf("%d %d %d",&today.year,&today.month,&today.day); //输入日期
if(today.year>=2010&&today.month<13&&today.day<32 )//判断日期是否合法
{
if(today.month>0&&today.day>0)
{
temp.month=12; //设置变量的初始值
temp.day=31;
for(allday=0,year=2010;year<today.year;year++)
{
temp.year=year;
allday+=days(temp); //计算从2010年至指定年共有多少天
}
allday+=days(today); //加上指定年中到指定日期的天数
day=allday%5; //求余数进行判断
if(day>0&&day<4)
printf("他今天打渔!\n"); //输出结果
else
printf("他今天晒网!\n");
}
}
else
{
printf("\n输入错误,请输入合法的日期!\n");
goto loop;
}
}
六、总结1. 在检测日期合法性的时候出现了一些问题,开始我使用if(today.year>=2010&&0<=today.month<13&&0<=today.day<32 )判断日期的合法性,但我发现它判断只要today.year合法,即使today.month和today.day不合法也会输出结果,并不弹出错误信息。如下图:
然后我用if 语句分两次判断解决了这个问题。if(today.year>=2010&&today.month<13&&today.day<32 )if(today.month>0&&today.day>0)
2. 一开始我想在输出错误信息的时候继续运行程序,想用goto语句跳转到开始的输入语句但这样做了以后发现程序进入了死循环,最后把程序整体检查了一遍,然后就好了。