👋 歡迎來到副程式(Subprograms)的世界!

各位未來的電腦科學家,你們好!這一章的重點在於如何讓你的程式碼更簡潔、更高效且更易於管理。試著想像一下,如果一本 500 頁的書寫成一個沒有分段的超長段落,那簡直是不可能的任務!編寫程式也是一樣的道理。
我們使用副程式(Subprograms,有時也稱為子常式 Subroutines)來將龐大的任務拆解成細小、符合邏輯且可重複使用的區塊。這是編寫程式最重要的技能之一!

為什麼要學習副程式?(總體概覽)

副程式能幫助我們實現模組化(Modularity)。模組化意味著透過組裝較小、獨立的部件來構建大型系統。

  • 可重複使用性(Reusability): 如果你需要多次計算增值稅(VAT),你只需在副程式中編寫一次計算程式碼,之後每次需要時呼叫它即可。
  • 除錯(Debugging): 如果計算增值稅時出錯,你只需要檢查該副程式,而不需要翻遍整整 1000 行的程式碼。
  • 組織性(Organisation): 讓程式碼易於閱讀和管理,尤其是在團隊合作開發時更是如此。

1. 兩種類型的副程式:函式 vs. 程序

在電腦科學中,根據處理結果的方式,副程式主要分為兩類:

1.1 程序(Procedures / Subroutines)

程序是一組旨在執行特定任務的指令集。

  • 僅執行動作: 程序會執行指令,但不會將數值回傳給主程式(它們不會「return」任何東西)。
  • 目的: 通常用於影響外部環境的操作,例如在螢幕上顯示文字、將資料儲存到檔案中,或繪製圖形。
類比:遙控器

想像一下按下電視遙控器上的「靜音」按鈕。該程序執行了(電視變成了靜音),但按鈕本身並沒有將任何數值回傳給你。它只是完成了一個動作。

範例(虛擬碼):

PROCEDURE DisplayWelcomeMessage()
OUTPUT "歡迎使用本系統!"
END PROCEDURE

1.2 函式(Functions)

函式是一組旨在進行計算並將單一數值回傳(return)給主程式的指令集。

  • 計算並回傳: 函式執行完畢後必須產生,或者說「回傳」一個特定的資料值(例如數字、字串或布林值 True/False)。
  • 目的: 主要用於進行計算、比較及獲取特定資料。
類比:提款機(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

⚠️ 常見錯誤警示!
學生有時會搞混參數與回傳值。請記住:
  • 參數: 進入副程式的資料(IN)。
  • 回傳值: 從副程式出來的資料(OUT,僅限函式)。

3. 變數範圍:區域變數 vs. 全域變數

變數範圍(Variable Scope)定義了程式中哪些地方可以存取、讀取或修改該變數。這對於防止資料被意外破壞至關重要。

3.1 全域變數(Global Variables)

全域變數是在程式的主體部分(任何副程式之外)宣告的變數。

  • 可視性: 程式中的任何部分,包括所有的程序和函式,都可以存取、讀取並修改全域變數。
  • 生命週期: 從程式開始執行直到結束一直存在。
類比:辦公室的公佈欄

全域變數就像掛在主辦公室走廊上的巨型行事曆。大樓裡的每個人(每個函式/程序)都可以看到它並在上面書寫。

3.2 區域變數(Local Variables)

區域變數是在特定副程式(函式或程序)內部宣告或建立的變數。

  • 可視性: 它只能在建立它的副程式內部被存取、讀取或修改。
  • 生命週期: 它僅在副程式運行時存在。一旦副程式結束,區域變數就會被銷毀(系統會將其遺忘)。
類比:你的私人筆記

區域變數就像你桌上的私人筆記。只有你(該特定副程式)可以看到或更改筆記內容。當你完成任務並離開座位時,其他人就會忽略這些筆記。

3.3 良好程式習慣

如果起初覺得這些很複雜,請不要擔心! 核心概念是「安全性」。
我們傾向於在可行時多使用區域變數參數
為什麼呢?如果一個程序意外修改了全域變數,它可能會在毫無預警的情況下導致程式的其他部分崩潰。區域變數能保持資料隔離且安全。

快速回顧:範圍比較
  • 全域變數: 在外部宣告;隨處可見;修改風險較高。
  • 區域變數: 在內部宣告;在該副程式中可見;更安全且整潔。

🧠 本章重點總結

我們使用副程式來達到模組化可重複使用性,並簡化除錯工作。

  • 程序(Procedures): 執行動作;不回傳數值。
  • 函式(Functions): 進行計算;必須回傳單一數值。
  • 參數(Parameters): 傳入副程式以供處理的資料。
  • 範圍(Scope): 定義可視性。盡可能使用區域(Local)變數,以避免與全域(Global)資料產生衝突。