C語言漁夫打魚曬網問題

2020-07-16 10:04:29
如果一個漁夫從 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)==i)
        sum+=366;    /*2011年到輸入的年份是閏年的加366*/
    else
        sum+=365;    /*2011年到輸入的年份不是閏年的加365*/
    sum+=day;    /*將前面累加的結果加上日期,求出總天數*/
    return sum;    /*返回計算的天數*/
}

int main()
{
    int year,month,day,n;
    printf("請輸入年月日n");
    scanf("%d%d%d",&year,&month,&day);    /*輸入年月日*/
    n=number(year,month,day);    /*呼叫函數 number()*/
    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 個元素,將累加結果加上輸入的日期便求出了最終結果。閏年的演算法類似。