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

杭電OJ 2004 題解:分數等級判斷——if-else 鏈與邊界條件處理

     編輯:關於C

題目描述

輸入一個整數分數 a(多組測試,EOF 結束),輸出對應等級:

  • 0-59:E
  • 60-69:D
  • 70-79:C
  • 80-89:B
  • 90-100:A
  • 其他:Score is error!

原始代碼分析與問題


#include 
int main(void) {
    int a;
    while (scanf("%d", &a) != EOF) {
        if (a > -1 && a < 60)
            printf("E\n");
        else   // ← 原代碼此處有雜亂字符 "www.2cto.com"
            if (a > 59 && a < 70)
                printf("D\n");
            else
                if (a > 69 && a < 80)
                    printf("C\n");
                else
                    if (a > 79 && a < 90)
                        printf("B\n");
                    else
                        if (a > 80 && a < 101)  // ← Bug: 80-89 歸 B,90-100 也進這裡
                            printf("A\n");
                        else
                            printf("Score is error!\n");
    }
    return 0;
}

發現的問題

  1. 雜亂字符:elsewww.2cto.com 導致編譯錯誤。
  2. 邊界條件錯誤:a > 80 && a < 101 覆蓋了 80-100,導致 90-100 輸出 A,但 80-89 本應輸出 B,邏輯衝突。
  3. 結構混亂:巢狀 if-else 缺乏大括號,可讀性極差,易出錯。

修正版代碼(推薦風格)


#include 

int main(void) {
    int score;
    while (scanf("%d", &score) == 1) {  // 更清晰的 EOF 判斷
        if (score < 0 || score > 100) {
            printf("Score is error!\n");
        } else if (score < 60) {
            printf("E\n");
        } else if (score < 70) {
            printf("D\n");
        } else if (score < 80) {
            printf("C\n");
        } else if (score < 90) {
            printf("B\n");
        } else { // 90-100
            printf("A\n");
        }
    }
    return 0;
}

優化要點

  1. 自上而下互斥判斷:利用 else if 鏈,前一條件不滿足隱含前條件反面,邊界清晰無重疊。
  2. 統一錯誤處理:先檢查非法輸入,再處理合法區間。
  3. 完整大括號:即使單語句也加 {},防止後期維護引入 Bug。
  4. 變量語義化命名:a → score。

進階:查表法(O(1) 無分支)


const char *grade[] = {
    "E", "E", "E", "E", "E", "E",  // 0-5
    "D", "D", "D", "D",            // 6-9 (60-69)
    "C", "C", "C", "C",            // 10-13 (70-79)
    "B", "B", "B", "B",            // 14-17 (80-89)
    "A", "A", "A", "A", "A", "A", "A", "A", "A", "A" // 18-27 (90-100)
};

int main() {
    int score;
    while (scanf("%d", &score) == 1) {
        if (score < 0 || score > 100)
            printf("Score is error!\n");
        else
            printf("%s\n", grade[score / 10]);
    }
    return 0;
}

適用於等級固定、性能敏感場景。

測試用例

輸入輸出說明
59E及格線邊界
60D
89B
90A優秀線邊界
100A上限
-1Score is error!下限越界
101Score is error!上限越界
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved