# 记录

> 计算机科学 · CIE A-Level 9618
> 来源: https://www.owlsprep.com/zh/study/cie-9618-u10-records/

记录是核心复合数据类型，可将不同类型的相关值组合在一起，描述现实世界实体。本模块内容包括记录声明、字段访问、记录数组以及CIE考试规范。

**先修:** [原始数据类型](https://www.owlsprep.com/zh/study/cie-9618-u10-primitive-data-types/); [一维数组](https://www.owlsprep.com/zh/study/cie-9618-u10-arrays/)

## 学习目标

- 将记录定义为一种复合数据类型
- 遵循CIE伪代码规范声明记录和实例
- 使用点表示法访问和修改记录字段
- 实现并处理记录数组

## 1. 什么是记录？

**记录（复合数据类型）** — 由相关数据项（称为字段）组成的固定集合，这些数据项可以是不同数据类型，用于表示单个现实世界或抽象实体的属性。

*例:* 一个`Student`（学生）记录可以包含姓名（字符串）、年龄（整数）和注册状态（布尔值）字段。

与数组不同（数组存储同一类型的多个值，通过索引访问），记录分组异构数据，每个字段由唯一名称标识。这使得记录非常适合对具有多个不同属性的结构化对象建模。

> **info**
>
> 记录在类C语言中称为结构体，是面向对象编程中对象的基础。CIE考试伪代码对所有记录声明都使用标准`RECORD`关键字。

**例题:** 判断以下哪一项最适合用单个记录表示：(A) 100个考试分数的列表，(B) 单个客户订单的详细信息，(C) 包含50条员工条目的表格

1. 记住单个记录描述一个具有多个属性的实体，逐一检查选项：
2. 选项A：所有考试分数都是相同类型的整数 → 最适合用数组存储，而非单个记录。
3. 选项B：客户订单具有多个不同类型的属性：订单ID（整数）、客户姓名（字符串）、总费用（浮点数） → 符合单个记录的定义。
4. 选项C：50条员工条目 → 每个员工是一个记录，因此这是一个记录数组，而非单个记录。
5. 最终答案：B

## 2. 在CIE伪代码中声明记录

**记录声明** — 定义新记录类型结构的过程，包括每个字段的名称和数据类型。声明完成后，即可使用该记录类型创建单个实例。

CIE考试对记录声明遵循标准伪代码格式，你必须使用该格式才能获得满分。通用格式如下：

$$\begin{aligned} \text{DECLARE } &\langle\text{RecordName}\rangle \text{ RECORD} \\ &\langle\text{Field1}\rangle : \langle\text{DataType}\rangle \\ &\langle\text{Field2}\rangle : \langle\text{DataType}\rangle \\ &... \\ \text{END RECORD} \end{aligned}$$

**例题:** 声明一个名为`Movie`的新记录类型，包含以下字段：标题（字符串）、发行年份（整数）、评分（实数）、是否可借阅（布尔值）。然后创建一个名为`myMovie`的实例。

1. 开始记录声明：
2. $$DECLARE Movie RECORD$$
3. 声明每个字段及其数据类型：
4. $$title : STRING \\ releaseYear : INTEGER \\ rating : REAL \\ isAvailable : BOOLEAN$$
5. 结束声明并实例化记录：
6. $$END RECORD \\ DECLARE myMovie : Movie$$

> **tip**
>
> 始终使用`END RECORD`结束声明。遗漏这一步会让你在CIE考试中白白丢掉一分。

## 3. 访问和修改记录字段

记录中的字段使用点表示法访问，这是CIE伪代码和大多数编程语言的标准格式。格式为：$\textit{<record_instance>}.\textit{<field_name>}$。该表示法既可用于读取字段值，也可用于赋值新值。

**例题:** 使用上一节的`Movie`记录类型，为`myMovie`赋值，并输出标题和发行年份。

1. 使用点表示法为每个字段赋值：
2. $$myMovie.title \leftarrow "Inception" \\ myMovie.releaseYear \leftarrow 2010 \\ myMovie.rating \leftarrow 8.8 \\ myMovie.isAvailable \leftarrow TRUE$$
3. 读取字段值并输出：
4. $$OUTPUT myMovie.title + " (" + STRING(myMovie.releaseYear) + ")"$$
5. 最终输出为：`Inception (2010)`

**概念自测**

测试你对点表示法的理解：

1. 输出`myMovie`实例评分的正确方式是哪一个？

   - OUTPUT Movie.rating
   - OUTPUT myMovie(rating)
   - OUTPUT myMovie.rating
   - OUTPUT rating.myMovie

   *答案:* OUTPUT myMovie.rating

   *解析:* 正确！点表示法遵循`实例名称.字段名称`的顺序，不能使用记录类型名称访问字段。

## 4. 记录数组

在CIE考试中，记录最常见的用途是将多个同类型实体存储为记录数组。这结合了数组（可简单迭代元素）和记录（每个实体存储异构属性）的优点。例如，你可以将100部电影存储为数组，其中每个元素都是一个`Movie`记录。

**例题:** 声明一个包含20个`Movie`记录的数组，名为`cinemaCollection`，然后输出所有评分高于8.0的电影标题。

1. 在定义`Movie`记录类型后声明数组：
2. $$DECLARE cinemaCollection : ARRAY[1:20] OF Movie$$
3. 遍历每个元素，检查评分字段，输出符合条件的标题：
4. $$FOR index \leftarrow 1 TO 20 \\ \quad IF cinemaCollection[index].rating > 8.0 THEN \\ \quad \quad OUTPUT cinemaCollection[index].title \\ \quad ENDIF \\ ENDFOR$$
5. 该循环正确检查了数组中的每个记录，仅输出满足条件的标题。

> **info**
>
> 还可以使用嵌套记录，即一个记录的某个字段本身是另一个记录类型。点表示法可以自然扩展：`myStudent.nextOfKin.phoneNumber`即可正确访问嵌套字段。

## 常见错误

- **错误做法:** 访问字段时混淆记录类型和记录实例。
  - 原因: 记录类型只是模板，只有实例才存储实际数据值。
  - 正确做法: 始终使用`instanceName.fieldName`，而非`typeName.fieldName`。
- **错误做法:** 忘记用`END RECORD`结束记录声明。
  - 原因: CIE评分标准要求明确结束RECORD块才能给满分。
  - 正确做法: 始终在声明完记录的所有字段后添加`END RECORD`。
- **错误做法:** 记录数组中字段的点表示法顺序错误。
  - 原因: 学生经常写错顺序，写成`arrayName.fieldName[index]`而非正确顺序。
  - 正确做法: 先对数组索引，再访问字段：`arrayName[index].fieldName`。
- **错误做法:** 使用单个记录存储多个实体。
  - 原因: 记录设计用于描述单个实体。在一个记录中存储多个实体会导致无法迭代。
  - 正确做法: 使用记录数组：每个实体对应一个记录，作为数组元素存储。

## 速查表

| 概念 | CIE伪代码格式 |
| --- | --- |
| 声明记录类型 | DECLARE &lt;Name&gt; RECORD<br>&lt;Field&gt;: &lt;Type&gt;<br>END RECORD |
| 声明记录实例 | DECLARE &lt;InstanceName&gt;: &lt;RecordName&gt; |
| 访问记录字段 | &lt;Instance&gt;.&lt;FieldName&gt; |
| 声明记录数组 | DECLARE &lt;ArrayName&gt;: ARRAY[&lt;low&gt;:&lt;high&gt;] OF &lt;RecordName&gt; |
| 访问记录数组中的字段 | &lt;ArrayName&gt;[&lt;index&gt;].&lt;FieldName&gt; |

## 下一步

记录是基础复合数据类型，你在CIE A-Level计算机科学的试卷1解题和试卷2编程任务中都会大量使用。掌握记录声明和字段访问对于处理结构化的现实世界数据至关重要，也为理解更高级的数据结构（如链表、类和关系数据库条目）奠定基础。记录经常与文件处理结合使用，你需要将记录读写到文本或二进制文件中以存储持久化数据。理解如何迭代记录数组也是实现排序和搜索算法的常见要求，而这两项都是考试核心考点。

- [链表](https://www.owlsprep.com/zh/study/cie-9618-u10-linked-lists/)
- [栈](https://www.owlsprep.com/zh/study/cie-9618-u10-stacks/)
- [队列](https://www.owlsprep.com/zh/study/cie-9618-u10-queues/)

---

来自 [OwlsPrep](https://www.owlsprep.com) —— A-Level / IB / AP / IGCSE 免费学习指南，依据官方考纲编写。原页面：https://www.owlsprep.com/zh/study/cie-9618-u10-records/
