輸入年份(≥1900)和月份,輸出該月完整日曆,正確處理閏年、星期計算。
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
Year[year]Year[1900] = 1)Year[i+1] = (Year[i] + date) % 7day = 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
day==0 時的對齊邏輯(當前硬編碼制表符不夠健壯)