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

C 語言實作萬年曆:演算法詳解與完整原始碼

     編輯:關於C語言

一、核心問題:日期計算的數學基礎

萬年曆的核心在於任意給定年、月、日,快速計算該日是星期幾,以及該月份天數。關鍵演算法包括:

  1. 閏年判斷:能被 400 整除,或能被 4 整除但不能被 100 整除。
  2. 累積天數:利用已知基準日(如 1970-01-01 是星期四)推算目標日期與基準日的天數差,模 7 得星期。
  3. 蔡勒公式:直接由年月日計算星期的經典演算法:
    w = (d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7(月份視 3=3月…14=翌年2月,1、2 月視為上一年 13、14 月)。

二、資料結構設計

// 各月標準天數,索引 0 代表 1 月
int monthDays[12] = {31,28,31,30,31,30,31,31,30,31,30,31};

// 閏年時 2 月調整為 29 天
int getMonthDays(int year, int month) {
    if (month == 2 && isLeapYear(year)) return 29;
    return monthDays[month-1];
}

三、完整可執行原始碼

#include <stdio.h>
#include <stdlib.h>

// 閏年判斷
int isLeapYear(int year) {
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}

// 取得某年某月天數
int getMonthDays(int year, int month) {
    static const int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    if (month == 2 && isLeapYear(year)) return 29;
    return days[month-1];
}

// 蔡勒公式計算星期 (0=日, 1=一, ..., 6=六)
int getWeekDay(int year, int month, int day) {
    if (month < 3) { month += 12; year--; }
    int w = (day + 2*month + 3*(month+1)/5 + year + year/4 - year/100 + year/400) % 7;
    return (w + 7) % 7; // 確保非負
}

// 列印指定年月曆表
void printMonthCalendar(int year, int month) {
    const char *weekNames[] = {"日","一","二","三","四","五","六"};
    int firstWeekDay = getWeekDay(year, month, 1);
    int days = getMonthDays(year, month);
    
    printf("\n      %d 年 %2d 月\n", year, month);
    printf("===========================\n");
    for (int i=0; i<7; i++) printf("%3s", weekNames[i]);
    printf("\n");
    
    // 印出第一天前的空格
    for (int i=0; i 12) {
        printf("月份錯誤!\n");
        return 1;
    }
    printMonthCalendar(year, month);
    return 0;
}

四、進階擴充方向

  • 全年曆表:迴圈呼叫 12 次 printMonthCalendar,加入分頁邏輯。
  • 農曆/節氣:引入農曆演算法(如《農曆計算》標準),需查表或精密天文公式。
  • GUI 介面:結合 ncurses (終端機) 或 GTK/Qt (圖形) 實作互動式萬年曆。
  • 效能優化:預計算 400 年週期內所有資料建立查找表,O(1) 查詢。

五、常見錯誤避坑

  1. 月份 1、2 月在蔡勒公式中需視為上一年 13、14 月處理。
  2. 負數取模在 C 語言中結果可能為負,需 (w%7+7)%7 修正。
  3. 閏年規則嚴格遵循「400 整除 或 4 整除且非 100 整除」。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved