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

Java實例:輸入星期首字母判斷星期幾 (含雙字母區分)

     編輯:Java 相關知識

Java控制台交互:輸入星期英文首字母判斷星期幾 (完整處理 T/S 雙字母歧義)

經典Java入門練習:利用 Scanner 讀取用戶輸入,結合 switch-case 和巢狀 if-else 處理 Tuesday/Thursday (均以T開頭) 和 Saturday/Sunday (均以S開頭) 的二次判斷。本文提供健壯的代碼:大小寫不敏感、輸入長度校驗、錯誤提示友好。

核心邏輯

  1. 讀取第一個字母 (字符串首字符)。
  2. switch 判斷:M→Monday, W→Wednesday, F→Friday, T→需讀第二字母, S→需讀第二字母, 其他→錯誤。
  3. T分支:讀第二字母,U→Tuesday, H→Thursday, 其他→錯誤。
  4. S分支:讀第二字母,A→Saturday, U→Sunday, 其他→錯誤。
  5. 全程統一轉大寫或用 equalsIgnoreCase 處理大小寫。

完整代碼 (WeekdayDetector.java)

import java.util.Scanner;

public class WeekdayDetector {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入星期英文首字母 (如 M, T, W, F, S):");

        String firstInput = scanner.next().trim().toUpperCase(); // 統一大寫

        // 1. 校驗輸入長度
        if (firstInput.length() != 1) {
            System.out.println("輸入錯誤:請輸入單個字母!");
            scanner.close();
            return;
        }

        char firstChar = firstInput.charAt(0);

        // 2. 主判斷
        switch (firstChar) {
            case 'M':
                System.out.println("星期一 (Monday)");
                break;
            case 'W':
                System.out.println("星期三 (Wednesday)");
                break;
            case 'F':
                System.out.println("星期五 (Friday)");
                break;
            case 'T':
                // 需二次判斷 Tuesday / Thursday
                System.out.print("檢測到 'T',請輸入第二個字母 (u/h):");
                String secondInputT = scanner.next().trim().toUpperCase();
                if (secondInputT.length() != 1) {
                    System.out.println("輸入錯誤:請輸入單個字母!");
                } else {
                    char secondChar = secondInputT.charAt(0);
                    if (secondChar == 'U') System.out.println("星期二 (Tuesday)");
                    else if (secondChar == 'H') System.out.println("星期四 (Thursday)");
                    else System.out.println("無法識別:Tuesday 需 'u', Thursday 需 'h'");
                }
                break;
            case 'S':
                // 需二次判斷 Saturday / Sunday
                System.out.print("檢測到 'S',請輸入第二個字母 (a/u):");
                String secondInputS = scanner.next().trim().toUpperCase();
                if (secondInputS.length() != 1) {
                    System.out.println("輸入錯誤:請輸入單個字母!");
                } else {
                    char secondChar = secondInputS.charAt(0);
                    if (secondChar == 'A') System.out.println("星期六 (Saturday)");
                    else if (secondChar == 'U') System.out.println("星期日 (Sunday)");
                    else System.out.println("無法識別:Saturday 需 'a', Sunday 需 'u'");
                }
                break;
            default:
                System.out.println("無法識別的星期首字母:" + firstChar);
        }

        scanner.close();
    }
}

運行示例

請輸入星期英文首字母 (如 M, T, W, F, S):t
檢測到 'T',請輸入第二個字母 (u/h):h
星期四 (Thursday)

請輸入星期英文首字母 (如 M, T, W, F, S):S
檢測到 'S',請輸入第二個字母 (a/u):a
星期六 (Saturday)

請輸入星期英文首字母 (如 M, T, W, F, S):x
無法識別的星期首字母:X

進階優化:Map查找表替代 switch (擴展性更強)

import java.util.*;

public class WeekdayDetectorMap {
    // 定義映射:首字母 -> (唯一星期 | 二次判斷Map)
    private static final Map WEEKDAY_MAP = new HashMap<>();
    static {
        WEEKDAY_MAP.put('M', "Monday");
        WEEKDAY_MAP.put('W', "Wednesday");
        WEEKDAY_MAP.put('F', "Friday");
        WEEKDAY_MAP.put('T', Map.of('U', "Tuesday", 'H', "Thursday"));
        WEEKDAY_MAP.put('S', Map.of('A', "Saturday", 'U', "Sunday"));
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入星期英文首字母:");
        String input = scanner.next().trim().toUpperCase();
        if (input.length() != 1) { System.out.println("請輸入單個字母!"); return; }

        char first = input.charAt(0);
        Object mapping = WEEKDAY_MAP.get(first);

        if (mapping == null) { System.out.println("無法識別:" + first); return; }

        if (mapping instanceof String) {
            System.out.println(mapping);
        } else if (mapping instanceof Map) {
            @SuppressWarnings("unchecked")
            Map secondMap = (Map) mapping;
            System.out.print("請輸入第二字母 " + secondMap.keySet() + ":");
            String secondInput = scanner.next().trim().toUpperCase();
            if (secondInput.length() == 1) {
                String result = secondMap.get(secondInput.charAt(0));
                System.out.println(result != null ? result : "無法識別");
            } else { System.out.println("請輸入單個字母!"); }
        }
        scanner.close();
    }
}

關鍵點總結

  • Scanner.next() 讀取下一個Token (空白分隔),配合 trim() 去除換行。
  • toUpperCase() 統一大小寫,避免多重 case 'm': case 'M':。
  • 輸入校驗:長度檢查、空指針防護、友好錯誤提示。
  • 資源關閉:scanner.close() 防洩漏 (Java 7+ try-with-resources 更佳)。
  • 擴展性:Map驅動模式易於添加新語言 (如中文拼音首字母) 或修改映射,無需修改控制流代碼。

總結

此題考察 Scanner 基礎 IO、switch/if 分支控制、字符處理、防禦性編程。Map驅動版本展示「數據驅動邏輯」的良好設計習慣,推薦實際項目採用。

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