三天打鱼,两天晒网

三天打鱼,两天晒网

内容: 中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。我用C语言实现程序解决问题。

1.算法分析

(1).计算从某日期至开始时间2010.1.1共有多少天;
(2).由于“打鱼”和“晒网”的周期为5天,所以将计算出的天数用5去除;
(3).根据余数判断他是在“打鱼”还是在“晒网”,若余数为1,2,3,则他是在“打鱼”,否则 是在“晒网”。

2. 概要设计

流程图

2.代码

#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_tmp = 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_tmp += run_nian[j];
                days += days_tmp + day;
            }
        }
        else
        {
            if((year - i) != 0)    //判断是否为完整的一年
                days += 365;
            else
            {
                for(j = 0; j < month - MONTH; j++)
                    days_tmp += ping_nian[j];
                days += days_tmp + 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)   //大月天数是否合法
                    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)
                        break;
                    else
                    {
                        printf("不存在该日期,请重新输出:");
                        fflush(stdin);
                    }
                }
                else
                {
                    if(day >= 1 && day <= 28)
                        break;
                    else
                    {
                        printf("不存在该日期,请重新输出:");
                        fflush(stdin);
                    }
                }
            }
            else if(day >= 1 && day <= 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("这是第%d天\n", days);
    if((days % 5 == 4) || (days % 5 == 0))  //利用取余判断打鱼还是晒网
        printf("这一天晒网\n");
    else
        printf("这一天打鱼\n");
        
    return 0;
}

3. 测试及调试

(1).建立月份天数,闰年平年的天数并返回到2010.1.1的天数 在这里插入图片描述

(2).判断是否存在该天数在这里插入图片描述
在这里插入图片描述

(3).主函数(判断打鱼还是晒网)
在这里插入图片描述

(4).界面
在这里插入图片描述

(5). 输入平年的2月29日,不存在该日期
在这里插入图片描述

(6). 输入2010年之前的日期或者不存在该月份的日期
在这里插入图片描述

(7).打鱼天和晒网天
在这里插入图片描述在这里插入图片描述
(8).闰年的2月29日

4.心得体会

通过这个题目能够让自己理性且有序的完成作业,思路很重要,没有思路只打代码的话往往半途而废,做不下去,只有在之前把思路设计好,才能更好的完成任务。其次是也复习了大一学习的C语言知识,感觉对java提供了一点点的小看法,使得在学习路上更加轻松。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值