4. 条件分支实现成绩等级判定

条件分支实现成绩等级判定 学习卡片

成绩等级判定的规则设计

成绩等级判定看似简单,但真正写对需要先明确三件事:分数区间如何划分、边界值归哪一级、非法输入如何处理。下面采用一套常见且便于验证的规则:

分数区间等级说明
[90, 100]A含 90 和 100
[80, 90)B含 80,不含 90
[70, 80)C含 70,不含 80
[60, 70)D含 60,不含 70
[0, 60)E含 0,不含 60
<0 或 >100非法提示输入错误

区间采用“左闭右开”约定,即每个等级包含下界、不包含上界,最高分 100 单独归入 A。这样 90 分判为 A、89.9 分判为 B,不会出现两个分支同时命中的情况。

if-else 实现:按区间从高到低判断

用 if-else 判定时,推荐从最高区间开始判断,利用“前面不满足才继续”的特性自然形成区间收窄,避免重复写上下界:

public class GradeIfElse {
    public static void main(String[] args) {
        double score = 89.5;
        String grade;

        if (score < 0 || score > 100) {
            grade = "非法";
        } else if (score >= 90) {
            grade = "A";
        } else if (score >= 80) {
            grade = "B";
        } else if (score >= 70) {
            grade = "C";
        } else if (score >= 60) {
            grade = "D";
        } else {
            grade = "E";
        }

        System.out.println("分数=" + score + ",等级=" + grade);
    }
}

运行结果:分数=89.5,等级=B。注意非法判断必须放在最前面,否则负数会先落入 score >= 90 等分支的 else 链,最终被误判为 E。

switch 实现:先离散化再分支

switch 不能直接判断区间,需要先把分数映射为整数档位(例如 score / 10),再对档位做分支。Java 14 及以上可使用箭头语法,避免穿透:

public class GradeSwitch {
    public static void main(String[] args) {
        double score = 89.5;
        String grade;

        if (score < 0 || score > 100) {
            grade = "非法";
        } else {
            int level = (int) (score / 10);
            switch (level) {
                case 10, 9 -> grade = "A";
                case 8 -> grade = "B";
                case 7 -> grade = "C";
                case 6 -> grade = "D";
                default -> grade = "E";
            }
        }

        System.out.println("分数=" + score + ",等级=" + grade);
    }
}

这里 (int)(score / 10) 把 89.5 变成 8,命中 B;100 变成 10,与 9 一起归入 A。若使用传统 case 10: case 9: 写法,必须记得每个分支加 break,否则会继续执行后续分支。

两种结构的适用场景对比

对比项if-elseswitch
判断依据布尔表达式,可写区间、复合条件离散值匹配(int、String、枚举等)
区间判定直接写 score >= 90,直观需先换算成档位,多一步映射
边界处理靠判断顺序和运算符控制靠映射结果控制,边界易被取整影响
可读性条件少时清晰,条件多时嵌套变深离散分支多时更整齐
典型场景成绩区间、年龄范围、阈值判断菜单选项、状态码、枚举分发
选择建议:只要判断条件是“范围”或“复合条件”,优先用 if-else;只有当判断对象是少量离散取值时,switch 才更合适。本例的成绩区间判定,if-else 是更自然的选择。

边界值与非法输入的验证

写完后必须用边界值验证,而不是只测一个中间值。建议至少覆盖以下用例:

  • 100 → A(上界)
  • 90 → A(A 的下界)
  • 89.9 → B(B 的上界附近)
  • 60 → D(D 的下界)
  • 59.9 → E(E 的上界附近)
  • 0 → E(下界)
  • -1 → 非法
  • 101 → 非法

如果某个用例结果与预期不符,优先检查三处:非法判断是否放在最前、区间运算符是否用了 >= 而不是 >、switch 映射是否因取整把 100 或 90 分错档。

成绩等级判定:区间映射与两种分支结构 0 60 70 80 90 100 E [0,60) D [60,70) C [70,80) B [80,90) A [90,100] 非法 非法 区间约定:左闭右开,100 单独归入 A;90 判 A,89.9 判 B if-else:从高到低收窄 score < 0 || score > 100 → 非法 score >= 90 → A score >= 80 → B score >= 70 → C score >= 60 → D else → E switch:先离散化再匹配 score < 0 || score > 100 → 非法 int level = (int)(score / 10) case 10, 9 → A case 8 → B case 7 → C case 6 → D;default → E
常见错误:把非法判断写在 else 链末尾,导致 -5 分被当成 E;switch 中忘记 break 导致穿透;用 score / 10 时未先排除 100 以上的值,使 105 被映射为 10 而误判为 A。