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

C語言實現萬年曆:查詢星期與列印月曆表完整代碼

     編輯:關於C語言

C語言實現萬年曆:查詢星期與列印月曆表完整代碼

本文提供一個用 C++ 實現的萬年曆程式,具備兩大核心功能:

  1. 查詢某一天是星期幾:輸入年、月、日,輸出對應星期。
  2. 列印指定年月的月曆表:輸入年、月,以表格形式輸出該月日曆。

核心邏輯說明

程式以 1900 年 1 月 1 日(星期一)為基準,計算目標日期距離基準日的總天數,再取模 7 得到星期。關鍵函數包括:

  • isyear(int y):判斷閏年(能被 4 整除但不能被 100 整除,或能被 400 整除)。
  • frontday / backday:計算年初至指定月日、或指定月日至年底的天數。
  • weekday:綜合跨年、同年、相鄰年等情況計算總天數差,推導星期。

完整代碼 (C++)

#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 可查詢該日為星期一。程式碼結構清晰,適合初學者理解日期計算與陣列應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved