欢迎来到程序设计的核心!

在本章中,我们将探讨过程式程序设计(procedural programming)的基础架构。试着将程序想象成一道食谱:你需要准备材料(数据/资料)、操作指示(语句/叙述),以及处理突发状况的方法(异常处理)。在阅读完这些笔记后,你将学会如何使用每位程序员都必须掌握的基本结构与计算机“对话”。别担心内容看起来很多——我们将循序渐进,一步步来!


1. 基础架构:语句类型

在过程式程序设计中,我们会给计算机一系列指令。你需要了解五种主要的语句类型:

关键语句类型

1. 变量声明(Variable Declaration):这就像是在告诉计算机:“嘿,在内存里留个位置给我存一个值,并把它命名为 'Score'。”
2. 赋值(Assignment):将数值存入变量中。例如:Score = 10
3. 选择(Selection):进行决策。如果条件成立(True),则执行某件事;否则,执行另一件事(使用 IFCASE 语句)。
4. 迭代(Iteration):重复执行一段代码(使用循环)。
5. 子程序(Subroutine):一个有名字的代码块,专门执行特定任务。当你需要时,可以随时“调用”它。

输入与输出

如果程序无法与你互动,那它就没什么用处了!
- 输出(Output):在屏幕上显示信息。
- 输入(Input):通过键盘从用户端获取信息。

标识符名称与注释

为变量命名时,请使用具备意义的标识符名称(meaningful identifier names)。与其将变量命名为 x,不如命名为 user_age。这会让类阅读代码时更容易理解!
同样地,请善用注释(comments)。这些是给类看的笔记,计算机会自动忽略它们。它们的功能是解释你为什么要编写这段代码。

重点复习:
- 使用有意义的名称(例如:用 totalPrice 而不是 t)。
- 使用注释来解释复杂逻辑。
- 选择(Selection) = 做决定。迭代(Iteration) = 重复动作。


2. 算术运算

计算机本质上是非常快速的计算器。你需要熟悉以下运算:

- 加法 (+)减法 (-)
- 乘法 (*)实数/浮点数除法 (/):这会给出完整的答案,例如: \( 7 / 2 = 3.5 \)。
- 整数除法 (DIV):这会告诉你一个数除以另一个数可以包含几个“完整”的数。例如: \( 7 \text{ DIV } 2 = 3 \)。
- 余数 (MOD):这会告诉你除法之后剩下的“余数”。例如: \( 7 \text{ MOD } 2 = 1 \)。
- 指数运算(幂运算):将数值进行乘方(例如: \( 2^3 = 8 \))。
- 四舍五入(Rounding):将数值调整至最接近的整数或小数位。
- 截断(Truncation):直接切除小数部分,不进行四舍五入。

记忆小撇步:
MOD 想象成“剩下来的东西”。如果你有 7 个饼干要分给 2 个人,每人可以拿 3 个(这就是 DIV),最后会剩下 1 个饼干(这就是 MOD)!


3. 关系运算与布尔运算

选择语句(如 IF)依赖关系运算符(Relational Operators)来进行判断:

- 等于 (= 或 ==)
- 不等于 (!= 或 <>)
- 小于 (<)
- 大于 (>)
- 小于或等于 (<=)
- 大于或等于 (>=)

布尔逻辑(AND, OR, NOT, XOR)

有时候你需要结合多个条件进行判断。
- AND:两个部分都必须为真(True)。
- OR:至少有一个部分为真。
- NOT:反转结果(真变为假,假变为真)。
- XOR(互斥或):其中一个为真,但不能两个都为真

优先级

当有一连串的逻辑判断时,计算机会遵循特定的优先级:
1. NOT(最高优先级)
2. AND
3. OR(最低优先级)

常见误区:不要误以为 OR 是互斥的。在程序设计中,如果两边条件皆为真,OR 的结果依然为真。如果你想要条件“二选一”,请使用 XOR


4. 字符串处理操作

字符串(string)就是一连串的字符(例如 "Hello World")。你需要知道如何处理它们:

- 长度(Length):计算字符串中有多少字符。
- 位置(Position):找出特定字符位于哪里。
- 子字符串(Substring):截取字符串的一部分(例如,从 "Golden" 中取出 "Gold")。
- 串接(Concatenation):将两个字符串接在一起(例如,"Foot" + "ball" = "Football")。
- 字符转编码(Character to Code):找出字符的数值编码(如 ASCII)。
- 编码转字符(Code to Character):将数值编码转回字符。

类型转换(Casting)

通常你需要变更数据类型才能进行运算。例如,如果你从用户那里得到 "10",它是一个字符串,你必须先将它转换成整数(integer),才能进行数学加法!


5. 高级控制结构

迭代(循环)

重复执行代码有两种主要方式:
- 确定性迭代(Definite Iteration):你知道确切要重复多少次(例如:FOR 循环)。
- 不确定性迭代(Indefinite Iteration):重复执行直到某个条件改变为止(例如:WHILE 循环)。

嵌套结构

你可以将一个选择结构放在另一个里面(嵌套选择),或是一个循环放在另一个里面(嵌套迭代)。
类比:想象一个时钟。分针每转动 60 次(内层循环),时针才前进 1 次(外层循环)。

异常处理(Exception Handling)

有时候程序会发生错误(例如尝试除以零)。异常处理允许你的程序“捕捉”这些错误并优雅地解决它,而不是直接崩溃。


6. 子程序与作用域

子程序(subroutine)是你主程序中的一个具名“小程序”。
优点:代码更易读,不需要重复编写相同的逻辑,且更容易测试。

参数与返回值

- 参数(Parameters):传递进入子程序的资料,供其运算使用。
- 返回值(Return Values):子程序将运算结果回传给主程序。

全局变量 vs. 局部变量

- 全局变量(Global Variables):可以在整个程序的任何地方访问。
- 局部变量(Local Variables):仅存在于创建它的特定子程序内部。

你知道吗?使用局部变量是更良好的实践。这可以防止子程序意外更动到程序其他地方不该碰到的资料!

堆栈框架(Stack Frames)

当计算机调用子程序时,它会使用堆栈框架来追踪各种状态。它会储存:
1. 返回地址(return address)(子程序结束后要回到哪里)。
2. 传递给它的参数
3. 子程序内部使用的局部变量


重点回顾

- 过程式程序设计包含序列、选择与迭代。
- DIV 用于整数商;MOD 用于余数。
- 布尔运算顺序:先 NOT,再 AND,最后 OR。
- 子程序有助于整理代码;局部变量能确保安全。
- 堆栈框架是计算机用来记录“调用子程序前所在位置”的方法。