好的修正描述有四个部分:错误在哪里、什么错了、为什么导致结果错、要改什么。单独的代码只展示最后一部分,阅卷员无法判断你是理解了错误,还是抄了一行。
这一课属于解题说明单元。它接在说明测试用例的理由之后,因为失败的测试正是发现大多数错误的方式。
完整的描述包含什么?
- 哪里: 行号或语句,例如“第 6 行”。
- 什么错了: 具体的问题,如除数错误、比较错误、缺少语句或循环上限错误。
- 为什么重要: 对输出的影响,最好带上测试数据中的一个数值。
- 改动: 用文字写出最小的修正,也可以附上修正后的那一行。
用要求作为证据:“要求是三个数字的平均值,但代码除以 2”。
例题
要求:读入三个数字,输出它们的平均值。
1 Total ← 0
2 FOR Index ← 1 TO 3
3 INPUT Number
4 Total ← Total + Number
5 NEXT Index
6 Average ← Total / 2
7 OUTPUT Average
测试数据 4、6、8 应该得到 6(因为 4 + 6 + 8 = 18,18 / 3 = 6)。程序却输出 9。
哪里: 第 6 行。
什么错了: Total 除以 2,但输入的是三个数字。
为什么重要: 用测试数据,18 / 2 = 9,不是预期的 6。
改动: 除以 3,也就是读入的数值个数。更稳妥的做法是除以一个记录输入个数的变量,这样循环上限改变时这一行仍然正确。修正后的行:Average ← Total / 3。
检查修正。 用 4、6、8:18 / 3 = 6,与预期结果相符。
要提防的错误
不好的答案是:
程序错了,因为平均值不对。把它改成能给出正确平均值。
没有行号,没有错误,也没有改动。第二种不好的写法是用另一种结构把七行全部重写,阅卷员看不出到底是哪里错了。
改正:“第 6 行把 Total 除以 2,但输入了三个数值,所以输入 4、6、8 时输出是 9 而不是 6。把除数改成 3。”
自我检测
1. 这段代码应该把整数 1 到 10 相加(答案是 55),却输出 45。请描述修正。
1 Total ← 0
2 FOR N ← 1 TO 9
3 Total ← Total + N
4 NEXT N
5 OUTPUT Total
显示答案
第 2 行的上限错了。循环在 9 就停止,所以 10 从未被加上,总和是 1 + 2 + … + 9 = 45,而不是 55。把上限从 9 改成 10:FOR N ← 1 TO 10。
2. 规则是“成绩 50 或以上输出 Pass”。成绩正好 50 时没有输出。请描述修正。
1 INPUT Mark
2 IF Mark > 50 THEN
3 OUTPUT "Pass"
4 ENDIF
显示答案
第 2 行用了 >,它不包括 50,但规则说的是“50 或以上”。成绩正好 50 通不过测试,所以不会输出 “Pass”。把 > 改成 >=:IF Mark >= 50 THEN。
3. 代码应输出三件物品价格(5、6 和 7,共 18)的总价,却输出 7。请描述修正。
1 Total ← 0
2 FOR I ← 1 TO 3
3 INPUT Price
4 Total ← Price
5 NEXT I
6 OUTPUT Total
显示答案
第 4 行把 Price 赋给 Total,而不是加到 Total 上,所以每一轮都会覆盖前一个值,只剩最后一个价格 7。改成 Total ← Total + Price,价格就会累加:5、11、18。
接下来学什么
学会描述修正之后,下一步是说明程序为什么给出这个输出:把追踪表和最终输出联系起来。受限伪代码追踪训练器可以帮你在描述之前先测试修正。
如果你常常能发现错误,却在怎么说明修正上丢分,我们的老师可以在线上一对一计算机科学补习中和你一起打磨措辞。