跳到正文
IGCSE·Tuition
计算机科学 · 课程

构建参数清晰的子程序

你能在主程序里写出步骤,但一要改成可重复使用的子程序,括号和名字就让人糊涂了。

本页内容
  1. 我该怎样设计子程序?
  2. 例题
  3. 最常见的错误是什么?
  4. 自测
  5. 接下来学什么?

子程序(subroutine)是一段有名字、只做一件事的代码,这样你可以多次使用而不用重写。参数(parameter)是它所需要的有名字的输入,而函数还会返回一个答案。

本课属于程序结构模块。它接在局部与全局作用域之后,因为参数正是替代“伸手去拿全局变量”的干净做法。

我该怎样设计子程序?

按顺序做四个决定。

  1. **给任务起名。**用能说明作用的名字,例如 HireFee。
  2. **列出输入。**子程序必须知道什么?每一项都变成一个带类型的参数。
  3. **决定输出。**如果调用者需要答案,就写带 RETURNS 和类型的 FUNCTION;如果只是做一件事,就写 PROCEDURE。
  4. **让函数体自成一体。**内部只使用参数和局部变量。

例题

某虚构社区礼堂按小时收费。预订 5 小时或以上,总价可减 10%。请写一个返回费用的函数。

输入:小时数(INTEGER)和每小时费率(REAL)。输出:费用(REAL)。

FUNCTION HireFee(Hours : INTEGER, Rate : REAL) RETURNS REAL
    DECLARE Fee : REAL
    Fee ← Hours * Rate
    IF Hours >= 5 THEN
        Fee ← Fee * 0.9
    ENDIF
    RETURN Fee
ENDFUNCTION

OUTPUT HireFee(6, 20.00)
OUTPUT HireFee(3, 20.00)

追踪第一次调用 HireFee(6, 20.00):

行HoursRateFee
调用620.00未设置
Fee ← Hours * Rate620.00120.00
IF Hours >= 5 为 TRUE620.00120.00 × 0.9 = 108.00
RETURN620.00返回 108.00

第二次调用中 Hours = 3,条件为 FALSE,函数返回 3 × 20.00 = 60.00。两个输出分别是 108.00 和 60.00。

作为对照,同一个函数的 Python 写法:

def hire_fee(hours, rate):
    fee = hours * rate
    if hours >= 5:
        fee = fee * 0.9
    return fee

最常见的错误是什么?

**错误答案:**预订是 4 小时、每小时 RM25,却调用了 HireFee(25, 4)。

第一个实参按位置传给 Hours,第二个传给 Rate。这里 Hours 变成了 25,于是折扣生效,函数返回 25 × 4 × 0.9 = 90,而不是正确的 4 × 25 = 100。

程序不会崩溃,所以这种错误很难发现。正确的调用是 HireFee(4, 25.00),得到 100.00。写调用时,请按顺序把每个实参和对应的形参核对一遍。

第二个错误是在本来只负责计算的函数里放 INPUT 或 OUTPUT,这在把逻辑与输入输出分开中讲。

自测

1. 在 HireFee(Hours : INTEGER, Rate : REAL) 中,哪些是形参?在 HireFee(8, 15.00) 中,实参是什么?

显示答案

形参:Hours 和 Rate。实参:8 和 15.00。

2. 写出 HireFee(8, 15.00) 返回的值。

显示答案

8 × 15.00 = 120.00。Hours 为 8,不小于 5,所以享受折扣:120.00 × 0.9 = 108.00。

3. 写一个过程 Greet,接收 STRING 参数 Name,输出 “Hello, ” 加上名字。并写出用虚构名字 Aina 调用它的语句。

显示答案
PROCEDURE Greet(Name : STRING)
    OUTPUT "Hello, " & Name
ENDPROCEDURE

CALL Greet("Aina")

输出是 Hello, Aina。因为不需要返回任何值,所以用过程。

接下来学什么?

函数用 RETURN 交回答案。想准确看清哪个值在什么时候返回,请继续学习追踪返回值。你可以在安全 Python 推理沙盒里运行 HireFee,也可以在受限伪代码追踪训练器里逐步追踪。

如果设计参数列表是你最容易卡住的地方,我们的一对一线上 Computer Science 补习会从你手上的作业出发来练习。

常见问题

形参(parameter)和实参(argument)有什么区别?

形参是子程序定义中带名字的变量,例如 Hours。实参是你调用时传进去的实际值,例如 6。实参按位置与形参一一对应,所以传值的顺序很重要。

过程(procedure)和函数(function)有什么区别?

函数会返回一个值,调用它的代码可以使用这个值,例如用在赋值语句里。过程只执行一项任务,不返回值。调用者需要一个答案时用函数,只是要做一件事(例如显示一行字)时用过程。

形参的名字必须和主程序里的变量一样吗?

不必。两者的名字互相独立。子程序里的 Hours 可以接收主程序中名为 Time 的变量的值。清楚、有意义的形参名能让子程序更好读。请核对你考试年份的大纲是如何书写子程序头部的。

更新于:

下一步

如果你能写出逻辑,却卡在括号里该放什么,一对一老师可以逐行看你自己的代码,一个参数一个参数地问:这个子程序到底需要什么。

一小时付费试听课,按所安排老师确认的收费,RM80 起。 其他费用、时间安排及后续课程,在试听课后由家长与老师直接确认。

补习由家长或监护人安排。用 WhatsApp 把这页发给他们,他们就可以替你咨询。

是家长或监护人?在这里咨询

已通过我们的服务帮助 9,000+ 名学生