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

C語言實現簡易萬年曆:輸入年月輸出日曆表

     編輯:關於C語言

核心邏輯:蔡勒公式思想的簡化實現

計算目標月 1 號是星期幾,再按行打印日期網格。關鍵步驟:

  1. **累計天數**:從基準年(如 1900)到目標年份前一年,累加平年 365 / 閏年 366 天。
  2. **加上目標年內前幾月天數**:依月份累加(2 月判斷閏年)。
  3. **總天數 % 7** → 1 號星期幾(0=日, 1=一...6=六)。
  4. **打印對齊**:先打印前導空格,再逐日打印,每 7 天換行。

完整代碼(含閏年判斷、格式對齊)

#include 

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

int main() {
    int year, month;
    printf("請輸入年份:"); scanf("%d", &year);
    printf("請輸入月份:"); scanf("%d", &month);

    int days_in_month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    if (is_leap(year)) days_in_month[1] = 29;

    // 1. 計算 1900-01-01 到 year-month-01 的總天數
    int total_days = 0;
    for (int y = 1900; y < year; y++)
        total_days += is_leap(y) ? 366 : 365;
    for (int m = 1; m < month; m++)
        total_days += days_in_month[m-1];

    // 2. 1 號星期幾 (1900-01-01 是星期一, 這裡約定 0=日, 1=一... 需調整)
    // 假設 1900-01-01 是星期一(1), 則 weekday = (total_days + 1) % 7; 0=日
    int weekday = (total_days + 1) % 7;

    // 3. 打印表頭
    printf("日\t一\t二\t三\t四\t五\t六\n");
    // 4. 打印前導空格
    for (int i = 0; i < weekday; i++) printf("\t");
    // 5. 打印日期
    for (int d = 1; d <= days_in_month[month-1]; d++) {
        printf("%d\t", d);
        if ((weekday + d) % 7 == 0) printf("\n");
    }
    printf("\n");
    return 0;
}

運行效果示例

輸入:2024 2
輸出:
日	一	二	三	四	五	六
				1	2	3
4	5	6	7	8	9	10
11	12	13	14	15	16	17
18	19	20	21	22	23	24
25	26	27	28	29

優化方向

  • 使用 **蔡勒公式** O(1) 計算星期,替代循環累加年份。
  • 支持命令行參數 `./cal 2024 2` 直接查詢。
  • 高亮今日(結合 `time.h` 獲取系統日期)。
  • 輸出 HTML/Markdown 格式用於網頁嵌入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved