三天打鱼两天晒网 C++实现

一、问题描述:

如果一个渔夫从2010年1月1日开始每三天打一次鱼,两天晒一次网,编程实现当输入2010年1月1日以后的任意一天,输出该渔夫是在打鱼还是在晒网。

二、问题分析与设计:

1、判断输入的年月日格式是否正确,当错误时给出提示并重新输入;
2、定义一函数判断输入年份是闰年还是平年;
3、定义一函数计算输入日期到2010年1月1日共有多少天;
4、输出函数当天该渔夫是打鱼还是在晒网。
关键:
1、算出输入日期到2010年1月1日共有多少天,先判断年份,这之间有多少个闰年就加多少366天,有多少平年就加多少365天。再判断月份,2个数组分别表示出闰年月与平年月,若输入润年,月份为month累加前month-1个月份的天数;若输入平年,月份为month累加前month-1个月份的天数。
2、距2010年1月1日的天数,5天一循环,则除以5判断余数。

三、流程图

四、完整代码

/********Three days fishing, two days surfing.***************************
*Description:Enter one day after 2010/1/1to determine whether the day * 
*is fishing or surfing                                                *
*Author:Hua                                                 *
*Date:2019/2/27                                                     **
***********************************************************************/
#include<iostream>
#include<fstream>
using namespace std;
class Date
{
public:
	int year;
	int month;
	int day;
    int set_date();                                  // 输入日期
	int judge(int year);                             // 判断闰、平年
	int num_days();                                  // 计算输入日期到2010年1月1日有多少天 
	void result();                                   // 结果为打鱼还是晒网
};
int Date::set_date(void)
{
	cout<<"输入完整日期(2010年1月1日之后)::"<<endl;
	cin>>year>>month>>day;
	if(year<2010||month<1||month>12||day<1||day>31)
	{	
	cout<<" 请输入正确的日期: "<<endl;
	cin.clear ();                                    //清除错误标记,重新打开输入流
	cin.sync ();
	cout<<"请重新输入:"<<endl;
	cin>>year>>month>>day;
	}
	return 0;
}
int Date::judge(int year)
{
	int temp;                                                 //定义一临时变量
	if(year%4==0 && year%100!=0||year%400==0)
		temp=1;                                               //闰年
	else 
		temp=0;                                               //平年
	return temp;
}
int Date::num_days ()
{
	int sum=0,i,j;                                              //i 月、j 年,初始2010 
	int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};            //平年每个月的天数
	int b[12]={31,29,31,30,31,30,31,31,30,31,30,31};            //闰年每个月的天数
	if(judge(year)==1)
		for(i=0;i<month-1;i++)                                  
			sum=sum+b[i];                                     //是闰年,累加前month-1个月份的天数
		else
			for(i=0;i<month-1;i++)
				sum=sum+a[i];                                //是平年,累加前month-1个月份的天数
			for(j=2010;j<year;j++)
				if(judge(j)==1)
					sum=sum+365;                            //2010年到输入年是平年累加365天
				else
					sum=sum+366;                            //2010年到输入年是闰年累加366天
				sum=sum+day;
				return sum;                                 //距规定日期总天数
}
void Date::result()
{
	int num=num_days();
	int n;
	n=num%5;                                                //五天一循环,则除以五取余
	if(n==1||n==2||n==3)
	{
		cout<<"今天打鱼";

	}
	else
	{
		cout<<"今天晒网";
	}
	
}
int main()
{
	Date date;
	date.set_date();
	date.num_days();
	date.result();
	return 0;
}

五、正确性测试

1、若输入年份小于2010年;

2、输入年份大于2010年而月份大于12;

3、输入年份大于2010年而某天大于31;

4、输入格式正确。

五、总结:
通过本次作业,新学习到了一些方法、知识:当输入错误数据时,程序还要重新输入继续执行,可以借助cin.clear(),与cin.sync()。cin.clear()是用来更改cin的状态标示符的。cin.sync()是用来清除缓存区的数据流的。如果标示符没有改变那么即使清除了数据流也无法输入。所以两个要联合起来使用。并且锻炼了设计思路。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值