/******************************/
文件名称:三天打鱼两天晒网
编程语言:C++
编译器:Visual C++ 6.0
完成日期:2019年02月28日
作者:无奈¬_¬`啊
一.问题
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
此处我是用C++实现的。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
二.思考
首先三天打鱼两天晒网,周期为5天,所以只要计算出指定日期到2010年01月01日有多少天,并用这个天数除以5求余数,如果余数是0或者4则说明他在晒网,余数为1,2,3则在打渔,这个不难想象。
接下来我们的主要任务就是求天数,这也是这个问题的核心部分,因为每年的天数不一样,闰年366天,平年365天,所以必须区分好闰年和平年。
可以被4整除而且不被100整除的或者能被400整除的就是闰年,否则是平年。用代码表示则如下:
if(x%4==0&&x%100!=0||x%400==0) temp=1;
else temp=0;
temp是1表示闰年,0表示平年。
闰年比平年多一天,这个多出来的一天就是2月里28天或者29天,闰年2月有29天。所以在判断日期的正确性的时候需要注意。
if(temp==0)
{
if(z>28)
{
cout<<"平年2月只有28天!";
exit(0);
}
}
继续求天数,我们先求出2010年到指定年前一年的天数,然后在细算到月份日份。
年份的不同就代表着闰年和平年,所以就麻烦了,你得先判断这段时期之间每一年的年份,然后再决定加多少天。
for(int i=2010; i<x; i++)
{
if(temp) t+=366;
else t+=365;
}
x为指定年份;
计算好年份后我们就需要计算月份日份了,计算到指定月份的天数加上指定的日份·,就计算出总天数了;
然而又存在大月小月所以加的天数也不同:
switch(y)
{
case 1:
t+=z;
break;
case 2:
t=t+31+z;
break;
case 3:
{
if(temp==1) t=t+60+z;
else t=t+59+z;
}
break;
case 4:
{
if(temp==1) t=t+91+z;
else t=t+90+z;
}
break;
case 5:
{
if(temp==1) t=t+121+z;
else t=t+120+z;
}
break;
case 6:
{
if(temp==1) t=t+152+z;
else t=t+151+z;
}