数据存储

假设您开发了一款名为“User Hostile”的计算机游戏,玩家在其中与复杂且不友好的计算机界面竞争。现在您需要编写一个程序来跟踪该游戏在五年内的月销售额。或者假设您需要清点 Hacker Hero Trading Cards。
很快您就会得出结论,您需要的不仅仅是简单的基本数据类型来存储和处理信息。
 

数组(列表)。简介

为了方便处理大量数据,一组单元格被赋予一个通用名称。这样的一组单元格称为数组
数组 –它是一组相同类型的存储单元,并排放置并具有共同的名称。组中的每个单元格都有一个唯一的编号。

使用数组时,您需要学习如何解决三个任务:
X为数组分配所需大小的内存
X将数据写入所需的单元格
X从单元格中读取数据


Pascal 中的数组


传统上 Pascal 使用像

这样的静态数组 <前> var a: array [1..10] of integer;

数组的边界必须由常量设置,并且您不能在程序运行期间更改数组的大小。但是您不仅可以为整数创建索引,还可以为字符或枚举类型创建索引。例如,要计算每个字母的出现次数,可以使用数组

<前> var LettersCount: array ['a'..'z'] of integer;

并随心所欲地使用它:

<前> LettersCount['z'] := 1; LettersCount['d'] := LettersCount['d'] + 1;

这种数组的缺点是众所周知的:如果事先不知道需要使用多少元素,那么会为数组分配最大大小的内存。结果,在大多数情况下,我们“为未来储备”,有时这种“储备”事实证明还不够。这就是为什么这样的数组被称为  static 的原因:它们的大小是静态的,必须在程序编译阶段设置。但是,在Pascal 中有  动态数组,其大小不仅可以设置,还可以在程序运行过程中改变。将进一步讨论这些阵列以及使用它们的优势。

创建数组

创建数组时,在内存中分配空间(一定数量的单元格) <前> 1) 数组可以是通过简单地列出元素创建: <前> var a:整数数组; 设置长度(一,3); [0] := 1; 一个 [1] := 2; a[2] := 3;
2) 数组可以由任何类型的数据组成——整数或实数、字符串  <前> var a: 字符数组; 设置长度(一,3); a[0] := 'a'; a[1] := 'b'; a[2] := 'c'; 3) 数组总是“知道”你的尺码。  length 函数用于确定数组的大小。通常数组的大小存储在一个单独的变量中,以便可以轻松更改程序以使用不同的数组大小。例子: <前> N := 10; // 在变量 N 中,我们存储数组的大小 SetLength(a, N); // 设置数组和大小 N writeln(长度(a)); //显示数组的大小 数组的大小可以通过键盘设置。

引用数组元素

数组的大部分用处在于它的元素可以单独访问。
这样做的方法是使用索引对元素进行编号。
Index 是指向特定数组元素的值

记住!
PASCAL 中的数组编号从零开始!

(这是强制性的 - 您必须从头开始。记住这一点尤为重要)

访问数组 A 的示例: <前> x := (A[3] + 5) * A[1] //读取A[3]和A[1]的值 A[0] := x + 6 // 将新值写入 A[0] 让我们分析一下处理数组元素的程序。 <前> 变量 i:整数; a:整数数组; 开始    我:= 1;    设定长度(一,5); //创建一个包含 5 个元素的数组      [0] := 23; // 数组的 5 个元素中的每一个(索引从 0 到 4)    一 [1] := 12; // 写一个特定的值     [2] := 7;    一 [3] := 43;     [4] := 51;     a[2] := a[i] + 2 * a[i - 1] + a[2 * i]; // 将索引为 2 的元素的值更改为表达式的结果     // 因为 i=1,所以将变量 i 的值代入我们得到的表达式     // 下一个表达式  a[2] := a[1] + 2*a[0] + a[2];     writeln(a[2] + a[4]); 结尾。
作为运行的结果该程序将索引为 2 和索引 4 的数组元素之和的值等于 116 将出现在屏幕上。从示例中可以看出,我们可以访问数组的任何元素.并且还使用各种公式计算所需的元素数量(例如,在程序 A[i-1] 或 A[2*i] 中,在这些情况下,将计算元素的索引并取决于i.)的值

让我们看一个示例程序 <前> var a:整数数组; 开始    设定长度(一,5);     [5] := 5; a[-1] := 0; 结尾。

因为该数组声明为包含 5 个元素,因此元素将被编号 从 0 到 4。我们看到第6行的程序引用了一个不存在的元素а [5] 并且在第 7 行到同样不存在的 a[-1]。

原来是程序越界了
数组越界正在访问数组中不存在的索引元素。
在这种情况下,程序通常会因运行时错误
而崩溃

 
 

使用数组时,通常必须同时处理数组的所有元素。
迭代元素:我们查看数组的所有元素,如有必要,对每个元素执行一些操作。
为此,最常使用带有变量的循环,变量从 0 变为 N-1,其中 N 是数组元素的数量。
N下我们会考虑数组当前的大小,即
N := 长度(A) <前> ... for i := 0 to n - 1 开始 // 这里我们使用 a[i] 结尾; ... 在指定的循环中,变量i将取值0,1,2,...,N-1。 因此,在循环的每一步,我们都访问数组中编号为 i 的特定元素。
因此,只需描述需要对数组 a[i] 中的一个元素执行的操作并将这些操作放在这样一个循环中即可。

让我们编写一个程序,用前 N 个自然数填充数组,即在程序结束时,数组的元素应该变得相等 <前> [0] = 1 一个 [1] = 2 一个 [2] = 3 ... a[N - 1] = N 很容易看出模式:数组元素的值必须比元素的索引大 1。
循环看起来像这样 <前> 因为我 := 1 到 n - 1 做 a[i] := i + 1; 完成任务。