三天打渔两天晒网(C++)

这篇博客介绍了一个C++程序,用于判断从2010年1月1日开始的某一天是'打鱼'还是'晒网'。程序首先验证输入的日期是否正确,然后计算到指定日期的总天数,基于5天一周期的规则确定当天活动。同时,作者提到程序有待改进的地方,如错误处理和文件输入输出功能的学习,并认识到编写注释的重要性。

题目

中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言/java/python实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
                   2.使用文件进行数据测试。如将日期 20100101   20111214  等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。


程序思路

1、首先输入数据(年、月、日),判断其是否有误,若year<2010 or month<1 or month>12 or day<1 or day>31,则输入数据有误,反之,则正确;

2、判断从指定年到输入的年间的每一年是平年还是闰年, 闰年的判断条件是可被4整除且不能被100整除或整百的年数必须可以被400整除,即((i%4==0)&&(i%100!=0))||(i%400==0));

3.计算从指定年到输入年份前的总天数,从指定年到输入的年间的某一年若为平年,则totaldays=totaldays+365;若为闰年,则totaldays=totaldays+366;

4、计算从1月到输入月份前的总天数,还需判断是平年还是闰年,若为平年,则二月份为28天;若为闰年,则二月份为29天;

5、计算从1日到输入日期的总天数,即totaldays=totaldays+day;

6、因为打渔晒网的周期是5天,将总天数%5,若余数为1、2、3,则该同学是在打鱼;若余数为0,4,则该同学是在晒网。


流程图

 

 

代码


//title:三天打鱼两天晒网
//author:Qiu
//time:2019/03/02

#include <iostream>
using namespace std;
class date
{  private:
      int year;
      int month;
      int day;
      int totaldays;
   public:
      input();
      judge();
      total();
};
//输入数据(年月日)
int date::input()
{   
      cout<<"请输入数据:"<<endl;
      cin>>year;
      cin>>month;
      cin>>day;

}
int date::judge()
{     
      if(year<2010)//判断输入的年份是否正确
      cout<<"wrong,请重新输入数据"<<endl;
      if((month<1)||(month>12))//判断输入的月份是否正确
      cout<<"wrong,请重新输入数据"<<endl;
      if((day<1)||(day>31))//判断输入的日期是否正确
      cout<<"wrong,请重新输入数据"<<endl;
	  
}
//计算总天数,并且判断该同学是打渔还是晒网
int date::total()
{    int i,totaldays=0;
     int pingnian[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//平年每一个月的天数
     int runnian[12] = {31,29,31,30,31,30,31,31,30,31,30,31};//闰年每一个月的天数
     for(i=2010;i<year;i++)
 {	 if(((i%4==0)&&(i%100!=0))||(i%400==0))//根据余数判断该年是平年还是闰年
         totaldays+=366;
     else
	 totaldays+=365;
 }
     for(i=1;i<month;i++)
	 {if(((i%4==0)&&(i%100!=0))||(i%400==0)) //根据余数判断该年是平年还是闰年
         totaldays+=runnian[i-1];
     else
	 totaldays+=pingnian[i-1];
 }
     totaldays+=day;
     cout<<totaldays<<endl;
     if(totaldays%5==1||totaldays%5==2||totaldays%5==3)//判断该同学是打鱼还是晒网
	    cout<<"该同学在打鱼"<<endl;
        
     else if(totaldays%5==0||totaldays%5==4)
	    cout<<"该同学在晒网"<<endl;
      
}
int main()
{    date d;
     d.input();
     d.judge();
     d.total();
     return 0;
}

 


 

 

心得

1、该程序还存在许多待完善的地方,例如输入错误的日期会判断出错误,但是还是会接着判断该同学是在打渔还是在晒网,这些地方希望自己能在以后慢慢改善;

2、昨天还看着书试着写了文件的输入与输出,结果以失败告终,希望自己能快点学会如何编写文件的输入与输出部分的代码;

3、以前写代码都懒得写注释,这次写了注释,突然发现写注释还是必要的,若是以后写更长的程序,注释可以帮助我们不忘记代码的作用;

4、学会了用visio画流程图。

 

 

 

 


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值