选择结构根据条件从几条路径中选一条。要设计好它,先写出各个范围,再在每个边界上和边界旁边选测试值。车费、等级、折扣和密码规则的题目都会用到。
它依靠用状态表追踪来证明哪个分支被执行,并与不依赖语言解释算法相连。
怎样设计选择结构?
- 列出范围,也就是规则描述的区间,不留空隙,也不重叠。
- 选择条件,让每个值恰好落在一个范围内。
- 排列测试顺序,从刻度的一端到另一端。
- **选边界测试数据:**一个范围的最后一个值和下一个范围的第一个值。
- 追踪每个测试,并与你事先写好的预期结果比较。
例题
巴士车费取决于年龄。
13 岁以下:RM2。13 到 59 岁:RM5。60 岁及以上:RM3。
**第 1 步,范围:**0 到 12,13 到 59,60 及以上。
第 2 步,算法:
INPUT Age
IF Age < 13 THEN
Fare ← 2
ELSE
IF Age < 60 THEN
Fare ← 5
ELSE
Fare ← 3
ENDIF
ENDIF
OUTPUT Fare
第 3 步,边界测试,预期结果在追踪之前先定好:
| Age | 预期 | 追踪 | Fare |
|---|---|---|---|
| 12 | 儿童 | 12 < 13 为真 | 2 |
| 13 | 成人 | 13 < 13 为假,13 < 60 为真 | 5 |
| 59 | 成人 | 59 < 13 为假,59 < 60 为真 | 5 |
| 60 | 长者 | 60 < 13 为假,60 < 60 为假 | 3 |
四个输出都与预期车费吻合。两个边缘,12 与 13,以及 59 与 60,都被覆盖了。
要小心的错误
一个常见的失误,是在边界上用错比较符号。
错误的条件:
IF Age <= 13 THEN Fare ← 213 岁的人现在付 RM2,但规则说 13 到 59 岁付 RM5。
像 8、30、70 这样的典型年龄全都通过,所以错误一直藏着。
只有在 13 的边界测试才会暴露它:13 <= 13 为真,得到 RM2,而不是预期的 RM5。改正为 Age < 13。一定要测试边缘上的值,而不只是每个范围中间的值。
自我检测
1. 等级规则:分数 80 或以上得 A,50 到 79 得 B,50 以下得 C。给出 49、50、79 和 80 的输出。
Show answer
49 得 C。50 得 B。79 得 B。80 得 A。这四个值正好位于两个边缘。
2. 订单总额超过 RM100 时免运费。在 RM100 时会怎样,应该用哪个比较符号?
Show answer
RM100 并不超过 RM100,所以不免运费。使用 Total > 100。边界测试是 100(不免运费)和略高于它的值,如 100.01(免运费)。
3. 密码长度必须是 8 到 12 个字符,含两端。写出条件和要测试的边界长度。
Show answer
Length >= 8 AND Length <= 12。测试 7(拒绝)、8(接受)、12(接受)和 13(拒绝)。
接下来学什么
下一步,在不依赖语言解释算法中练习用普通步骤描述你的选择结构。伪代码追踪训练器会显示每个输入执行了哪个分支。
边界错误一个人很容易漏掉,老师可以在一对一线上计算机科学补习中教你如何测试自己的设计。练习题有不同难度的边界题。