这些题目涵盖整个解题说明单元:变量的用途、有依据的测试用例、修正的描述、追踪表与输出的联系,以及最小例子。题目都是原创的,由易到难排列。
请先用完整句子写出你的答案;追踪题要画出表格。然后打开答案对照。受限伪代码追踪训练器和安全的 Python 推理沙盒可以检查你的数值。
题目
1.(容易) 说明这段代码中 Count 的用途。
Count ← 0
FOR Index ← 1 TO 4
INPUT Age
IF Age >= 18 THEN
Count ← Count + 1
ENDIF
NEXT Index
OUTPUT Count
显示答案
Count 是计数器。它保存到目前为止输入的年龄中 18 岁或以上的个数。它从 0 开始,因为还没有数过任何东西;只有当 Age >= 18 为真时才加 1;循环结束后作为最终数字输出。
2.(容易) 某个搜索在循环前设 Found ← FALSE,看到目标时设 Found ← TRUE。说明为什么需要 Found。
显示答案
Found 是标志,记录是否已经见过目标。它从 FALSE 开始,因为还没找到任何东西。一旦设为 TRUE 就保持 TRUE,所以循环结束后程序可以测试它,决定输出 “Found” 还是 “Not found”。
3.(容易) 要求:座位号必须是 1 到 40(含)的整数。给出四个边界测试,写出预期结果和理由。
显示答案
- 1: 接受,因为“从 1”包含下限。
- 40: 接受,因为“到 40(含)”包含上限。
- 0: 拒绝,因为刚好低于下限。
- 41: 拒绝,因为刚好高于上限。
4.(中等) 要求:订单总额达到 RM150 或以上时免运费。给出三个测试,写出预期结果和理由。
显示答案
- RM149.99: 收运费,因为刚好低于界限。
- RM150: 免运费,因为“或以上”包含正好 RM150。这能发现误用
>而不是>=。 - RM200: 免运费,是远在规则之内的正常值。
5.(中等) 描述修正。价格 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,而不是累加,所以只剩最后一个价格 7。改成 Total ← Total + Price。这样数值依次是 5、11、18,就是预期输出。
6.(中等) 这段代码应该输出 1、2、3 然后停止,却永远不会结束。描述修正。
1 Count ← 1
2 WHILE Count <= 3 DO
3 OUTPUT Count
4 ENDWHILE
显示答案
Count 在循环内从未改变,所以 Count <= 3 永远为真,1 被不断输出。在循环内最后加上 Count ← Count + 1,放在 OUTPUT 之后。于是 Count 依次是 1、2、3、4,循环在输出 1、2、3 之后结束。
7.(中等) 追踪这段代码,写出输出,并用一句话解释。
X ← 3
Y ← 0
WHILE X > 0 DO
Y ← Y + X * X
X ← X - 1
ENDWHILE
OUTPUT Y
显示答案
| 轮次 | X > 0 ? | 之后的 Y | 之后的 X |
|---|---|---|---|
| 开始 | 0 | 3 | |
| 1 | 3 > 0 真 | 9 | 2 |
| 2 | 2 > 0 真 | 13 | 1 |
| 3 | 1 > 0 真 | 14 | 0 |
| 测试 | 0 > 0 假 | 14 | 0 |
Y 累加平方数 9、4 和 1。X 变成 0 时循环停止,OUTPUT Y 输出 14。
8.(中等) 追踪代码,给出两个输出。
Even ← 0
Odd ← 0
FOR N ← 1 TO 6
IF N MOD 2 = 0 THEN
Even ← Even + N
ELSE
Odd ← Odd + N
ENDIF
NEXT N
OUTPUT Even
OUTPUT Odd
显示答案
N = 1:Odd 为 1。N = 2:Even 为 2。N = 3:Odd 为 4。N = 4:Even 为 6。N = 5:Odd 为 9。N = 6:Even 为 12。Even 累加 2 + 4 + 6,Odd 累加 1 + 3 + 5。输出依次是 12 和 9。
9.(较难) 一位学生说第 7 题的输出是 0,“因为 X 最后是 0”。说明他错在哪里。
显示答案
这位学生读错了变量。0 是 X 的最终值,它使循环结束,但语句是 OUTPUT Y。Y 那一列的最后一个值是 14,所以输出是 14。学生应该先看 OUTPUT 语句指名的变量,再去读它那一列。
10.(较难) 一个长程序应该统计大于 10 的数值个数。对数据 5、10、15,它输出 2。写出带有预期和实际输出的最小可重现例子,并描述修正。
显示答案
Data[1] ← 5
Data[2] ← 10
Data[3] ← 15
Count ← 0
FOR I ← 1 TO 3
IF Data[I] >= 10 THEN
Count ← Count + 1
ENDIF
NEXT I
OUTPUT Count
预期:1(只有 15 大于 10)。实际:2(10 和 15)。条件用了 >=,它包含 10,但要求说的是“大于 10”。改成 IF Data[I] > 10 THEN。正是边界上的数据 10 暴露了错误。
11.(较难) “分数从 0 到 100(含)”的测试计划用了 0、50、100 和 101。指出缺了什么,以及为什么重要。
显示答案
缺少刚好低于下限的测试 −1。没有它,错误地接受负分的规则也能通过这个计划。再加一个类型错误的值,例如 “ten”,也有用,因为规则说分数是数字。应加上 −1(拒绝,低于下限)和 “ten”(拒绝,不是数字)。
答错了怎么办
- 第 1、2 题: 你的答案重复了名字或代码,或没有说明起始值为什么重要。请复习说明变量的用途。
- 第 3、4、11 题: 你测试了值却没有理由,或漏掉了边界。请复习用要求来说明测试用例的理由。
- 第 5、6 题: 对错误或修正的描述太松散。请复习描述修正,而不只是写出代码。
- 第 7、8、9 题: 表格是对的,输出却读错了。请复习把追踪表和最终输出联系起来。
- 第 10 题: 例子太大、太小,或没有预期输出。请复习准备最小可重现的学习例子。
用错题记录与重测队列记下错误类型,几天后再重测。单元总览解题说明列出完整的学习路线。
如果你想有人对照得分点阅读你写的答案,我们的老师可以在线上一对一计算机科学补习中帮你。