C语言实现:三天打鱼两天晒网

题目:

中国有句俗语:“三天打鱼两天晒网”,某人从1990年1月1日起开始“三天打鱼两天晒网”。问这个人在以后的某一天是在“打鱼”还是在“晒网”?

思路:

  1. 首先求出从1990年1月1日到指定日期之间经过的天数;
  2. 经分析,打鱼晒网是5天一轮回,所以用天数对5取余来判断打鱼还是晒网。

具体解释:

  • 观察发现,打鱼晒网是5天一个轮回,前三天打鱼,后两天晒网
  • 由此可以利用经过的总天数对5取余的方式来判断打鱼还是晒网;
  • 经分析:取余结果为1、2、3时打鱼,结果为0或4时为晒网
  • 因此需要求出指定的某一天到1990年1月1日期间共有多少天;
  • 平年闰年分情况讨论,能被4整除但不能被100整除能被400整除的年份为闰年,有366天,其余为平年,为365天;
  • 求天数时将整年和非整年单独处理:整年直接天数增加366或365;非整年则根据月数以及日期利用循环来求出具体天数;
  • 将平年闰年两种年的每月天数分别存储进数组,用来解决不是整年的剩余天数;
  • 最后根据之前的分析,取余求出结果。

注:还应当对用户输入的日期进行合法判断,例如平年2月没29号、4月没31号等。

代码:

#include 
#include 
#define YEAR 1990   //宏定义初始年月日
#define MONTH 1
#define DAY 1
/*
        三天打鱼两天晒网
题目:
    中国有句俗语:“三天打鱼两天晒网”,
    某人从1990年1月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输入一个1990年包括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("这一天晒网");
    else
        printf("这一天打鱼");
        
    return 0;
}

运行结果:

  • 测试3组数据:
    1、1990年1月3日——打鱼;
    2、1990年1月4日——晒网;
    3、2018年11月11日——打鱼。(先输入非法日期进行数据录入判断测试)

C语言实现:三天打鱼两天晒网_第1张图片
C语言实现:三天打鱼两天晒网_第2张图片
C语言实现:三天打鱼两天晒网_第3张图片
**

  • 程序练习,仅为一种思路,若有错误请指出。

**

你可能感兴趣的:(C)