歡迎來到結構化程式設計!

你有沒有試過在沒有計劃的情況下,一次過製作一個大型的多層蛋糕?那一定會是一場災難!程式設計也是一樣。當程式變得龐大時,我們需要把它們拆解成更小、更容易處理的「組件」。在本章中,我們將學習如何使用子程式 (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) 中,數字 105 就是被傳遞到參數中的數據。

你知道嗎? 在考試中,你可能會聽到「引數 (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 (樂高)。每一塊積木都是一個子程式。它們是獨立的,擁有特定的形狀(介面)來與其他積木連接,你可以將它們組合起來,構建出龐大且複雜的結構!

重點總結: 結構化程式設計意味著成為一個整潔且有邏輯的程式設計師。它能讓你的程式變得強健且專業。

快速複習測驗(心智檢查!)

• 你能解釋參數和回傳值之間的區別嗎?
• 為什麼使用區域變數比全域變數更好?
• 將程式「拆解」成子程式的主要好處是什麼?

(答案:參數用於傳入,回傳值用於傳出;區域變數更安全且節省記憶體;子程式使程式碼可重複使用且易於測試!)