本文提供一個用 C++ 實現的萬年曆程式,具備兩大核心功能:
程式以 1900 年 1 月 1 日(星期一)為基準,計算目標日期距離基準日的總天數,再取模 7 得到星期。關鍵函數包括:
isyear(int y):判斷閏年(能被 4 整除但不能被 100 整除,或能被 400 整除)。frontday / backday:計算年初至指定月日、或指定月日至年底的天數。weekday:綜合跨年、同年、相鄰年等情況計算總天數差,推導星期。#include <iostream>
#include <iomanip>
using namespace std;
int num1[12] = {31,29,31,30,31,30,31,31,30,31,30,31}; // 閏年每月天數
int num2[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; // 平年每月天數
int isyear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 計算該年 1/1 到 month/day 的天數
int frontday(int year, int month, int day) {
int sum = 0;
int *mon = isyear(year) ? num1 : num2;
for (int i = 0; i < month - 1; i++) sum += mon[i];
return sum + day;
}
// 計算 month/day 到該年 12/31 的天數
int backday(int year, int month, int day) {
int sum = 0;
int *mon = isyear(year) ? num1 : num2;
for (int i = month; i < 12; i++) sum += mon[i];
return sum - day + 1;
}
// 計算兩日期間天數差,回傳星期(1~7, 7=星期日)
int weekday(int y1, int m1, int d1, int y2, int m2, int d2) {
long long sum = 0;
if (y2 < y1) return -1;
if (y1 == y2) {
sum = frontday(y1, m2, d2) - frontday(y1, m1, d1);
} else {
sum = backday(y1, m1, d1) + frontday(y2, m2, d2);
for (int y = y1 + 1; y < y2; y++) sum += isyear(y) ? 366 : 365;
}
int w = (sum + 1) % 7; // 1900/1/1 是星期一(1)
return w == 0 ? 7 : w;
}
void printCalendar(int year, int month) {
int w = weekday(1900, 1, 1, year, month, 1); // 該月 1 日星期
int days = isyear(year) ? num1[month-1] : num2[month-1];
cout << "Sun Mon Tue Wed Thu Fri Sat\n";
for (int i = 1; i < w; i++) cout << " ";
for (int d = 1; d <= days; d++) {
cout << setw(3) << d << ( (w + d - 1) % 7 == 0 ? "\n" : " ");
}
cout << "\n";
}
int main() {
int choice;
cout << "1. 查詢星期 2. 列印月曆 請選擇: ";
cin >> choice;
if (choice == 1) {
int y, m, d;
cout << "輸入年 月 日: ";
cin >> y >> m >> d;
int w = weekday(1900, 1, 1, y, m, d);
cout << "星期" << (w == 7 ? "日" : to_string(w)) << "\n";
} else if (choice == 2) {
int y, m;
cout << "輸入年 月: ";
cin >> y >> m;
printCalendar(y, m);
}
return 0;
}
輸入 2024 5 可列印 2024 年 5 月日曆;輸入 2024 5 20 可查詢該日為星期一。程式碼結構清晰,適合初學者理解日期計算與陣列應用。