欢迎来到程序设计的世界!
你好!无论你是编码高手还是刚起步的初学者,这一章都是计算机科学的“引擎室”。程序设计的本质,就是给计算机一套指令来解决问题。这就像写食谱一样:只要正确地遵循步骤,你就能做出美味的蛋糕(在我们的例子中,就是一个运作顺畅的应用程序!)。
如果起初觉得内容有点多,请不用担心。我们会将其拆解成容易消化的小单元,让你顺利掌握 AQA A Level Computer Science (7517) 课程的核心基础。让我们开始吧!
1. 构建基础:数据类型 (Data Types)
在编写代码之前,我们需要了解我们正在处理的数据种类。想象一个仓库,你将物品存放在不同类型的箱子里。你肯定不会把液体装进纸箱里,对吧?数据类型就像那些专用的箱子。
常见数据类型
- 整数 (Integer): 整数(例如:7, -12, 100)。不允许有小数点!
- 实数/浮点数 (Real/Float): 带有小数点的数字(例如:3.14, -0.01)。
- 布尔值 (Boolean): 只有 True(真) 或 False(假)。就像电灯开关一样。
- 字符 (Character): 单一字母、数字或符号(例如:'A', '$', '4')。
- 字符串 (String): 一串字符的集合。通常是文字(例如:"Hello World")。
- 日期/时间 (Date/Time): 专门用于日历日期和时钟时间。
- 指针/引用 (Pointer/Reference): 这存储了对象所在的 内存地址。它不存储数据本身,而是告诉计算机去哪里找到数据。
- 数组 (Arrays): 将相同数据类型的项目存放在同一个名称下的集合。
- 记录 (Records): 相关数据的集合,可以包含不同类型(例如:一个学生记录包含姓名、年龄和学号)。
用户自定义数据类型
有时候内置的类型不足以应付需求。你可以建立属于自己的类型!这称为 用户自定义数据类型 (User-defined data type)。例如,你可以建立一个存储两个整数 \( x \) 和 \( y \) 的“点 (Point)”类型。
快速回顾: 选择正确的数据类型很重要,因为它会告诉计算机需要分配多少内存,以及可以执行哪些运算(例如:你无法将两个字符串相乘!)。
2. 程序设计概念与控制结构
程序是如何从头到尾运作的呢?主要有三个核心原则:顺序 (Sequence)、选择 (Selection) 和 迭代 (Iteration)。
基本概念
- 变量声明 (Variable Declaration): 告诉计算机:“我需要一个名为 score 的箱子来存放整数。”
- 常量声明 (Constant Declaration): 就像变量,但在程序执行期间,其值 不能改变(例如:PI = 3.14)。
- 赋值 (Assignment): 使用 = 符号将数值放入变量中(例如:score = 10)。
选择 (Selection) - 决策制定
这就是程序“思考”的方式。我们使用 IF 语句或 Switch/Case 语句。
示例:IF score > 50 THEN "你及格了!" ELSE "再试一次!"
迭代 (Iteration) - 循环
迭代只是“重复执行代码”的专业术语。主要分为两种类型:
- 确定迭代 (Definite Iteration): 你精确知道循环会执行多少次(例如:FOR 循环)。
- 不确定迭代 (Indefinite Iteration): 程序会持续执行直到达成特定条件为止(例如:WHILE 或 REPEAT UNTIL 循环)。
常见错误: 在 WHILE 循环中,条件是在 开始时 检查的。如果条件一开始就是假的,内部的代码可能 永远不会 执行!而在 REPEAT UNTIL 循环中,代码至少会执行一次,因为检查是在 结束时 进行的。
3. 算术与逻辑运算
程序设计涉及一些数学,但不用惊慌!主要都是基础运算。
算术运算
- 加法 (+), 减法 (-), 乘法 (*)
- 实数/浮点数除法 (/): 标准除法(例如:\( 5 / 2 = 2.5 \))。
- 整数除法: 这会给出整数部分和余数。
- DIV: 商数(例如:\( 7 \text{ DIV } 2 = 3 \))。
- MOD: 余数(例如:\( 7 \text{ MOD } 2 = 1 \))。
- 指数 (Exponentiation): 乘幂运算(例如:\( 2^3 = 8 \))。
- 四舍五入 vs. 截断 (Rounding vs. Truncation): 四舍五入会进位到最接近的整数;截断则直接“切掉”小数部分。
关系与逻辑运算
关系运算符用于比较:=(等于)、!= 或 <>(不等于)、<(小于)、>(大于)。
逻辑运算符用于组合条件:
- AND: 两者都必须为真。
- OR: 至少一个必须为真。
- NOT: 反转数值(真变为假)。
- XOR: 异或 (Exclusive OR)。两者只能择其一。如果两者都为真,XOR 的结果为假!
4. 字符串处理
可以把 字符串 (String) 想象成一串项链,每一颗珠子就是一个 字符 (Character)。我们可以对字符串进行操作:
- 长度 (Length): 有多少个字符?("Cat" 是 3)。
- 位置 (Position): 寻找字母在哪里(记住,许多程序语言是从 0 开始计数的!)。
- 子字符串 (Substring): 截取字符串的一部分。
- 串接 (Concatenation): 将两个字符串接在一起(例如:"Fire" + "fly" = "Firefly")。
你知道吗? 计算机其实不懂字母;它们使用的是 字符编码 (Character Codes)(如 ASCII 或 Unicode)。你可以将 'A' 这样的字符转换成其对应的编码 (65),并反向转换回去!
5. 子程序 (Subroutines: Procedures and Functions)
子程序 是一段有名称的代码块,负责执行特定任务。与其重复写同样的代码 10 次,不如把它写成子程序,在需要时“调用 (call)”它。
程序 (Procedures) 与函数 (Functions)
- 程序 (Procedures): 执行任务,但不一定会返回数值。
- 函数 (Functions): 必须 返回一个值回程序的主体。
参数与作用域
参数 (Parameters): 这些是传入子程序的数据,以便让它进行处理(就像你给厨师的食材)。
局部变量 (Local Variables): 这些仅存在于 子程序内部。一旦子程序执行完毕,它们就会被删除。这是一个“良好的习惯”,因为它可以防止程序的不同部分意外地更改彼此的数据。
全局变量 (Global Variables): 可以在程序的 任何地方 被访问。请谨慎使用!
重点摘要: 使用子程序能让你的代码更易于阅读、测试和重复使用。这就像将一个大项目拆解成细小、易于管理的工作。
6. 堆栈 (Stack) 与递归 (Recursion)
这是一个进阶主题,如果一时无法理解也别担心!
堆栈帧 (Stack Frames)
当程序调用子程序时,它需要记住自己之前执行到哪里,以便结束后返回。它使用 堆栈帧 (Stack Frame) 来存储:
- 返回地址 (Return Address): 结束后该回到哪里。
- 参数 (Parameters): 传入的数值。
- 局部变量 (Local Variables): 该调用专有的数据。
递归 (Recursion)
递归 是指子程序调用 它自己本身。
想象一下站在两面镜子中间——影像会无限重复。在代码中,我们使用 终止条件 (Base Case) 来防止这种无限循环。
- 终止条件 (Base Case): 停止递归的条件。
- 递归步骤 (General Case): 函数再次调用自身的部分。
类比:要找出堆栈箱子的底部,如果你不在底部(终止条件),就去看看下面的箱子(递归调用)。
快速回顾:
1. 顺序 (Sequence): 代码按顺序执行。
2. 选择 (Selection): IF/ELSE 决策。
3. 迭代 (Iteration): 循环 (For/While)。
4. 子程序 (Subroutines): 可重复使用的块。
5. 局部变量 (Local Variables): 比全局变量更安全。
恭喜你读完了程序设计基础笔记!休息一下,尝试用你喜欢的语言写一个简单的循环吧。请记住:每一位专业的程序设计师都是从你现在的位置开始的。继续编码吧!