欢迎来到结构化程序设计!
你有没有试过在没有计划的情况下,一次性制作一个大型的多层蛋糕?那一定会是一场灾难!程序设计也是一样。当程序变得庞大时,我们需要把它们拆解成更小、更容易处理的“组件”。在本章中,我们将学习如何使用子程序 (subroutines) 来让代码变得井然有序、可重复使用,并且更易于调试。别担心,即使起初听起来有点技术性,但在读完这些笔记后,你就会像专业架构师一样构建程序了!
1. 什么是子程序?
子程序 (subroutine) 是一段具备名称且执行特定任务的代码块。你可以把它想象成主程序中的一个“微型程序”。与其反复编写相同的代码,不如将其写在子程序中,每当需要时“调用 (call)”它即可。
你需要了解两种主要的子程序类型:
1. 过程 (Procedures): 执行任务,但不一定会将数值传回给主程序。
2. 函数 (Functions): 执行任务,并将一个数值回传 (return) 给调用它的程序部分。
我们该如何使用它们?
在考试中,你应该知道子程序被描述为“外连 (out of line)”。这意味着代码位于主程序流程之外。你只需在程序语句中写下子程序的名称,即可调用 (call)(执行)该子程序。
现实生活中的类比: 想象一个机器人上方的“冲茶 (MakeTea)”按钮。每次你想喝茶时,都不需要告诉机器人每一个步骤(烧水、拿杯子、放入茶包)。你只需按下“冲茶”按钮。按钮就是调用 (call),而机器人内存中的操作步骤就是子程序。快速回顾:子程序的优点
• 易于阅读: 主程序变得更短、更简洁。
• 可重复使用: 你可以在程序的不同部分多次使用同一个子程序。
• 易于测试: 你可以一次测试一个小型子程序,确保其运作完美。
• 团队合作: 不同的程序员可以同时开发不同的子程序。
重点总结: 子程序是结构化代码的基石。它们能节省时间,并防止出现“意大利面条式代码 (spaghetti code)”(即杂乱、令人困惑的指令)。
2. 参数 (Parameters):传入数据
有时子程序需要信息才能完成任务。例如,如果你有一个名为 CalculateArea(计算面积)的子程序,它需要知道图形的长度和宽度。我们使用参数 (parameters) 来传递这些信息。
参数 (parameter) 是一种特殊的变量,用于将数据传入子程序。你可以有一个参数,也可以有很多个!
示例: 在子程序调用 CalculateArea(10, 5) 中,数字 10 和 5 就是被传递到参数中的数据。你知道吗? 在考试中,你可能会听到“实参 (argument)”这个词。别让它搞糊涂了!老师和程序员有时会将“实参”用于实际传递的值,而将“参数”用于子程序内部的变量名称,但 AQA 会将参数一词同时涵盖两者。
重点总结: 参数就像是你子程序的“输入”,让它每次被调用时都能处理不同的数据。
3. 回传值 (Return Values):传出数据
如果说参数是将数据带入子程序,那么回传值则是将数据带出。这就是将过程转变为函数 (function) 的关键。
当子程序完成任务后,它可以透过 RETURN 关键字将结果“送回”给主程序。这个结果随后可以存储在变量中,或用于计算。
咖啡机类比: 你放入水和咖啡豆(参数)。机器执行“冲泡 (Brew)”子程序。最后,它给你一杯咖啡(回传值)。逐步说明:函数是如何运作的
1. 主程序调用函数并提供参数。
2. 函数使用这些参数执行其代码。
3. 函数执行到 RETURN 语句。
4. 数值被送回,函数结束。
重点总结: 当你需要子程序进行计算并回传答案时,请使用函数。
4. 局部变量 (Local Variables) 与作用域 (Scope)
当你在子程序内部创建变量时,它被称为局部变量 (local variable)。这对于 AQA 课程大纲来说是一个非常重要的概念。
是什么让变量成为“局部”变量?
• 它们仅在子程序实际执行时存在。
• 它们只能在该特定的子程序内部被访问。
为什么使用局部变量是“良好习惯”?
你可能会觉得无法从主程序中看到局部变量很不方便,但这实际上是一种安全功能!
1. 防止干扰: 你不必担心意外地更改了主程序中名称相同的变量。
2. 节省内存: 由于变量会在子程序结束后立即删除,这能释放电脑 RAM 中的空间。
常见错误: 试图在子程序之外使用局部变量。这会导致错误,因为程序的其他部分并不知道该变量的存在!
重点总结: 尽可能保持变量为“局部性”。这能让你的代码保持“封装 (encapsulated)”(即自包含且安全)。
5. 结构化方法 (Structured Approach)
程序设计的结构化方法是一种处理大型问题的方法,透过拆解 (decomposition) 将其划分为更小、更具逻辑性的模块(子程序)。
结构化程序设计的特征:
• 模块化 (Modularization): 将程序拆解为子程序。
• 局部变量: 使用仅在需要时才存在的变量。
• 参数与回传值: 使用清晰的“接口”在模块之间传递数据。
• 文档化接口: 明确定义每个子程序需要什么(参数)以及提供什么(回传值)。
结构化方法的优点
• 易于调试: 如果出现错误,你可以准确指出是哪一个子程序出了问题。
• 可维护性: 更新或更改程序的一部分要容易得多,而不必担心破坏其他部分。
• 团队合作: 在现实世界中,可能有 100 个人共同编写一个程序。结构化程序设计允许他们分别处理能完美拼凑在一起的独立模块。
记忆小技巧: 想象一下 LEGO (乐高)。每一块积木都是一个子程序。它们是独立的,拥有特定的形状(接口)来与其他积木连接,你可以将它们组合起来,构建出庞大且复杂的结构!
重点总结: 结构化程序设计意味着成为一个整洁且有逻辑的程序员。它能让你的程序变得强健且专业。
快速复习测验(心智检查!)
• 你能解释参数和回传值之间的区别吗?
• 为什么使用局部变量比全局变量更好?
• 将程序“拆解”成子程序的主要好处是什么?
(答案:参数用于传入,回传值用于传出;局部变量更安全且节省内存;子程序使代码可重复使用且易于测试!)