中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
算法思路:定义 year(年),month(月),day(日),passdays(总天数)date(接受文件里的数据)变量,打开两个文件等待读取和写入,判断in.txt文件中数据是否读完,若读完
则关闭文件并结束,否则将数据写入date变量,再通过取整取余等处理将20100101之类的数据转化成2010 01 01分别存入year month day 中以便判断,定义局部变量数组num,里面存入每月的日期,并且若判断出输入的年份是闰年,则将num[1](二月)的天数+1,然后判断是否输入错误,需要注意的是,日期判断时候,不能大于你所在月份的最大天数(即!day>num[month-1])然后通过for循环将输入日期与规定日期(20100101)相差多少天存入passdays(先判断年然后是月最后将日期累加),然后判断passdays除5取余为多少,为1、2、3则为打鱼,否则为晒网,将其写入out.txt文件,注意每次循环最后将passdays清零,否则除了第一个数据其他均为错误。
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int year;//年
int month;//月
int day;//日
int passdays=0;//经过的时间(总天数),用来除5取余
/* cout<<"请输入正确的年月日:"<<endl; //这个为手动输入 下面进行文件式
cin>>year>>month>>day;
*/
int date; //接受文件内的数值以便加工
ifstream fin("in.txt"); //打开文件 in.txt
ofstream fout;
fout.open("out.txt"); //打开文件 out.txt 准备输出
while(!fin.eof()) //循环,直到in.txt文件读取完成
{
/* 输入形式若为 2010 01 01 可以实现,20100101不行
*ifstream fin("in.txt");
*fin>>year;
*fin>>month;
*fin>>day;
*fin.close();
*/
fin>>date; //读取里面的数据输入到date里
year=date/10000;
month=(date%10000)/100;
day=date%100;
int num[12]={31,28,31,30,31,30,31,31,30,31,30,31};//将每个月的日期扔进数组(局部变量,避免多数据计算导致变量紊乱) 用途:在输入的年份中,不能以整年计算天数
if(year%400==0||(year%4==0 && year%100!=0)) //当输入的这一年满足闰年条件时,在二月基础加一天,中间年份使用年份判断计算天数
num[1]+=1;
if(year<2010)
{
cout<<"年份输入错误"<<endl;
exit(0);
}else if(month<1||month>12)
{
cout<<"月份输入错误" <<endl;
exit(0);
} else if(day<1||day>num[month-1]){
cout<<"日期输入错误"<<endl;
exit(0);
}
//普通年能被4整除且不能被100整除的为闰年.(如2004年就是闰年,1901年不是闰年)
//世纪年能被400整除的是闰年.(如2000年是闰年,1900年不是闰年)
for(int y=2010;y<year;y++) //判断输入年份是否为闰年
{
if(y%400==0||(y%4==0 && y%100!=0))
passdays+=366;
else
passdays+=365;
}
for(int y=0;y<month-1;y++) //计算从2010年1月1日到输入年份总共多少天
{
passdays+=num[y];
}
passdays+=day; //最后加上剩余的 日 天数
if(passdays%5==3||passdays%5==2||passdays%5==1)//用计算出的总天数除以5,求模
{
cout<<"他在打鱼"<<endl;
fout<<"他在打鱼"<<endl; //向文件里输出
}
else
{
cout<<"他在晒网"<<endl;
fout<<"他在晒网"<<endl; //向文件里输出
}
passdays=0; //将总天数清零,等待下一个数据的运算
}
fin.close(); //关闭in.txt文件
fout.close(); //关闭out.txt文件
return 0;
}