程序在边界上失败,是因为条件对边缘值的处理与题意不同。常见原因是该用 <= 的地方用了 <,或该用 >= 的地方用了 >。解决办法是在写条件之前,先选好边界测试数据。
下面有一个附追踪表的完整例子,再加一个简短的第二个例子。记法是简单的伪代码。你的路线可能使用特定风格,请到 Cambridge 官网确认。
边界错误长什么样?
学校系统应该接受 0 到 100 含两端的测验分数。下面是第一次尝试。
INPUT Mark
IF Mark > 0 AND Mark < 100 THEN
OUTPUT "Accepted"
ELSE
OUTPUT "Rejected"
ENDIF
试几个值。一位同学测了 50 和 75,两个都得到 “Accepted”,就继续往下做了。现在追踪一组更完整的值。
| Mark | Mark > 0 | Mark < 100 | 输出 | 预期 |
|---|---|---|---|---|
| 50 | 真 | 真 | Accepted | Accepted |
| 0 | 假 | 真 | Rejected | Accepted |
| 1 | 真 | 真 | Accepted | Accepted |
| 99 | 真 | 真 | Accepted | Accepted |
| 100 | 真 | 假 | Rejected | Accepted |
| −1 | 假 | 真 | Rejected | Rejected |
| 101 | 真 | 假 | Rejected | Rejected |
有两行失败:0 和 100。两者都是真实的分数,却被程序错误地拒绝了。普通的测试从来没有碰到它们。
怎样修正?
把界限放进条件里。
IF Mark >= 0 AND Mark <= 100 THEN
重新追踪失败的行。Mark = 0 得到真和真,所以是 Accepted。
Mark = 100 得到真和真,所以是 Accepted。Mark = −1 得到假,Rejected。Mark = 101 在第二个测试得到假,Rejected。
现在七行全部符合预期。
怎样选择边界测试数据?
对于下限 L 和上限 U(都含在内)的范围:
| 目的 | 取值(L = 0,U = 100) |
|---|---|
| 刚好在下限上 | 0 |
| 下限内侧一点 | 1 |
| 下限外侧一点 | −1 |
| 刚好在上限上 | 100 |
| 上限内侧一点 | 99 |
| 上限外侧一点 | 101 |
在运行任何东西之前,先写下预期结果。如果看到输出之后才决定预期结果,就等于让程序给自己打分。
第二个例子:“多于”与“至少”
一家商店规定订单总额至少 RM50 就免运费。代码如下:
IF Total > 50 THEN
Delivery ← 0
ELSE
Delivery ← 5
ENDIF
| Total | 代码给出 | 正确答案 |
|---|---|---|
| 49.90 | 5 | 5 |
| 50.00 | 5 | 0 |
| 50.10 | 0 | 0 |
只有边界值 50.00 会暴露这个错误。“至少”表示 50 包含在内,所以条件应该是 Total >= 50。
表示界限含或不含的用语
| 用语 | 条件 |
|---|---|
| 至少 50、50 或以上、从 50 起 | Total >= 50 |
| 多于 50、超过 50 | Total > 50 |
| 至多 50、不超过 50 | Total <= 50 |
| 少于 50、低于 50 | Total < 50 |
在题目里把用语划线,再从这张表选符号,而不是凭习惯。
提交条件之前的检查清单
- 把题目中的界限圈出来,判断每一个是否包含在内。
- 写下你的边界值以及每一个的预期结果。
- 用手把两三个边缘值代入条件追踪一遍。
- 每个界限之外各加一个值,再加一个异常输入。
- 重读:符号与措辞相符吗?
用受限伪代码追踪训练器逐步查看原创算法,并用安全的 Python 推理沙盒查看附有解释提示的失败测试,前提是你的路线允许。
接下来看什么
完整内容在验证、核实与测试。如果循环也让你困扰,请读我的循环停不下来,或漏掉最后一项。原创练习里有一道测试数据题,而学习指南显示了它在整个科目中的位置。
当自己检查还不够的时候
如果你追踪了边缘值,在时间压力下仍写错符号,缺口往往出在你读措辞的方式上。老师可以给你简短而多样的题目,并听你如何做决定。线上一对一 Computer Science 补习从一小时的付费试听课开始,费用按所安排老师确认的价格计算,RM80 起。