跳到正文
IGCSE·Tuition
计算机科学 · 常见难点

我的程序能运行,但在边界情况失败

你试过的例子程序都答对了,却偏偏在刚好落在边缘的那个值上给出错误答案。

本页内容
  1. 边界错误长什么样?
  2. 怎样修正?
  3. 怎样选择边界测试数据?
  4. 第二个例子:“多于”与“至少”
  5. 表示界限含或不含的用语
  6. 提交条件之前的检查清单
  7. 接下来看什么
  8. 当自己检查还不够的时候

程序在边界上失败,是因为条件对边缘值的处理与题意不同。常见原因是该用 <= 的地方用了 <,或该用 >= 的地方用了 >。解决办法是在写条件之前,先选好边界测试数据。

下面有一个附追踪表的完整例子,再加一个简短的第二个例子。记法是简单的伪代码。你的路线可能使用特定风格,请到 Cambridge 官网确认。

边界错误长什么样?

学校系统应该接受 0 到 100 含两端的测验分数。下面是第一次尝试。

INPUT Mark
IF Mark > 0 AND Mark < 100 THEN
    OUTPUT "Accepted"
ELSE
    OUTPUT "Rejected"
ENDIF

试几个值。一位同学测了 50 和 75,两个都得到 “Accepted”,就继续往下做了。现在追踪一组更完整的值。

MarkMark > 0Mark < 100输出预期
50真真AcceptedAccepted
0假真RejectedAccepted
1真真AcceptedAccepted
99真真AcceptedAccepted
100真假RejectedAccepted
−1假真RejectedRejected
101真假RejectedRejected

有两行失败: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.9055
50.0050
50.1000

只有边界值 50.00 会暴露这个错误。“至少”表示 50 包含在内,所以条件应该是 Total >= 50。

表示界限含或不含的用语

用语条件
至少 50、50 或以上、从 50 起Total >= 50
多于 50、超过 50Total > 50
至多 50、不超过 50Total <= 50
少于 50、低于 50Total < 50

在题目里把用语划线,再从这张表选符号,而不是凭习惯。

提交条件之前的检查清单

  1. 把题目中的界限圈出来,判断每一个是否包含在内。
  2. 写下你的边界值以及每一个的预期结果。
  3. 用手把两三个边缘值代入条件追踪一遍。
  4. 每个界限之外各加一个值,再加一个异常输入。
  5. 重读:符号与措辞相符吗?

用受限伪代码追踪训练器逐步查看原创算法,并用安全的 Python 推理沙盒查看附有解释提示的失败测试,前提是你的路线允许。

接下来看什么

完整内容在验证、核实与测试。如果循环也让你困扰,请读我的循环停不下来,或漏掉最后一项。原创练习里有一道测试数据题,而学习指南显示了它在整个科目中的位置。

当自己检查还不够的时候

如果你追踪了边缘值,在时间压力下仍写错符号,缺口往往出在你读措辞的方式上。老师可以给你简短而多样的题目,并听你如何做决定。线上一对一 Computer Science 补习从一小时的付费试听课开始,费用按所安排老师确认的价格计算,RM80 起。

常见问题

什么是边界情况?

边界情况是指刚好位于程序接受范围边缘、或处理方式不同的那个值。如果范围是 0 到 100(含两端),边界值就是 0 和 100,刚好在外面的值是 -1 和 101。条件最常在这些值上出错,因为 < 和 <= 只在这里才有区别。

应该选什么测试数据?

选三种。正常数据有效而典型。边界数据位于边缘,另加刚好在边缘之外的值。异常数据应被拒绝,例如该填数字的地方填了文字。对每一项,在运行程序之前先写下你预期的输出。

< 和 <= 有什么区别?

< 不包含该值,<= 包含该值。条件 Mark < 100 会拒绝刚好等于 100 的分数,而 Mark <= 100 会接受。每次都要问:边缘的值该不该算在内?然后选出与题意相符的符号。

考试中的验证题也是同样的道理吗?

是的。关于范围检查和测试数据的题目,常常取决于界限是否包含在内。仔细读措辞,例如“从 0 到 100”或“多于 50”,并在每个界限上及其附近选取测试值。

资料来源

  1. Cambridge IGCSE Computer Science 0478 syllabus page

更新于:

下一步

如果你的代码通过了自己的测试,却仍在边缘丢分,一对一的老师可以帮你养成在写条件之前先选测试数据的习惯。

一小时付费试听课,按所安排老师确认的收费,RM80 起。 试听前先确认老师的每小时收费,之后的课程也按同样收费。上课时间在试听后与老师安排。

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

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

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