要说明变量(variable)的用途,请写出它保存什么值、什么时候变化、算法为什么需要它。凡是给出一段短算法,要求你“说明变量的用途”或“解释为什么使用 X”,都在检查你是否真正读懂了它。
这一课是解题说明单元的第一课,建立在适用大纲的伪代码中变量赋值和追踪的基础上。
什么样的用途说明才完整?
好的答案有三个部分。
- 保存什么: 变量在任何时刻保存的东西,例如“成绩的累计总和”。
- 何时变化: 何时、如何更新,例如“每读到一个 50 分或以上的成绩就加 1”。
- 为什么: 它为算法做的事,例如“这样循环结束后才能输出最终个数”。
常见的角色有计数器(counter)、累计总和、到目前为止的最大值或最小值、标志(flag,TRUE 或 FALSE)、循环索引和临时存放。说出角色有帮助,但句子仍然要写明数的是什么、存的是什么。
例题
Total ← 0
FOR Index ← 1 TO 4
INPUT Mark
IF Mark >= 50 THEN
Total ← Total + 1
ENDIF
NEXT Index
OUTPUT Total
输入的成绩是 62、45、50 和 38。请说明 Total、Mark 和 Index 的用途。
Total。 它是计数器,保存到目前为止输入的成绩中 50 分或以上的个数。它从 0 开始,因为还没有数过任何成绩,只有在 IF 条件为真时才加 1。
Mark。 它保存刚刚输入的那一个成绩。每次新的 INPUT 都会覆盖它,所以每次只测试当前这个成绩。
Index。 它是循环计数器,保存正在处理第几个成绩,从 1 到 4,并让循环正好重复四次。
用数据检查。 62 被计入(Total 为 1)。45 不计。50 被计入,因为测试用的是 >=(Total 为 2)。38 不计。输出是 2,与“50 分或以上的成绩个数”相符。
要提防的错误
空泛的答案只是重复名字或代码:
Total 保存 total。 或者 Total 就是 Total + 1。
这没有提供任何新信息。它没有说明在累计什么,而且这里它其实不是成绩的总和,而是一个个数。
改正:“Total 是计数器,保存已输入成绩中 50 分或以上的个数。它从 0 开始,每当成绩通过测试就加 1,以便最后输出。”
自我检测
1. 说明这段代码中 Largest 的用途。
Largest ← 0
FOR I ← 1 TO 3
INPUT N
IF N > Largest THEN
Largest ← N
ENDIF
NEXT I
OUTPUT Largest
显示答案
Largest 保存到目前为止输入的最大数字。每当读到更大的数,就用 N 替换它。它从 0 开始,这样第一个正数就会替换它,最后作为答案输出。(如果输入的数全是负数,答案就会错,因为 0 会一直是最大值。)
2. 在下面的交换中,说明为什么需要 Temp。
Temp ← A
A ← B
B ← Temp
显示答案
Temp 暂时保存 A 的原值。第 2 行把 A 覆盖成 B,如果没有 Temp,A 的旧值就丢失了,B 也就拿不到它。例如 A = 3、B = 8 时,Temp = 3,A = 8,B = 3。
3. 一位学生写道:“Found 用来找。”请就这个搜索重写:开始时 Found 设为 FALSE,看到目标时设为 TRUE。
显示答案
Found 是标志。如果在列表中见过目标值,它保存 TRUE,否则保存 FALSE。它从 FALSE 开始,因为还没找到任何东西;出现匹配时变为 TRUE;循环结束后用它来决定输出哪条信息。
接下来学什么
下一步,从说明变量转到为测试辩护:用要求来说明测试用例的理由。受限伪代码追踪训练器能展示每个变量如何变化,帮你描述它的角色。
如果你懂代码,却在书面句子上丢分,我们的老师可以在线上一对一计算机科学补习中和你一起阅读、修改。