跳到正文
IGCSE·Tuition
计算机科学 · 课程

设计带边界情况的选择结构

一条对大多数值都有效的规则,仍可能恰好在边缘上的那个值出错。

本页内容
  1. 怎样设计选择结构?
  2. 例题
  3. 要小心的错误
  4. 自我检测
  5. 接下来学什么

选择结构根据条件从几条路径中选一条。要设计好它,先写出各个范围,再在每个边界上和边界旁边选测试值。车费、等级、折扣和密码规则的题目都会用到。

它依靠用状态表追踪来证明哪个分支被执行,并与不依赖语言解释算法相连。

怎样设计选择结构?

  1. 列出范围,也就是规则描述的区间,不留空隙,也不重叠。
  2. 选择条件,让每个值恰好落在一个范围内。
  3. 排列测试顺序,从刻度的一端到另一端。
  4. **选边界测试数据:**一个范围的最后一个值和下一个范围的第一个值。
  5. 追踪每个测试,并与你事先写好的预期结果比较。

例题

巴士车费取决于年龄。

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 ← 2

13 岁的人现在付 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(拒绝)。

接下来学什么

下一步,在不依赖语言解释算法中练习用普通步骤描述你的选择结构。伪代码追踪训练器会显示每个输入执行了哪个分支。

边界错误一个人很容易漏掉,老师可以在一对一线上计算机科学补习中教你如何测试自己的设计。练习题有不同难度的边界题。

常见问题

什么是边界值(boundary value)?

边界值是结果发生变化的范围边缘上的测试值,再加上两侧紧邻的值。对于在 60 处改变的规则,边界测试是 59、60 和 61;若只考虑整数,则是 59 和 60。

> 和 >= 有什么区别?

符号 > 表示严格大于,所以 60 > 60 为假。符号 >= 表示大于或等于,所以 60 >= 60 为真。两者只在边界值上不同,因此那个值必须测试。

应该用嵌套 IF 还是几个独立的 IF?

范围不重叠时,带 ELSE 的嵌套 IF 最安全,因为恰好只有一个分支被执行。几个独立的 IF 语句如果不小心,可能执行不止一个分支,所以要用追踪检查每种情况。

更新于:

下一步

如果你的选择结构通过了示例数据,却在某一个值上出错,一对一的老师可以帮你养成先测边缘的习惯。

一小时付费试听课,按所安排老师确认的收费,RM80 起。 其他费用、时间安排及后续课程,在试听课后由家长与老师直接确认。

补习由家长或监护人安排。用 WhatsApp 把这页发给他们,他们就可以替你咨询。

是家长或监护人?在这里咨询

已通过我们的服务帮助 9,000+ 名学生