此题目难度不大,主要难度在于所给日期闰年判定以及经过的年份中闰年的个数问题,
对于输入日期的中日正确性判断,只需建立对应月份天数的数组即可判断。求出所给年份到初始年份经过的天数后对五取余判定是否大于三即可求出结果。
代码如下:
/*中国有句俗语叫“三天打鱼两天晒网”。
某人从2010年1月1日起开始“三天打鱼两天晒网”,
问这个人在以后的某一天中是“打鱼”还是“晒网”。*/
#include<iostream>
#include<fstream>
using namespace std;
class Date
{
private:
int year, month, day;
public:
Date(int x, int y, int z);
int fun(Date &A);
};
Date::Date(int x, int y, int z)
{
year = x;
month = y;
day = z;
}
int Date::fun(Date &A)
{
int thenumber = 0; //在所给年份到初始年份的天数
int psnd = 0;
int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
if (((this->year % 4 == 0 && this->year % 100 != 0) || this->year % 400 == 0))
// 校正闰年2月份天数
{
days[2] ++;
}
if (this->year < 2010) //判断年输入正确性
{
cerr << "年份不得小于2010!" << endl; return 0;
}
else if (this->month < 0 || this->month > 12) //判断月输入正确性
{
cerr << "月份输出有误" << endl; return 0;
}
else if (this->day > days[this->month]) //判断日输入正确性
{
cerr << "日输入有误" << endl; return 0;
}
else //计算从输入日期到初始日期的天数
{
for (int i = 2010; i < this->year; i++) //在所给年份到初始年份中闰年的个数
{
if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0)
psnd++;
}
thenumber = (this->year - A.year) * 365 + psnd;
for (int i = 0; i < this->month; i++)
{
thenumber += days[i];
}
thenumber += this->day + 1;
return thenumber;
}
}
int main()
{
int judge, flag;
int Innumber; //输入数据
int Fnumber; //测试数据
int cyear, cmonth, cday;
Date First(2010, 1, 1); // 初始年月日
cout << "请选择输入方式:" << endl << "1、手动输入方式" << endl << "2、文件输入方式:";
cin >> flag;
if (flag == 1)
{
cout << "please input a date:";
cin >> Innumber;
cyear = Innumber / 10000; //分离年
cmonth = Innumber % 10000 / 100; //分离月
cday = Innumber % 100; //分离日
Date InputNum(cyear, cmonth, cday);
if (InputNum.fun(First))
{
judge = InputNum.fun(First) % 5;
if (judge > 3) //判断该天进行的活动
cout << " 今天晒网。" << endl;
else
cout << " 今天打鱼。" << endl;
}
}
else if (flag == 2)
{
ifstream infile("in.txt", ios::in);
infile >> Fnumber >> Innumber; //从文件中读取数据
cout << "文件输入日期为:" << Innumber << endl << "开始活动日期(初始日期)为:" << Fnumber << endl;
infile.close();
cyear = Innumber / 10000; //分离年
cmonth = Innumber % 10000 / 100; //分离月
cday = Innumber % 100; //分离日
Date InputNum(cyear, cmonth, cday);
if (InputNum.fun(First))
{
judge = InputNum.fun(First) % 5;
ofstream outfile("out.txt", ios::out);
if (judge > 3) //判断该天进行的活动
outfile << Innumber << " 该天晒网";
else
outfile << Innumber << " 该天打鱼";
outfile.close();
}
}
else
cerr << "序号有误!" << endl;
return 0;
}