“三天打鱼两天晒网”
题目内容
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。
问题分析
(1)计算从2010年1月1日开始至指定日期共有多少天;
(2)“打鱼”和“晒网”的周期为5天,所以用计算出的总天数用5取余;
(3)根据余数判断他是在“打鱼”还是在“晒网”。
算法设计
(1)输入目的日期,并判断输入格式是否正确;
(2)根据输入年份判断是否为闰年;
(3)计算从2010年1月1日开始共有多少天;
(4)对总天数取余;
(5)判断余数在哪个范围内,0~3还是3~5;
(6)输出结果。
算法流程图
代码实现
创建一个时间类并定义时间、天数变量:
#include<iostream>
#include<fstream>
using namespace std;
class Time { //创建一个时间类
private:
int year;
int month;
int day;
int num;
public:
Time() {
year = 0;
month = 0;
day = 0;
num = 0;
}
Time(int y, int m, int d) {
year = y;
month = m;
day = d;
}
构造计算总天数的函数,对for循环和if条件句嵌套使用:
void totalday() {
//平均每月的天数
int monthnumber[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
for (int i = 2010; i <= year; i++) { //计算距离2010年1月1日的总天数
if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) { //判断是否为闰年
if (i != year) { //判断i是否达到输入年份,如果到了,则月数需按输入月份计算天数
for (int j = 0; j <= 12; j++) {
num += monthnumber[1][j]; //取二维数组中闰年的天数总和
}
} else {
for (int j = 0; j <= month - 1; j++) {
num += monthnumber[1][j];
}
num = num + day;
}
} else {
if (i != year) {
for (int j = 0; j <= 12; j++) {
num += monthnumber[0][j]; //取二维数组中非闰年的天数总和
}
} else {
for (int j = 0; j <= month - 1; j++) {
num += monthnumber[0][j];
}
num = num + day;
}
}
}
}
再构造一个取余函数,并在其中进行结果输出,输出结果存放在out.txt文件中
void judge() {
cout << "从2010年1月1日开始共 " << num << " 天" << endl; //输出总天数
int temp;
temp = num % 5; //给总天数取余
ofstream outtxt("out.txt"); //创建并打开out.txt文件
if (temp > 0 && temp < 4) {
outtxt << "他在打渔!"; //将结果输入至out.txt文件中
} else {
outtxt << "他在晒网!";
}
outtxt.close();
}
主函数内进行输入,将输入日期保存至in.txt文件中,然后调用函数:
int main() {
int a, b, c;
ofstream intxt("in.txt"); //创建并打开in.txt文件
cout << "请输入年月日:" << endl;
cin >> a >> b >> c; //输入需要查询的日期
while (a < 2010 || b < 0 || b > 12 || c < 0 || c > 31) { //判断输入日期是否格式正确
cout << "输入日期错误!请重新输入:";
cin >> a >> b >> c;
}
intxt << a << "年" << b << "月" << c << "日"; //将输入日期保存至in.txt文件中
intxt.close();
Time s(a, b, c); //创建对象
s.totalday();
s.judge();
return 0;
}
测试结果
输入2021年3月2日进行测试:
in.txt文件中的内容:
out.txt文件中的内容:
心得体会
在这次程序设计过程中,大体上没有什么大的问题,主要遇到的问题就是怎样计算总天数,这个问题经过研究范例代码后,使用二维数组存储闰年与非闰年总天数,再使用for循环嵌套使用加上if条件语句分离闰年的总天数计算,最终得以解决总天数问题。其次对于ofstream的使用还不够熟练,不能对文件进行合理的利用,还需要多加以学习,完善这方面的漏洞。