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

C語言實現萬年曆程序 - 控制台交互版

     編輯:關於C

程序功能

  • 輸入年份、月份,顯示該月日曆
  • 支持按鍵翻頁:> 下月、< 上月、? 自定義年月、# 退出
  • 正確處理閏年、每月天數、星期計算
  • 同時將日曆輸出到文件 abc.txt

核心算法

1. 判斷閏年

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

2. 獲取月份天數

int monthDays(int month, int year) {
    static int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
    if (month == 2 && isLeap(year)) return 29;
    return days[month-1];
}

3. 計算某月1日星期(蔡勒公式簡化版)

累計從基準日期(如 1900-01-01 周一)到目標月首日的總天數,模 7 得星期。

完整代碼

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>  // Windows專用,Linux請用 ncurses 或 termios
#include <string.h>

int isLeap(int y) { return (y%4==0&&y%100!=0)||(y%400==0); }
int monthDays(int m, int y) {
    int d[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    return (m==2&&isLeap(y))?29:d[m-1];
}

void printCal(int y, int m) {
    system("cls"); // Windows清屏,Linux用 system("clear")
    printf("%d年%d月\n", y, m);
    puts("Sun Mon Tue Wed Thu Fri Sat");

    int days = monthDays(m, y);
    // 計算1號星期 (0=Sun)
    int total = 0;
    for (int i = 1900; i < y; i++) total += isLeap(i) ? 366 : 365;
    for (int i = 1; i < m; i++) total += monthDays(i, y);
    int w = (total + 1) % 7; // 1900-01-01 是周一(1),調整為0基準

    for (int i = 0; i < w; i++) printf("    ");
    for (int d = 1; d <= days; d++) {
        printf("%3d ", d);
        if ((w + d) % 7 == 0) puts("");
    }
    puts("\n\n> Next  < Prev  ? Custom  # Quit");
}

int main() {
    int y, m;
    printf("Year: "); scanf("%d", &y);
    printf("Month: "); scanf("%d", &m);
    getchar();

    while (1) {
        printCal(y, m);
        switch (getch()) {
            case '>': m++; if (m > 12) { m = 1; y++; } break;
            case '<': m--; if (m < 1) { m = 12; y--; } break;
            case '?': printf("Year: "); scanf("%d", &y);
                      printf("Month: "); scanf("%d", &m); getchar(); break;
            case '#': return 0;
        }
    }
}

跨平台說明

  • conio.h、getch()、system("cls") 僅限 Windows。
  • Linux/Mac 下請替換為:
    #include <termios.h> #include <unistd.h> 實現無緩衝輸入
    system("clear") 清屏

擴展建議

  • 高亮顯示今天日期(結合 time.h 獲取系統時間)。
  • 支持農曆、節假日顯示。
  • 用 ncurses 庫實現更專業的 TUI 界面。
  • 移除文件輸出或改為可選項。

常見問題

  • 星期對不上:檢查基準日期與蔡勒公式參數。
  • 閏年錯誤:注意 1900 年不是閏年,2000 年是。
  • 輸入緩衝:scanf 後殘留換行符,需 getchar() 清理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved