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

C語言實現萬年曆增強版

     編輯:關於C語言

程序功能

輸入年份(≥1900)和月份,輸出該月完整日曆,正確處理閏年、星期計算。

核心算法

1. 閏年判斷

(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)

2. 星期推算(基姆拉爾森公式思想)

  • 預計算 1900~9999 年每年 1 月 1 日星期幾:Year[year]
  • 1900-01-01 是周一(Year[1900] = 1)
  • 平年推移 1 天,閏年推移 2 天:Year[i+1] = (Year[i] + date) % 7

3. 目標月第一天星期計算

day = Year[year];  // 該年 1 月 1 日星期
for (i = 1; i < month; i++) day += a[i];  // 累加前幾月天數
day %= 7;  // 目標月 1 日星期(0=周日...6=周六,代碼中 0=周一需注意對應)

完整代碼

#include <stdio.h>

int main() {
    printf("\t\t\t萬年曆\n");
    printf("\t\t\t\t------ Made by Chunhui Wang\n\n");
    
    int i, year, month;
    int day;        // 當月 1 日星期
    int date;       // 年度推移天數
    int a[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    int Year[10000];
    
    // 預計算每年 1 月 1 日星期
    Year[1900] = 1;  // 1900-01-01 周一
    for (i = 1900; i < 9999; i++) {
        date = 1;
        if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) date = 2;
        Year[i+1] = (Year[i] + date) % 7;
    }
    
    while (1) {
        printf("請輸入年份(如 1900):");
        scanf("%d", &year);
        printf("請輸入月份(如 01):");
        scanf("%d", &month);
        
        // 閏年二月處理
        a[2] = 28;
        if (((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) && month >= 2)
            a[2] = 29;
        
        // 計算當月 1 日星期
        day = Year[year];
        for (i = 1; i < month; i++) day += a[i];
        day %= 7;
        
        // 輸出日曆頭部
        printf("\t\t\t\t%d 年 %d 月\n\n", year, month);
        printf("\t周一\t周二\t周三\t周四\t周五\t周六\t周日\n");
        
        // 輸出前導空格
        for (i = 0; i < day; i++) printf("\t");
        if (day == 0) printf("\t\t\t\t\t\t\t");  // 周一特殊處理
        
        // 輸出日期
        for (i = 0; i < a[month]; i++) {
            printf("%d\t", i + 1);
            if ((i + day) % 7 == 0) printf("\n\t");
        }
        printf("\n\n\n\n");
    }
    return 0;
}

運行效果示例

請輸入年份(如 1900):2024
請輸入月份(如 01):2

                    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	

改進建議

  • 增加輸入合法性檢查(年份範圍、月份 1~12)
  • 使用 Zeller 同餘公式直接計算星期,無需預計算陣列
  • 支援命令行參數模式,便於腳本調用
  • 修正 day==0 時的對齊邏輯(當前硬編碼制表符不夠健壯)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved