三天打鱼两天晒网(c++文件输入输出)

中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。提高要求:1.输入数据的正确性验证。          2.使用文件进行数据测试。如将日期 20100101   20111...
摘要由CSDN通过智能技术生成

中国有句俗语叫“三天打鱼两天晒网”。某人从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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值