“三天打鱼,两天晒网!”问题用C++语言实现程序解决问题。

“三天打鱼两天晒网”

题目内容

中国有句俗语叫“三天打鱼两天晒网”。某人从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的使用还不够熟练,不能对文件进行合理的利用,还需要多加以学习,完善这方面的漏洞。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值