👋 欢迎来到子程序的世界!

各位未来的计算机科学家们,大家好!本章的核心目标是让你的代码更整洁、更高效,也更易于管理。想象一下,如果我们要阅读一本 500 页的书,而整本书只有一个巨大的段落——那简直是噩梦!程序也是如此。
我们使用子程序 (Subprograms)(有时也称为子例程)将庞大的任务拆解成小的、逻辑清晰且可重复使用的模块。这是编程中最关键的技能之一!

为什么要学习子程序?(全局视角)

子程序有助于实现模块化 (Modularity)。模块化简单来说,就是通过组合各个独立的小部分来构建一个系统。

  • 可重用性 (Reusability):如果你需要多次计算增值税 (VAT),你只需要在子程序里写一次计算代码,然后在需要的地方随时调用即可。
  • 调试 (Debugging):如果增值税计算出错了,你只需要检查那个子程序,而不需要在 1000 行代码中大海捞针。
  • 组织性 (Organisation):让代码易于阅读和维护,特别是在团队协作时。

1. 子程序的两种类型:函数 vs. 过程

在计算机科学中,根据子程序处理结果的方式,它们被分为两大类:

1.1 过程 (Procedures/Subroutines)

过程是一组旨在执行特定任务的指令集。

  • 仅执行动作:过程执行命令,并且不会向主程序返回任何数值(它们不“返回”任何东西)。
  • 用途:通常用于对外部环境产生影响的操作,比如在屏幕上显示信息、将数据保存到文件,或者绘制图形。
类比:电视遥控器

想象一下按下遥控器上的“静音”按钮。过程运行了(电视静音了),但按钮本身并没有返回给你一个数值。它只是完成了一个动作。

示例(伪代码):

PROCEDURE DisplayWelcomeMessage()
OUTPUT "欢迎使用本系统!"
END PROCEDURE

1.2 函数 (Functions)

函数是一组旨在进行计算并向主程序返回 (Return) 一个特定数值的指令集。

  • 计算与返回:函数必须始终产生并“返回”一个特定的数据值(如数字、字符串或布尔值 True/False)。
  • 用途:主要用于计算、比较和检索特定数据。
类比:自动取款机 (ATM)

当你要求 ATM 计算取款后的余额时,机器(函数)会计算出金额并把最终余额*返回*给你(它显示出那个数字)。

示例(伪代码):

FUNCTION CalculateArea(Length, Width)
Area = Length * Width
RETURN Area
END FUNCTION

🔑 小技巧:如何记住它们的区别

Functions (函数) 会 Feed back (反馈) 一个值。
Procedures (过程) 会 Perform (执行) 一个动作。


2. 参数(传入数据)

如果子程序是一台专门的机器,那么参数 (Parameters) 就是你喂给它以便完成工作的原材料。

2.1 参数与实参的定义

参数 (Parameter) 是在子程序定义(即头部)中列出的特殊变量。它充当了将要传入数据的占位符。
实参 (Argument) 是当你调用子程序(使用它)时传入的实际数据值。

类比:点咖啡

咖啡机的设计说明上写着:“我需要 (1) 饮品类型 和 (2) 杯型大小。”

  • 饮品类型杯型大小 就是参数
  • 当你下单时,你传入的 实参 是:“拿铁”“大杯”

2.2 参数的重要性

参数使子程序具有灵活性。如果一个计算税费的子程序只能计算 100 元的税,那它就没什么用了。它需要参数,这样你才能让它计算 50 元、200 元或 1,000,000 元的税。

示例(在函数中使用参数):

1. 定义(定义了参数):
FUNCTION Multiply(Num1, Num2)
Result = Num1 * Num2
RETURN Result
END FUNCTION

2. 调用函数(传入了实参):
Total = Multiply(5, 10) // 实参 5 和 10 被传入 Num1 和 Num2
OUTPUT Total // 输出结果为 50

⚠️ 常见错误提醒!
学生有时会混淆参数和返回值。请记住:
  • 参数:数据进入子程序。
  • 返回值:数据传出子程序(仅针对函数)。

3. 变量作用域:局部 vs. 全局

变量作用域 (Variable Scope) 定义了变量在程序的哪个部分可以被访问、读取或更改。这对于防止意外的数据污染至关重要。

3.1 全局变量 (Global Variables)

全局变量是在程序的主体部分(在任何子程序之外)声明的。

  • 可见性:全局变量可以被程序的任何部分(包括所有过程和函数)访问、读取和修改。
  • 生命周期:从程序开始运行到结束,它一直存在。
类比:办公室公告栏

全局变量就像挂在办公室走廊里的巨大公告栏。楼里的每一个人(每一个函数/过程)都能看到它并可以在上面书写。

3.2 局部变量 (Local Variables)

局部变量是在特定的子程序(函数或过程)内部声明或创建的。

  • 可见性:只能在创建它的子程序内部被访问、读取或修改。
  • 生命周期:它仅在子程序运行期间存在。一旦子程序结束,局部变量就会被销毁(系统会“忘记”它)。
类比:你的私人笔记

局部变量就像你桌上的私人笔记本。只有你(那个特定的子程序)可以看到或修改笔记。当你完成任务离开书桌时,那些笔记会被其他人忽略。

3.3 良好编程规范

如果起初觉得这有点复杂,别担心! 关键点在于安全性。
我们建议尽可能优先使用局部变量参数
为什么?如果一个过程意外地更改了全局变量,它可能会在没有预兆的情况下破坏程序的其他部分。局部变量能让数据保持隔离和安全。

快速回顾:作用域对比
  • 全局变量:在外部声明;随处可见;修改风险大。
  • 局部变量:在内部声明;在子程序内可见;更安全、更整洁。

🧠 本章要点回顾

我们使用子程序来实现模块化可重用性,并简化调试过程。

  • 过程 (Procedures):执行动作;不返回数值。
  • 函数 (Functions):执行计算;必须返回一个单一数值。
  • 参数 (Parameters):为处理而传入子程序的数据。
  • 作用域 (Scope):定义变量可见性。尽可能使用局部 (Local) 变量,以避免与全局 (Global) 数据发生冲突。