这套练习涵盖整个搜索、排序与文件模块:线性搜索、一轮排序、记录、文件结尾循环和边缘情况测试。所有数据都是虚构的。
题目由易到难。先画追踪表,写下你的答案,再打开解答。受限伪代码追踪训练器可以核对追踪,错题记录与重测队列是记录失误的地方。
第 1 到 3 题使用下面的数组(位置 1 到 6)和线性搜索课里的搜索:
| 位置 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Codes | 14 | 9 | 27 | 9 | 31 | 5 |
Found ← FALSE
Index ← 1
WHILE Index <= 6 AND Found = FALSE
IF Codes[Index] = Target THEN
Found ← TRUE
ELSE
Index ← Index + 1
ENDIF
ENDWHILE
题目
1. Target = 9。写出最终的 Index、Found 和比较次数。
显示答案
第 1 轮:Codes[1] = 14,不匹配,Index 变为 2。第 2 轮:Codes[2] = 9,匹配,Found = TRUE。Index = 2,Found = TRUE,比较 2 次。
2. Target = 40。写出最终的 Index、Found 和比较次数。
显示答案
没有任何一项匹配,所以六项都被检查,每次之后 Index 加一。Index = 7,Found = FALSE,比较 6 次。 循环因 Index <= 6 不成立而结束。
3. 把 Index ← Index + 1 移到 IF 外面,放在它之后执行。Target = 27 时,最终 Index 是多少?为什么是错的?
显示答案
匹配发生在 Index = 3,但加一仍会执行,所以 Index 最终是 4。Codes[4] 是 9,不是 27,所以报告的位置是错的。
4. 另一个列表是 [3, 8, 8, 1]。线性搜索 1,在第一个匹配处停止。共比较几次?
显示答案
依次比较 3、8、8,然后在位置 4 比较 1。比较 4 次。
5. 在 [4, 7, 2, 9, 1] 上追踪一轮冒泡排序。写出之后的列表和交换次数。
显示答案
4 与 7:不交换。7 与 2:交换,得到 4, 2, 7, 9, 1。7 与 9:不交换。9 与 1:交换,得到 4, 2, 7, 1, 9。结果 [4, 2, 7, 1, 9],2 次交换。最大值 9 在最后。
6. Data[1] = 5,Data[2] = 8。一位学生用 Data[1] ← Data[2] 然后 Data[2] ← Data[1] 来交换。最终的值是多少?
显示答案
第一行之后,Data[1] = 8。第二行把 Data[1](现在是 8)复制到 Data[2]。最终:Data = [8, 8]。5 丢失了,因为没有临时变量保存它。
7. 用标志法对 [1, 2, 3] 做一轮。之后 Swapped 是什么?它说明什么?
显示答案
没有任何一对顺序不对,所以没有发生交换。Swapped = FALSE,说明列表已经排好。
8. 行 Zara,11A,64 在逗号处拆分。写出三个字段,以及分数加 6。
显示答案
字段:Zara、11A、64。转成数字后分数是 64,64 + 6 = 70。
9. 固定宽度的行 Omar 09C055 宽度为 6、3、3。写出三个字段,并把分数写成数字。
显示答案
字符 1 到 6:Omar 。字符 7 到 9:09C。字符 10 到 12:055,作为数字是 55。
10. 文件 Marks.txt 有 6、10、14、2 四行。用文件结尾课里的求和循环,写出 Total、Count 和平均数。
显示答案
读取 6、10、14、2,累计为 6、16、30、32。循环体执行四次。Total = 32,Count = 4,平均数 = 32 / 4 = 8。
11. 同一个程序在空文件上运行。会出什么问题?怎样保护?
显示答案
循环体一次也不执行,所以 Count = 0。接着 Total / Count 会除以零。用 IF Count = 0 THEN OUTPUT "No data" ELSE OUTPUT Total / Count ENDIF 来保护。
12. 一个算法找出最高分以及它出现的次数。在 [6, 6, 2, 6, 6] 上追踪它。
显示答案
开始时 Max = 6,Times = 1。第 2 项是 6,相等,Times = 2。第 3 项是 2,不变。第 4 项是 6,Times = 3。第 5 项是 6,Times = 4。输出 6, 4。
如果你做错了
| 出了什么问题 | 去看 |
|---|---|
最终 Index、比较次数错误,或目标不存在(第 1 到 4 题) | 追踪线性搜索 |
| 一轮之后列表错误,交换时丢值(第 5 到 7 题) | 解释一轮排序 |
| 字段错误,文本被当成数字比较(第 8、9 题) | 读取记录 |
| 总和错误、循环不结束、空文件(第 10、11 题) | 处理文件结尾 |
| 重复值数错,没有测试边缘情况(第 11、12 题) | 检查空数据和重复数据 |
如果同一行总是出现,我们的老师可以通过一对一线上计算机科学补习围绕它设计额外练习。Python 推理沙盒也适合用来验证任何追踪的简短 Python 版本。