👋 欢迎来到结构化数据的世界!
各位未来的计算机科学家,大家好!本章关于数据结构(Data Structures)的内容极其重要,因为它将带你迈出“一次存储一个数据”的阶段。可以把这想象成一次升级:从把硬币零散地塞进口袋,变成将它们整齐地归类存放在收银机中。
在“编程”部分,学会如何构建数据结构,能让你编写出高效处理海量信息的程序——例如管理全班学生的成绩,或者存储成百上千名客户的详细资料。如果一开始觉得有点绕,别担心;我们将通过简单的类比来拆解这些概念!
什么是数据结构?
数据结构(Data Structure)其实就是一种在计算机中存储和组织数据的方式,目的是为了能够高效地使用和访问这些数据。
想象一下你的厨房:
- 单一变量(比如 Age)就像一颗单独的土豆。
- 数据结构(比如数组 Array)就像一袋土豆——将许多相关联的物品归为一类。
- 另一种数据结构(比如记录 Record)就像一张食谱卡片,它能容纳不同类型的信息(名称:字符串,准备时间:整数,评分:实数)。
核心要点:数据结构帮助我们用一个单一的名字来管理大量相关联的数据,而不需要使用几百个独立的变量名。
1. 一维(1D)数组
什么是一维数组?
一维数组是结构化列表的最简形式。它是一组相同数据类型的数据集合,按顺序一个接一个地存储。
类比:想象一排编号的信箱。每个信箱里装有一条信息,而箱子上的编号就是我们找到它的方式。
一维数组的关键概念
- 同构(Homogeneous): 所有项(称为元素 Element)必须是相同类型(例如,全为整数,或全为字符串)。
- 索引(Index,或下标 Subscript): 这是用于访问数组中特定元素的位置编号。根据编程语言的不同,索引通常从 0 或 1 开始。
访问一维数组中的数据(索引)
假设我们有一个名为 Scores 的数组,存储了五名学生获得的积分。
| 索引 | 1 | 2 | 3 | 4 | 5 |
| 值 | 15 | 22 | 18 | 30 | 10 |
要找到分数 18,我们需要查询 Scores[3]。这里的数字 3 就是索引。
💡 记忆小贴士: 1D 意味着你只需要一个方向(One Direction)就能找到你的数据——你只需要顺着直线移动即可。
一维数组在编程中的应用
数组非常适合:
- 存储一周的每日气温。
- 保存一支队伍中所有队员的名单。
- 存储密码尝试记录列表。
它们是列表。它们存储同一种类型的数据。它们使用一个索引来定位项目。
2. 二维(2D)数组
什么是二维数组?
二维数组是一种将元素组织成网格格式的数组,就像表格或电子表格一样。你可以把它看作是多个一维数组堆叠在一起。
类比:这就像电影院的座位图。要找到你的座位,你需要两个信息:行号 AND 座位号。
二维数组的关键概念
要定位二维数组中的任何元素,你需要两个索引:
- 第一个索引通常指代行(Row)。
- 第二个索引通常指代列(Column)。
其结构通常描述为(行,列)。
访问二维数组中的数据
想象一个名为 Grades 的数组,存储了 3 名学生在 4 次不同测试中的成绩。
| 第1列 (测试 A) | 第2列 (测试 B) | 第3列 (测试 C) | 第4列 (测试 D) | |
| 第1行 (学生 A) | 85 | 70 | 92 | 75 |
| 第2行 (学生 B) | 60 | 95 | 88 | 80 |
| 第3行 (学生 C) | 90 | 80 | 70 | 99 |
如果我们想找到学生 B 在测试 C 中的成绩,我们会查找 Grades[2, 3] 的值,即 88。
如果一开始觉得难,不用担心!只需记住:第一个数字告诉你查看哪条水平线(行),第二个数字告诉你横向移动多远(列)。
二维数组的用途
二维数组在以下场景中必不可少:
- 存储棋盘游戏(比如棋盘上的坐标)。
- 表示图像(其中每个元素都是像素颜色)。
- 存储多年来的月度销售数据。
避免常见的错误: 学生有时会把行和列的索引搞反。一定要确认你的程序首先索引的是哪一个(行,列)或(列,行),并始终保持一致!
核心要点: 二维数组将数据存储在网格中,需要两个索引来指定位置。
3. 记录(结构体)
将不同数据类型组合在一起
我们已经学过,数组必须存储相同类型的数据(全是整数或全是字符串)。但如果我们想存储关于某个复杂实体(例如学生)的信息,其中包括文本、数字甚至是布尔值,该怎么办呢?
这就轮到记录(Record)(有时也称为结构体 Structure)登场了。
什么是记录?
记录是相关项目的集合(称为字段 Fields),这些项目可以属于不同的数据类型,它们被组合在同一个名称之下。
类比:图书馆的目录卡片。它将图书标题(字符串)、作者(字符串)和书架号(整数)组合在一起,尽管它们是不同类型的数据。
定义记录结构
在创建记录之前,我们必须先定义它的结构(它所包含的字段)。
示例:为商店库存中的单项商品定义结构:
DEFINE RECORD ItemDetails
Name : STRING
ItemID : INTEGER
Price : REAL
InStock : BOOLEAN
END RECORD
访问记录中的数据(字段访问)
定义好结构后,我们就可以创建该类型的变量。让我们利用 ItemDetails 结构创建一个名为 Laptop 的变量。
要访问特定的信息(字段),通常使用“记录变量名”加上点号(`.`)和“字段名”:
- 查找价格:
Laptop.Price - 检查是否有货:
Laptop.InStock
记录与数组:本质区别
| 特性 | 数组 (1D 或 2D) | 记录 |
| 数据类型 | 必须是同构的(全是同种类型)。 | 可以是异构的(混合了不同类型)。 |
| 访问方式 | 使用数字索引访问元素(例如 Array[5])。 |
使用字段名访问元素(例如 Record.Name)。 |
你知道吗?
在编程中,记录常用于定义对象或用户自定义类型,使代码更加清晰。如果你要存储 100 名学生的信息,你会创建一个记录数组(Array of Records)!这既结合了记录的结构(用于描述复杂的学生数据),又发挥了数组的列表功能(用于容纳 100 名学生)。
核心要点: 记录将不同类型的数据(字段)组合在一起,以描述一个复杂的实体。
本章总结:组织你的代码
恭喜!你现在已经掌握了编程中组织数据的基本构件。
🧠 数据结构快速回顾
- 一维数组: 一个简单的列表。需要一个索引。所有项必须是同一种类型。
- 二维数组: 一个网格/表格。需要两个索引(行,列)。所有项必须是同一种类型。
- 记录: 定义一个复杂实体(如学生或商品)。将不同数据类型(字段)组合在一起,通过字段名进行访问。
通过掌握这些结构,你已经准备好编写能够专业地存储和管理数据的强大程序了。继续练习那些索引方法,你很快就能成为专家!