数组(array)用一个名字存放若干个同类型的值。每个值有一个下标(index),也就是它的位置,用 Name[index] 来访问。下标和值是两回事,把它们混淆是答案出错的常见来源。
这一课把循环技能与数组结合起来,完成重复与数组模块。它接在找最大值之后,那里位置和值都出现过。
怎样读数组?
数组带着边界和类型一起声明:
DECLARE Level : ARRAY[1:5] OF INTEGER
假设它存着这些值。
| 下标 | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| Level[下标] | 3 | 5 | 2 | 5 | 4 |
Level[3] 是 2。下标是 3,值是 2。
值本身也可以用作下标。Level[Level[2]] 的意思是:先算出 Level[2],它是 5,再找 Level[5],它是 4。
例题详解
这个算法找出最大值存放的位置。
Pos ← 1
FOR i ← 2 TO 5
IF Level[i] > Level[Pos]
THEN
Pos ← i
ENDIF
NEXT i
OUTPUT Pos, Level[Pos]
Pos 存的是下标,所以它永远是 1 到 5 的数字。Level[Pos] 是该下标处的值。
| i | Level[i] | 之前的 Level[Pos] | Level[i] > Level[Pos]? | 之后的 Pos |
|---|---|---|---|---|
| 2 | 5 | 3 | 真 | 2 |
| 3 | 2 | 5 | 假 | 2 |
| 4 | 5 | 5 | 假 | 2 |
| 5 | 4 | 5 | 假 | 2 |
输出是 2, 5:下标是 2,存放在那里的值是 5。如果代码在循环结束后输出的是 i 而不是 Pos,显示的就是循环变量,而不是最大值的位置。
要留意的错误
常见的失误是题目要求加值,却加了下标。
错误的代码:
Total ← Total + i这会算出 1 + 2 + 3 + 4 + 5 = 15,也就是各个位置的总和。
纠正的方法是 Total ← Total + Level[i],它算出 3 + 5 + 2 + 5 + 4 = 19。追踪时,把 i 和 Level[i] 分成两列来写。两列都摆在纸上,就不容易混在一起。
自我检测
使用上面的数组 Level。
1. Level[4] 和 Level[Level[3]] 各是多少?
显示答案
Level[4] 是 5。Level[3] 是 2,所以 Level[Level[3]] 就是 Level[2],即 5。
2. 这段代码输出什么?
FOR i ← 1 TO 5
IF Level[i] = 5
THEN
OUTPUT i
ENDIF
NEXT i
显示答案
它输出值为 5 的下标。Level[2] 和 Level[4] 都等于 5,所以输出是 2 然后 4。它输出的不是值 5。
3. 如果代码试图读取 Level[6],会发生什么?
显示答案
边界是 1 到 5,所以位置 6 不存在。程序会因出错而停止。追踪时写“下标超出边界”。
接下来学什么
循环、错误和数组都学完了,接下来在重复与数组练习中把它们一起测试。想看每一轮下标和值怎样变化,可以使用伪代码追踪训练器。
计算机科学补习的老师可以请你对着自己的作答,逐行解释括号里每个数字的含义。