入门:像玩乐高一样构建程序

想象一下,你正在堆砌一座巨大的乐高城堡。你会尝试用一块巨大的塑料模型来把它完成吗?当然不会!你会使用较小的积木、窗户和门来组合出最终的杰作。

在计算机科学中,结构化编程(Structured programming)的原理也是一样。我们不会编写一个冗长且令人混淆的指令列表,而是将程序拆解成更小、易于管理的“积木”,这些积木被称为子程序(Subroutines)。这能让我们的代码更容易阅读、更容易调试(fix),并且条理分明。

如果一开始觉得有点抽象也别担心——看完这份笔记,你就会明白这些“代码积木”是如何让程序员的生活变得轻松多了!


1. 什么是子程序?

子程序(Subroutine)是一个已命名的“独立(out of line)”代码区块。简单来说,它就是一组放在主程序之外的指令集。它只有在你特别“调用”它的时候才会执行。

要使用子程序,你只需在程序语句中写下它的名字来“调用(call)”它即可。

现实生活中的类比:食谱

想象一份周日烤肉的食谱。其中一个步骤写着:“制作肉汁(Make the gravy)。”

这个“制作肉汁”的步骤就像是一个子程序调用。制作肉汁的实际指令并不会写在烤牛肉步骤的中间——它们通常放在另外一页。你会翻到那一页,按照步骤完成,然后再回到你原本中断的地方继续。

重点总结:

子程序是已命名的代码区块,用于执行特定任务,并可在需要时随时被调用


2. 使用子程序的优点

为什么要麻烦地把程序拆分开来?为什么不一次过写完呢?

  • 可重复使用性(Reusability):你只需要编写一次代码。如果你需要在程序中计算十次折扣,你只需调用 calculateDiscount 子程序十次,而不需要重复写十次数学运算。
  • 更容易测试(Easier to Test):你可以一次测试一个子程序,确保它运作完美后,再将其加入程序的其他部分。
  • 团队合作(Teamwork):在现实世界中,大型程序(如 Minecraft 或 Instagram)都是由团队共同开发的。一个人可以负责编写“登录”子程序,而另一个人则编写“照片滤镜”子程序。
  • 可读性(Readability):阅读一句 checkPassword() 比阅读中间夹杂着 50 行复杂保安代码的程序要容易得多。

3. 参数:传入数据

有时候,子程序需要信息才能完成工作。我们使用参数(Parameters)来传递这些信息。

你知道吗?在考试中,你可能会听到人们使用“引数(arguments)”这个词。对于 AQA GCSE,我们使用参数(parameter)一词来指代传送的数据以及子程序内的占位符。

例子:自动售货机

将自动售货机想象成一个子程序。要让它运作,你需要给它两样东西:商品代码。这些就是参数。没有这些参数,机器就不知道该做什么!

逐步说明:运作流程
1. 主程序“调用”子程序。
2. 主程序提供参数(数据)。
3. 子程序使用这些参数来进行计算或执行任务。


4. 返回值:传出数据

当子程序完成任务后,它可能会得到一个答案。它会使用返回值(return value)将这个答案传回给主程序。

程序(Procedures)与函数(Functions)的区别:
函数(Function)是一种总是会返回值的子程序(就像计算器给你 \( 5 + 5 \) 的结果一样)。
程序(Procedure)是一种执行任务但未必需要返回值的子程序。

快速回顾:

参数(Parameters) = 传子程序的数据。
返回值(Return Values) = 从子程序传的数据。


5. 局部变量:“拉斯维加斯发生的事...”

子程序在执行任务时,往往需要自己的变量来存储暂时性的数据。这些被称为局部变量(Local variables)

局部变量的重要规则:
1. 它们只在子程序执行期间存在。
2. 它们只能在该特定的子程序内部被存取。

为什么这是良好的编程习惯?

  • 内存效率(Memory Efficiency):一旦子程序结束,电脑就会“删除”局部变量,释放 RAM 空间。
  • 安全性(Safety):使用局部变量可以防止你不小心更动了程序其他部分的变量。这能将“混乱”控制在范围内!

记忆小撇步:将局部变量想象成你用来做快速计算的废纸。当你得出答案后,你就会把那张废纸丢掉。


6. 结构化方法

结构化方法(Structured approach)是一种专业的编码方式。它涉及模块化编程(Modularized programming)(将事项拆分为子程序)并使用清晰且有良好文件说明(well-documented)的接口

“良好文件说明的接口”意味着你可以非常清楚该子程序需要什么参数,以及它会提供什么返回值

结构化方法的优点:

  • 程序更容易维护,因为你可以更新一个模块而不影响其他模块。
  • 代码更容易调试(寻找错误)。
  • 程序的逻辑对于其他程序员来说更清晰。

常见错误提示

“隐形”变量:学生经常尝试在主程序中使用来自子程序的局部变量。这会导致错误!记住:如果在子程序内建立变量,主程序是“看不见”它的。

混淆参数与返回值:请记住,参数是你放入果汁机的食材,而返回值则是最后打出来的果汁!


最终快速检查

你能解释吗……
1. 什么是子程序?(一个已命名、独立的代码区块)。
2. 子程序的两个好处?(可重复使用性和更容易调试)。
3. 参数与返回值之间的区别?(参数传入;返回值传出)。
4. 为什么要使用局部变量?(为了节省内存并防止意外更动其他代码)。

你做得很好!结构化编程是成为专业程序员的基础。继续练习,试着把你自己的小程序拆解成子程序吧!