中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
设计方法与思路:
步骤一:建立时间类,里边分别有年、月、日,以及判断时间是否正确函数和计算总天数函数。
步骤二:写入类中的两个函数判断时间正确函数其中包括年份与2010的比较,各个月份输入时间与每月最大天数的比较、以及闰年2月天数的区分;计算总天数函数其中先将年份与2010的差值算出来,先不计其中的闰年,每年用365天计算,最终再次判断其中的闰年,给每个闰年加上一天,而最后一年的月份会最终加上。
步骤三:将天数除余,判断余数是否为1、2、3则为“打渔”,否则他是在“晒网”。
步骤四:将程序与两个TXT文件链接在一起,其中包括文件的读取,文件的写入,以及文件的关闭。
源程序:
#include<iostream>
#include<fstream>
using namespace std;
class Time
{
public:
int test();
int days();
int a;
int b;
int c;
};//时间类,包括年、月、日。
int Time::test ()
{
if(a<2010)
{printf("年份输入错误!");
return 0;}
if(b<0||b>12)
{printf("月份输入错误!");
return 0;}
int s[13]={0,31,28,31,30,31,30,31,31,30,31,30,31,};
for(int i=0;i<14;i++)
{if(a%4!=0&&b==i&&c>s[i]||c<1)
{printf("月份与对应天数不符!");
return 0;}
if(a%4==0&&b!=2&&b==i&&c>s[i]||c<1)
{printf("月份与对应天数不符!");
return 0;}
if(a%4==0&&b==2&&c>29||c<1)
{printf("月份与对应天数不符!");
return 0;}
}
return 1;
}//判断时间正确性的函数
int Time::days()//对时间的计算
{
int y,e;
int s[13]={0,31,28,31,30,31,30,31,31,30,31,30,31,};
if(a>2009&&(b>0&&b<13))
y=(a-2010)*365;//年数的统计,先忽略闰年
for(int i=0;i>b;i++)
y=y+s[i];//在最后一年的月份天数
for(e=0;e<14;e++)
{if(b==e&&c<s[e]+1) y=y+c;}//加上最后一个月的天数
int j;
j=(y-2)/4;
y=y+j;//有几个闰年,加上几个一
return (y);
}
void main ()
{int z,g;
Time t;
long x=0;
ofstream outfile("in.txt",ios::out);
cin>>x;
outfile<<x;
outfile.close();
int a=0,b=0,c=0;
a=x/10000;
b=(x-a*10000)/100;
c=x-a*10000-b*100;//分解年、月、日
t.a =a;
t.b=b;
t.c=c;
t.test ();//给类中的所有变量赋值
if(t.test()==1)
{g=t.days ();
ofstream out1file("out.txt",ios::out);
if(0<g%5&&g%5<4)
{out1file<<"这天他在打渔。" ; printf("这天他在打渔。");}//写入文件out.txt
else {printf("这天他在晒网。");out1file<<"这天他在晒网。" ; }//写入文件out.txt
}
else{
cin>>x;
outfile<<x;
outfile.close ();
a=x/10000;
b=(x-a*10000)/100;
c=x-a*10000-b*100;//分解年、月、日
t.a =a;
t.b=b;
t.c=c;
t.test ();
}//如果输入时间正确,就可以得出结论,如果时间错误需要重新输入
}
流程图:
程序代码已经解决的问题:
时间的准确判断、从20100101到所输入时间的整天数、天数的除5余数的判断、文件的导入与跟源程序的链接程序、
未解决的问题:
输入时间错误后,如何又接着进行判断,由于程序的包比较零散,这个问题还没有完全解决。