首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C 語言實作「三天打魚兩天曬網」判斷邏輯

     編輯:關於C

問題建模

輸入年月日,計算該日為當年第幾天(dayOfYear),依 dayOfYear % 3 判斷:

  • 餘數 1 → 打魚
  • 餘數 2、0 → 曬網

核心子問題

  1. 閏年判斷:(y%4==0 && y%100!=0) || (y%400==0)
  2. 日期合法性:月份 1-12,日期符合該月天數(閏年 2 月 29 天)。
  3. 累計天數:查表法,兩個 12 元素陣列分存平年/閏年每月天數。

完整 C 程式碼

#include <stdio.h>

#define OK 0
#define ERROR 1
#define LEAP 1
#define NONLEAP 0

int nonLeap[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int leap[12]    = {31,29,31,30,31,30,31,31,30,31,30,31};

int isLeap(int y) {
    return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}

int validDate(int y, int m, int d) {
    if (m < 1 || m > 12) return ERROR;
    int dim = isLeap(y) ? leap[m-1] : nonLeap[m-1];
    return (d >= 1 && d <= dim) ? OK : ERROR;
}

int dayOfYear(int y, int m, int d) {
    int days = 0;
    int* tab = isLeap(y) ? leap : nonLeap;
    for (int i = 0; i < m-1; ++i) days += tab[i];
    days += d;
    return days;
}

int main() {
    int y, m, d;
    printf("請輸入年月日:");
    while (scanf("%d%d%d", &y, &m, &d) == 3) {
        if (validDate(y, m, d) == ERROR) {
            printf("日期不合法,請重新輸入:");
            continue;
        }
        int doy = dayOfYear(y, m, d);
        printf("%04d-%02d-%02d : %s\n", y, m, d, (doy % 3 == 1) ? "打魚" : "曬網");
        printf("請輸入年月日:");
    }
    return 0;
}

執行範例

請輸入年月日:2024 2 29
2024-02-29 : 打魚
請輸入年月日:2023 2 28
2023-02-28 : 曬網
請輸入年月日:2023 13 1
日期不合法,請重新輸入:

關鍵點總結

  • **查表法** 避免複雜的逐月判斷,簡潔高效。
  • **閏年規則** 為格里高利曆標準,須精確實作。
  • **輸入驗證** 獨立函數,主迴路乾淨。
  • **模組化**:isLeap、validDate、dayOfYear 單一職責,易測試、易維護。

擴展思考

  • 支援批次輸入(檔案重導向)。
  • 輸出該年完整打魚/曬網日曆。
  • 改用 Zeller 同餘公式直接算星期,驗證邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved