提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
二、问题分析
1.题目分析
- 先判断输入是否正确,若输入存在问题,重新输入。输入正确需要满足输入的年份不小于2010年,月份大于一不小于二,日期大于零但不大于该月份所对应的天数
- 定义一个判断平年还是闰年的函数(一般能被4整除的年份是闰年,不能被4整除的年份是平年。但是如果是世纪年(也就是整百年),就只有能被400整除才是闰年,否则就是平年。)
- 当输入正确后,定义计算天数的函数进行日期计算,计算输入日期距2010年有多少天。先对年份计算,在逐此对月份日期天数进行计算并且累加
- 将天数对5取余,若结果为0或者4的时候用输出函数输出晒网,反之输出打鱼;
2.流程图
三、运行结果
四、总结
经过几个小时的编写调试,总算是把这“渔夫的打鱼故事”给写好了,再一次让我对编程获得了宝贵的经验。其实这是一道非常简单的题目,但是却又很多细节需要考虑周全,尤其在每个函数的函数体中,对于闰年和平年的判断显得特别重要。在写完程序后,自己有个特别的想法,都是规定在2010年1月1日,但是如果我要渔夫开始打鱼晒网的日期自由设定,对程序应该做怎样的改动。这还需要我后面进行修改。通过这次学习,我对自己能提出的问题很开心,希望马上能解决这个问题。对于写程序,发现调试比编写更重要,调试会使得程序结构变得更加稳定,整体逻辑思路变得严谨。希望自己接下来能更加努力。
五、源代码
3.1需要声明的函数
bool isLeapyear(int a);//判断平年还是闰年
int calculatedata();//类内声明计算总天数的函数
void printisfish();//输出打鱼还是晒网
void scan();//输入函数
void isright();//判断输入是否正确
源程序
#include <fstream>
#include<iostream>
using namespace std;
//定义年月日
int Year;
int Month;
int Date;
int i=2010;
bool isLeapyear(int a);//判断平年还是闰年
int calculatedata();//类内声明计算总天数的函数
void printisfish();//输出打鱼还是晒网
void scan();//输入函数
void isright();//判断输入是否正确
int m[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//月份天数数组
bool isLeapyear(int Year)
{
if ((Year % 100 != 0 && Year % 4 == 0) || (Year % 100 == 0 && Year % 400 == 0))//年数为闰年的条件
{
m[2] = 29;//闰年2月29天
return true;
}
else
{
m[2] = 28; //平年2月28天
return false;
}
}
void isright()
{
if (isLeapyear(Year))
{
m[2] = 29;
}
else
{
m[2] = 28;
}
while ((Year < 2010 || Month>12 || Month < 1 || Date < 1 || (Date > m[Month])))//输入的年月日限定
{
cout << "输入错误,请重新输入;" << endl;
scan();
}
}
int calculatedata()
{
/*
1、计算天数首先应该计算年数之间的闰年和平年的年数
2、初始年和目的年应该要分别计算天数,并且注意这两年的月份大小
*/
//isright();
int days = 0;
int i;
for ( i = 2010; i < Year; i++)//先计算整年数*365/366
{
if (isLeapyear(i))
{
days += 366;//闰年366天
}
else
{
days += 365;//平年365天
}
}
isLeapyear(i);
for (int j = 1; j < Month; j++)//计算每月天数累加
{
days = days + m[j];
}
days += Date;
return days;
}
void printisfish()
{
int days = calculatedata();
cout <<"距离2010年1月1日有 "<< days<<"天"<<endl;
if (days % 5 == 0 || days % 5 == 4)
{
cout << "他在晒网" << endl;
}
else
{
cout << "他在打鱼" << endl;
}
}
void scan()
{
cout << "请输入正确日期:" << endl;
cin >> Year >> Month >> Date;
isright();
}
void test()
{
ofstream ofs;
ofs.open("Text.txt", ios::out);
ofs << "2020 1 2" << endl;
ofs << "1999 2 3" << endl;
ofs << "2010 2 29" << endl;
ofs << "2020 2 29" << endl;
ofs.close();
}
/*中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。*/
int main()
{
test();
scan();
//int a=isLeapyear( Year);
isright();
printisfish();
return 0;
}