👋 歡迎來到副程式(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)資料產生衝突。