三天打鱼两天晒网问题
一、问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天是“打鱼”还是“晒网”。
二、问题分析和算法分析
1、输入一个年月日,判断输入的年月日是否符合实际。如果输入符合要求,计算从2010年1月1日到所输入日期的总天数。
总天数的算法:首先计算从2010到所输入年份的所有年的天数之和,(年能被除尽且不能被100除尽或者年能被400除尽是闰年)闰年366天,平年365天;再算所有整月的天数之和;最后将整年天数加上整月天数加上输入的天数之和就是总天数。
2、“三天打鱼两天晒网”,一个周期是5天,将总天数除以5取余数。
3、根据余数判断是“打鱼”还是“晒网”,如果余数是1或2或3,则是打鱼,余数是0或4则是晒网。
三、流程图
四、源代码
/*中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,
问这个人在以后的某一天是“打鱼”还是“晒网”。*/
#include<stdio.h>
int main()
{
int year,month,day,sum,sum1,sum2,leap;
int f_year(int y); //定义一个计算整年的天数和的函数
int f_month(int m); //定义一个计算整月的天数和的函数
printf("请输入年月日:");
scanf("%d%d%d",&year,&month,&day); //输入想要查询的年月日
if((year%4==0&&year%100!=0)||(year%400==0)) //判断输入年份是否是闰年
leap=1;
else
leap=0;
if((year<2010)||(month<0&&month>12)||(day<0&&day>31)) //判断输入的日期是否符合常理
{
printf("输入的年月日不符合要求!");
}
else
{
f_year(year); //调用函数
f_month(month);
sum=sum1+sum2+day;
}
if(sum%5==0||sum%5==4) //天数总和除以5求余数,余数为0或4则这天晒网,否则这天打鱼
{
printf("%d-%d-%d晒网!\n",year,month,day);
}
else
{
printf("%d-%d-%d打鱼!\n",year,month,day);
}
}
int f_year(int y)
{
int i;
int sum1=0;
for(i=2010;i<y;i++)
{
if((y%4==0&&y%100!=0)||(y%400==0))
{
sum1+=366;
}
else
sum1+=365;
}
return(sum1);
}
int f_month(int m)
{
int i,leap,sum2=0;
int x[12]={31,28,31,30,31,30,31,31,30,31,30,31};
for(i=0;i<m;i++)
{
sum2+=x[i];
}
if(m>=2)
sum2+=leap;
return(sum2);
}
五、程序运行结果测试
以上三张运行结果的截图中,图1输入时年月日之间连在一起输入,没有运行结果;图2输入时年月日用空格隔开,运行结果正确;图3输入时年月日用逗号隔开,运行给出的结果不符合预期,则判断此种年份输入方式不可取。
六、总结
在此次作业中,我遇到的难题是如何计算给定日期到输入日期之间的总天数,这其中需要考虑是否有闰年以及如果输入年份那年时闰年,需要判断月份大于二月或是小于二月,我利用if和switch语句的联合使用解决了这一问题。程序完成之后,需要调试程序,其中需要检测给定年份到输入年份之间的总天数计算是否正确,我在本次作业中没有解决这一个问题,下去之后我会继续研究。