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

Java 基礎實戰:萬年曆打印完整實現

     編輯:Java 相關知識

Java 萬年曆打印:從邏輯分析到代碼實現

問題分析

輸入年、月,輸出標準日曆格式。核心難點:計算任意月 1 號是星期幾。

基準知識

  • 1970-01-01 是星期四(Unix 紀元)
  • 閏年規則:4 年一閏,百年不閏,四百年再閏
  • 大月 31 天:1,3,5,7,8,10,12;小月 30 天:4,6,9,11;2 月 28/29 天

算法步驟

  1. 計算年天數:累加 1970 年至目標年-1 的天數
  2. 計算月天數:累加 1 月至目標月-1 的天數
  3. 總天數 = 年天數 + 月天數
  4. 星期幾 = (總天數 + 4) % 7 (0=日, 1=一, ..., 6=六,4 代表週四)
  5. 獲取當月總天數
  6. 格式化輸出

模組化代碼實現

public class PerpetualCalendar {

    // 1. 閏年判斷
    public static boolean isLeapYear(int year) {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }

    // 2. 獲取月份天數
    public static int getMonthDays(int year, int month) {
        switch (month) {
            case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31;
            case 4: case 6: case 9: case 11: return 30;
            case 2: return isLeapYear(year) ? 29 : 28;
            default: throw new IllegalArgumentException("無效月份: " + month);
        }
    }

    // 3. 計算總天數(1970-01-01 到 year-month-01)
    public static int calculateTotalDays(int year, int month) {
        int days = 0;
        // 年天數
        for (int y = 1970; y < year; y++) {
            days += isLeapYear(y) ? 366 : 365;
        }
        // 月天數
        for (int m = 1; m < month; m++) {
            days += getMonthDays(year, m);
        }
        return days;
    }

    // 4. 打印標題
    public static void printTitle(int year, int month) {
        System.out.println("============================");
        System.out.println("      " + year + "年" + month + "月");
        System.out.println("============================");
        System.out.println("日  一  二  三  四  五  六");
    }

    // 5. 打印日曆主體
    public static void printCalendar(int year, int month) {
        int totalDays = calculateTotalDays(year, month);
        int firstWeekDay = (totalDays + 4) % 7; // 1號星期幾
        int monthDays = getMonthDays(year, month);

        // 打印 1 號前空格
        for (int i = 0; i < firstWeekDay; i++) {
            System.out.print("    ");
        }

        // 打印日期
        for (int day = 1; day <= monthDays; day++) {
            System.out.printf("%2d  ", day);
            if ((firstWeekDay + day) % 7 == 0) {
                System.out.println();
            }
        }
        System.out.println("\n");
    }

    public static void main(String[] args) {
        // 測試
        printTitle(2024, 2);
        printCalendar(2024, 2); // 閏年 2 月
        
        printTitle(2024, 1);
        printCalendar(2024, 1);
        
        printTitle(2023, 2);
        printCalendar(2023, 2); // 平年 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

============================
      2024年1月
============================
日  一  二  三  四  五  六
    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 30 31

擴展優化方向

  • 使用 java.time API(Java 8+)簡化:LocalDate.of(year, month, 1).getDayOfWeek()
  • 陣列緩存月份天數避免重複 switch
  • 支援命令行參數輸入年月
  • 輸出 HTML 表格或圖片

學習總結

  1. 大問題拆解為小問題(閏年判斷、月天數、總天數、星期計算、格式化)
  2. 自底向上實現,每個方法單一職責
  3. 邊界測試:閏年/平年、1月/12月、跨世紀年份
  4. 善用標準庫(java.time)替代手工計算
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved