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-else | switch |
|---|---|---|
| 判断依据 | 布尔表达式,可写区间、复合条件 | 离散值匹配(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 分错档。
常见错误:把非法判断写在 else 链末尾,导致 -5 分被当成 E;switch 中忘记 break 导致穿透;用
score / 10 时未先排除 100 以上的值,使 105 被映射为 10 而误判为 A。