一、问题描述:
如果一个渔夫从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()是用来清除缓存区的数据流的。如果标示符没有改变那么即使清除了数据流也无法输入。所以两个要联合起来使用。并且锻炼了设计思路。