如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔,两天晒一次网,编程实现当输入 2011 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网。

实现过程:
(1) 自定义函数 leap(),用来判断输入的年份是否是闰年。

(2) 自定义函数 number(),用来计算输入日期距 2011 年 1 月 1 日共有多少天。

(3) main() 函数作为程序的入口函数,在 main() 函数中调用上面两个函数。程序代码如下:

#include <stdio.h>

int leap(int a) {   //自定义函数leap()用来指定输入的年份是否为闰年
    if (a % 4 == 0 && a % 100 != 0 || a % 400 == 0)    //闰年判定条件
        return 1;   //是闰年返回1
    else
        return 0;   //不是闰年返回O
}

int number(int year, int month, int day) {    //自定义函数 number() 计算输入日期距2011年1月1日共有多少天
    int sum = 0, i, j, k;
    int a[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};    //数组a存放平年每月的天数
    int b[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};    //数组b存放闰年每月的天数
    if (leap(year) == 1) {    //判断是否为闰年
        for (i = 0; i < month - 1; ++i)
            sum += b[i];    //是闰年,累加数组b前m-1个月份的天数
    } else {
        for (i = 0; i < month - 1; ++i)
            sum += a[i];    //不是闰年,累加数组a前m-1个月份的天数
    }
    for (j = 2011; j < year; ++j) {
        if (leap(j) == 1)
            sum += 366;   //2011年到输入的年份是闰年的加366
        else
            sum += 365;   //2011年到输入的年份不是闰年的加365
    }
    sum += day;    //将前面累加的结果加上日期,求出总天数
    return sum; //返回计算的天数
}

int main(void) {
    int year, month, day, n;
    printf("请输入年月日\n");
    scanf("%d%d%d", &year, &month, &day);    //输入年月日
    n = number(year, month, day);
    if ((n % 5) < 4 && (n % 5) > 0)    //余数是1或2或3时说明在打渔,否则在晒网
        printf("%d:%d:%d 打鱼\n", year, month, day);
    else
        printf("%d:%d:%d 晒网\n", year, month, day);
    return 0;
}

输出结果:

请输入年月日
2011 1 4
2011:1:4 晒网

技术要点:

本实例主要有以下两个技术要点:

(1) 判断输入的年份(2011 年以后包括 2011 年)是否为闰年,这里自定义函数 leap() 来进行判断。该函数的核心内容就是闰年的判断条件即能被 4 整除但不能被 100 整除,或能被 400 整除。

(2) 求输入日期距 2011 年 1 月 1 日有多少天。首先判断 2011 年距输入的年份有多少年,这其中有多少年是闰年就将 sum 加多少个 366,有多少年是平年便将 sum 加上多少个 365。

其次要将 12 个月每月的天数存到数组中,因为闰年 2 月份的天数有别于平年,故采用两个数组 a 和 b 分别存储。若输入年份是平年,月份为 m 时就在前面累加日期的基础上继续累加存储着平年每月天数的数组的前 m-1 个元素,将累加结果加上输入的日期便求出了最终结果。闰年的算法类似。