欢迎来到数据类型与结构的世界!

在本章中,我们将学习计算机是如何组织信息的。你可以把“数据类型”想象成厨房里各种形状的容器——你总不会把汤放在筛子里,或者把面粉装在浅盘子里吧?同样地,计算机也会使用特定的“容器”来高效地存储不同类型的数据。无论你是要编写一个简单的计算器还是开发复杂的游戏,理解这些结构都是成为优秀程序员的第一步。如果起初觉得这些概念有点抽象,不用担心——我们会运用大量生活中的例子来帮助你理解!

10.1 数据类型与记录 (Data Types and Records)

在计算机处理数据之前,它必须知道这是什么种类的数据。这就是所谓的数据类型 (Data Type)

基本数据类型

在 9618 教学大纲中,你需要熟悉以下特定类型:

INTEGER (整数): 整数 (例如:10, -5, 1000)。
REAL (实数): 带有小数点的数据 (例如:3.14, -0.5, 2.0)。
CHAR (字符): 单个字符 (例如:'A', '!', '5')。
STRING (字符串): 一串字符或文字 (例如:"Hello World")。
BOOLEAN (布尔值): 只能是 TRUE (真)FALSE (假)
DATE (日期): 代表特定的日子 (例如:25/12/2024)。

什么是记录 (Record)?

有时候,我们会想将不同类型的数据组合在一起,因为它们属于同一个“事物”。这被称为记录 (Record)

现实生活中的例子: 想象一张图书证。它包含了 STRING (书名)、INTEGER (书本 ID) 和 DATE (还书日期)。所有这些不同类型的数据都被归纳在同一个“记录”之下。

在伪代码中定义记录

若要建立一个记录,我们使用特定的结构。以下是你如何定义一个 Student (学生) 记录的方法:
TYPE StudentRecord
    DECLARE Name : STRING
    DECLARE Age : INTEGER
    DECLARE IsEnrolled : BOOLEAN
ENDTYPE

快速复习: 记录让我们能够将多个相关项目视为一个整体,使我们的程序组织得更有条理!

10.2 数组 (Arrays)

数组 (Array) 就像学校里一排排的储物柜。每个储物柜的大小都相同,用途也一样,而且每个柜子都有编号,方便你找到它。

数组的关键术语

Index (索引): 项目在数组中的“地址”或位置。
Lower Bound (下界): 起始索引 (通常为 0 或 1)。
Upper Bound (上界): 数组中的最后一个索引。
1D Array (一维数组): 单行数据。
2D Array (二维数组): 数据网格 (就像带有行和列的电子表格)。

重要规则: 数组中的所有项目必须属于相同的数据类型。你不能拥有一个同时存储整数和字符串的数组!

搜索与排序数据

一旦数据进入数组,我们通常需要进行搜索或排序。

1. 线性搜索 (Linear Search - “逐一检查法”)

想象你在衣服堆里找某件特定的衬衫。你拿起第一件检查,然后是第二件,依此类推,直到找到为止。这就是线性搜索。它很简单,但如果数组非常大,速度可能会很慢。

2. 冒泡排序 (Bubble Sort - “交换法”)

这是一种将数组排序的方法。它的运作方式是比较两个相邻的项目。如果它们顺序错误,就进行“交换”。这个过程不断重复,直到最大的项目像气泡一样“浮”到列表的末端。

常见错误: 使用二维数组时,要时刻记住哪个索引代表行 (Row),哪个代表列 (Column)。通常写作 MyArray[Row, Column]

重点总结: 数组用于存储相同类型的多个项目。列表用一维数组,表格用二维数组。

10.3 文件 (Files)

为什么我们需要文件 (Files)?我们存储在变量或数组中的所有东西都保存在计算机的 RAM (内存) 中。当你关闭计算机时,RAM 就会被清除。为了永久保留数据,我们必须将其存储到硬盘或 SSD 的文件中。

在考试中,你会看到关于这些的伪代码:
OPENFILE: 告诉计算机你想使用哪个文件。
READFILE: 从文件中读取数据以供程序使用。
WRITEFILE: 将数据写入文件以进行存储。
CLOSEFILE: 使用完毕后一定要记得“锁门”!

你知道吗? 文本文件本质上就是一长串存储在磁盘上的字符,你的程序会逐行读取它们。

10.4 抽象数据类型 (ADT) 简介

抽象数据类型 (Abstract Data Type, ADT) 是一种数据集合,对于如何新增或删除项目有一套特定的规则。我们通常使用数组来实现 ADT。

1. 堆栈 (Stack - LIFO)

LIFO 代表 Last In, First Out (后进先出)
类比: 想象食堂里的餐盘叠。最后叠上去的餐盘,一定是第一个被拿走的。
Push (入栈): 将项目新增到最上方。
Pop (出栈): 从最上方移除项目。

2. 队列 (Queue - FIFO)

FIFO 代表 First In, First Out (先进先出)
类比: 电影院的排队人潮。第一个排进队伍的人,就是第一个买到票的人。
Enqueue (入队): 将项目新增到队尾。
Dequeue (出队): 从队首移除项目。

3. 链表 (Linked List)

链表是由“节点 (nodes)”组成的集合。每个节点包含数据以及指向列表中下一个项目的指针 (Pointer)
类比: 寻宝游戏。你找到一条线索 (数据),该线索会告诉你下一条线索在哪里 (指针)。如果指针为 Null (空),则表示你已经到达了列表的末端。

差异总结表

堆栈 (Stack): 使用单一指针 (堆栈顶部)。顺序:LIFO
队列 (Queue): 使用两个指针 (队首与队尾)。顺序:FIFO
链表 (Linked List): 使用指针连接节点;项目在内存中不一定要连续存储。

记忆小撇步: 记住 "S-L-Q-F"Stacks (堆栈) 是 LIFO,Queues (队列) 是 FIFO!

最后的鼓励: 你刚刚已经掌握了计算机处理数据的核心方法!虽然指针和冒泡排序的逻辑可能有点棘手,但只要不断想象那些生活中的例子,像是储物柜、衣物堆和食堂餐盘,你一定能行!加油!