中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言实现程序解决问题。
思路提示:
根据题意可以将解题过程分为三步:
1)计算从2010年1月1日开始至指定日期共有多少天;
2)由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
3)根据余数判断他是在“打鱼”还是在“晒网”;
若余数为1,2,3,则他是在“打鱼”, 否则 是在“晒网”
在这三步中,关键是第一步。求从1990年1月1日至指定日期有多少天,要判断经历年份中是否有闰年,二月为29天,平年为28天。闰年的方法可以用伪语句描述如下:
如果 ((年能被4除尽 且 不能被100除尽)或 能被400除尽)
则 该年是闰年;
否则 不是闰年。
/*********三天打鱼两天晒网问题***********
//版本:v1.0
//创建时间:2017年3月10日
//主要功能:判断某人在输入日期那天是打鱼还是晒网
//************************************
#include <stdio.h>
void main()
{
int e;
printf("1.查询 2.退出\n");
scanf("%d",&e);
while(e==1)//循环
{
inty,m,d;//定义变量
int Total(int y,int m,int d);//函数声明
printf("请输入你要查询的年月日(如2010 1 1):");
scanf("%d%d%d",&y,&m,&d);//输入查询的年月日
int judge(inty,int m,int d);
if(judge(y,m,d)==1)
{
int x=(Total( y, m, d)%5);//x为总天数除以五取余
if(x<=3&&x>=1)//如果余数为1,2,3,则该天为打鱼,否则,该天为晒网
printf("%d年%d月%d日是打鱼\n",y,m,d);
else
printf("%d年%d月%d日是晒网\n",y,m,d);
printf("1.继续 2.退出\n");
scanf("%d",&e);
}
else
printf("请检查并输入正确的日期\n");
}
}
//求输入日期到2010年1月1日的总天数
int Total( int y,int m,int d)
{
inti,j,l,g,s;
l=0;
g=0;
int a[]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年每月天数
for(i=2010;i<y;i++)
{
if((i%4==0&&i%100!=0)||i%400==0)//判断是否为闰年
l=l+366;
else
l=l+365;
}//输入年份距2010年之间的总天数
for(j=0;j<m;j++)
{
if(((y%4==0&&y%100!=0)||y%400==0)&&m>2)//判断是否为闰年
g=g+a[j]+1;
else
g=g+a[j];
}//输入月份距输入年份第一天的总天数
s=l+g+d;//总天数
return (s);
}
//判断输入日期的正确性
int judge(int y,int m,int d)
{
if(y>=2010)//年份输入正确判断
{
if(((y%4==0&&y%100!=0)||y%400==0)&&m>2)//判断是否为闰年
{
if(m>0&&m<=12)//判断输入月份是否正确
{
if(m==2)//如果为闰年,判断是否为2月份
{
if(d>0&&d<=29)//2月份有29天
return 1;
else
return 0;
}
else
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)//闰年1,3,5,7,8,10,12月份为31天
{
if(d<=31&&d>0)
return1;
else
return0;
}
else
{
if(d<=30&&d>0)//其余月份为30天
return1;
else
return0;
}
}
}
else
return0;
}
else
{
if(m>0&&m<=12)
{
if(m==2)
{
if(d>0&&d<=28)//平年2月份有28天
return 1;
else
return 0;
}
else
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)//平年1,3,5,7,8,10,12月有31天
{
if(d>0&&d<=31)
return1;
else
return0;
}
else
{
if(d<=30&&d>0)//平年其他月份为30天
return1;
else
return0;
}
}
}
else
return 0;
}
}
else
return 0;
}