## 三天打鱼两天晒网问题

三天打鱼两天晒网问题(文末有源代码)

1.题目要求:
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用C或C++语言实现程序解决问题。
基本要求:1.程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求:1.输入数据的正确性验证。
2.使用文件进行数据测试。如将日期 20100101 20111214 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
2.算法分析
这个题目首先应该求出从2010年1月1日到指定日期之间经过的总天数,打鱼晒网是5天一轮回,所以用天数对5取余可以来判断打鱼还是晒网。
1)首先应该计算指定日期到2010年1月1日相差的天数;其中要对平年和润年的天数进行判断分析,从而得出总天数。
2)再将计算出的天数用5去除,根据余数判断他是在“打鱼”还是在“晒网”
3)若余数为1,2,3,则他是在“打鱼”余数结果为0或4时为晒网。

3.概要设计(包括数据结构及算法绘制流程图或伪代码表示)
计算总天数的代码如下:
for(i = YEAR; i <= year; i++) //遍历每一年
{
if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) //判断是否为闰年
{
if((year - i) != 0) //判断是否为完整的一年
days += 366;
else
{
for(j = 0; j < month - MONTH; j++)
days_yue += run_nian[j];
days += days_yue + day;
}
}
else
{
if((year - i) != 0) //判断是否为完整的一年
days += 365;
else
{
for(j = 0; j < month - MONTH; j++)
days_yue += ping_nian[j];
days += days_yue + day;

流程图如下:
在这里插入图片描述
4.测试(设计测试用例或测试代码的设计与实现,测试结果截屏)
图4-1程序运行总界面
在这里插入图片描述
图 4-2年份日期判断
在这里插入图片描述
图4-3测试数据
在这里插入图片描述
在这里插入图片描述
5.调试(对测试出的问题进行调试,界面截屏,调试修正编码)

判断闰年,平年每月天数是否合法时的判断代码出现了错误,经过修改,最终可以运行,代码如下:
while(1) //录入数据并判断是否合法
{
scanf("%d,%d,%d", &year, &month, &day);
if(year >= YEAR && month >= 1 && month <= 12) //判断年月
{
if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12)
{
if(day >= 1 && day <= 31) //大月天数31天判定是否合法
break;
else
{
printf(“输入有误,请重新输入:”);
fflush(stdin); //清空缓存区
}
}
else if(month == 2) //2月天数是否合法
{
if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) //判断为闰年
{
if(day >= 1 && day <= 29) //判断为闰年 29天
break;
else
{
printf(“输入有误,请重新输入:”);
fflush(stdin); //清空缓存区
}
}
else
{
if(day >= 1 && day <= 28) //判断为平年,二月28天
break;
else
{
printf(“输入有误,请重新输入:”);
fflush(stdin);
}
}
}
else if(day >= 1 && day <= 30) //小月30天判断天数是否合法
break;
else
{
printf(“输入有误,请重新输入:”);
fflush(stdin);
}
}
else
{
printf(“输入有误,请重新输入:”);
fflush(stdin);
}
}
days = Days(year, month, day); //调用要求的天数的函数

return days;    //返回天数

}

6.心得体会(关键问题的解决思路及步骤总结)
本题的设计过程中,我又重新复习学习了一遍C语言的相关知识点,本题中关键的部分是循环中总天数的计算,即从2010.1.1以后这个人到底过了多少天,今天是该打鱼还是晒网,其次就是要搞清楚平年,闰年的区别,按月份进行区分,大月份小月份,分别计算可以会思路比较清晰一点,在这个过程学习到了很多。希望以后可以用java,pathon实现这个功能。
源代码:

#include <stdio.h>
#include <stdlib.h>
#define YEAR 2010   //用宏定义来定义初始的年月日
#define MONTH 1
#define DAY 1
int Input();
int Days(int, int, int);    //求期间的天数,参数为年月日
//定义 变量年 月  日 
int Days(int year, int month, int day)
{
    int days = 0;   //期间共有多少天
    int days_yue = 0;   //这个是不满一年的整月的天数
    int ping_nian[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int run_nian[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int i = 0;
    int j = 0;
    for(i = YEAR; i <= year; i++)   //遍历每一年
    {
        if((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0))  //判断是否为闰年
        {
            if((year - i) != 0)    //判断是否为完整的一年
                days += 366;
            else
            {
                for(j = 0; j < month - MONTH; j++)
                    days_yue += run_nian[j];
                days += days_yue + day;
            }
        }
        else
        {
            if((year - i) != 0)    //判断是否为完整的一年
                days += 365;
            else
            {
                for(j = 0; j < month - MONTH; j++)
                    days_yue += ping_nian[j];
                days += days_yue + day;
            }
        }
    }
    
    return days;
}

int Input()
{
    int days = 0,   //从始至终的总天数
        year = 0,
        month = 0,
        day = 0;
    int num = 0;
    printf("\t请输入一个2010年1月1日之后的日期\n\n");
    printf("请输入年月日(用逗号隔开):");
    while(1)    //录入数据并判断是否合法
    {
        scanf("%d,%d,%d", &year, &month, &day);  
        if(year >= YEAR && month >= 1 && month <= 12)   //判断年月
        {
            if(month == 1||month == 3||month == 5||month == 7||month == 8||month == 10||month == 12)
            {
                if(day >= 1 && day <= 31)   //大月天数31天判定是否合法
                    break;
                else
                {
                    printf("输入有误,请重新输入:");
                    fflush(stdin);  //清空缓存区
                }
            }
            else if(month == 2)     //2月天数是否合法
            {
                if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))  //判断为闰年
                {
                    if(day >= 1 && day <= 29)  //判断为闰年 29天 
                        break;
                    else
                    {
                        printf("输入有误,请重新输入:");
                        fflush(stdin);   //清空缓存区
                    }
                }
                else
                {
                    if(day >= 1 && day <= 28) //判断为平年,二月28天 
                        break;
                    else
                    {
                        printf("输入有误,请重新输入:");
                        fflush(stdin);
                    }
                }
            }
            else if(day >= 1 && day <= 30)  //小月30天判断天数是否合法
                break;
            else
            {
                printf("输入有误,请重新输入:");
                fflush(stdin);
            }
        }
        else
        {
            printf("输入有误,请重新输入:");
            fflush(stdin);
        }
    }
    days = Days(year, month, day);  //调用要求的天数的函数
    
    return days;    //返回天数
}

int main()
{
    int days = 0;   //这个是总天数
    days = Input();  //调用函数
    printf("这是从2010年1月1日之后的第%d天\n", days);
    if((days % 5 == 4) || (days % 5 == 0))  //利用取余判断打鱼还是晒网
        printf("这一天这个人在晒网");
    else
        printf("这一天这个人在打鱼");
        
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值