歡迎來到子程式的世界!

在本章中,我們要學習如何成為「懶惰」的程式設計師——當然,這是好的那種!我們不需要重複編寫同樣的程式碼,而是要學習如何將程式碼打包成整潔的小套件,稱為子程式 (Subprograms)。如果現在覺得程式設計像個解不開的謎題,別擔心;看完這些筆記後,你就會明白子程式是如何讓一切管理變得輕鬆多了!

先備知識檢查:在開始之前,請記住程式是一系列給電腦執行的指令清單。而子程式就是儲存在主程式裡,一份較小的指令清單。


1. 什麼是子程式?

子程式是一個能執行特定任務的獨立程式碼區塊。可以把它想像成主程式裡的「迷你程式」。在 Edexcel 的課程大綱中,你會學到兩種主要類型:程序 (Procedures)函數 (Functions)

「披薩」比喻

想像你在寫一份超級龐大的「披薩派對」食譜。與其每次提到披薩時都重複寫一遍「如何製作麵團」的步驟,你只需要把製作麵團的步驟寫在一個獨立的盒子裡,並命名為 MakeDough。每次你需要用到麵團時,只要指向那個盒子就可以了!這就是子程式運作的方式。

為什麼要使用它們?(好處)

  • 分解 (Decomposition): 它能將龐大且令人畏懼的問題,拆解成較小、易於處理的部分。
  • 可重用性 (Reusability): 程式碼只需寫一次,就能多次使用。
  • 更容易測試: 你可以先測試一個小小的子程式,確認它運作正常,再把它放入主程式中。
  • 可讀性 (Readability): 它能讓你的程式碼看起來更整潔,人類讀起來也更容易。

快速回顧:為什麼要使用子程式?為了節省時間、減少錯誤,並讓程式碼更易於閱讀!


2. 程序 (Procedures) 與函數 (Functions)

這在考試中是一個非常重要的區別。雖然它們看起來很像,但有一個主要差異。

程序 (Procedures)

程序是一種執行特定任務,但不會將值傳回主程式的子程式。它只是「完成它的工作」。
例子: 一個負責清除螢幕或是列印特定歡迎訊息的子程式。

函數 (Functions)

函數是一種執行任務,並且必須回傳一個值 (Return a value) 回到呼叫它的程式碼位置的子程式。它會「給予回饋」。
例子: 一個計算數字平方根並將答案提供給你的子程式。

記憶口訣: Functions Find a value! (它們會回傳 (Return) 一個值)。

常見錯誤: 忘記函數必須要有 return 語句。如果它沒有回傳任何東西,那它其實就是一個程序!


3. 參數 (Parameters) 與引數 (Arguments)

有時,子程式需要資訊才能執行任務。如果你有一個叫做 CalculateArea 的子程式,它就需要知道形狀的長度與寬度。

  • 參數 (Parameters): 這些是在子程式定義中的「預留位置」。它們就像等待被填入資訊的空槽。
  • 引數 (Arguments): 這些是你呼叫子程式時,真正傳入那些空槽的數值。

逐步範例:
1. 你定義了一個函數:function calculate(number1, number2)。這裡,number1 和 number2 是參數
2. 你呼叫了這個函數:calculate(10, 5)。這裡,10 和 5 是引數

重點總結:參數是定義中的「標籤」;引數則是程式執行期間實際使用的「真實資料」。


4. 區域變數 (Local Variables) 與全域變數 (Global Variables)

這與「範圍 (Scope)」有關,意思就是「我可以在哪裡看到這個變數?」

區域變數 (Local Variables)

區域變數是在子程式裡面宣告的。它只會在該子程式執行時存在。一旦子程式執行完畢,該變數就會被「刪除」。
比喻: 你家的鑰匙對你家來說是「區域性」的。它們在其他地方無法使用,且外面的人也不知道它們的存在。

全域變數 (Global Variables)

全域變數是在所有子程式外面宣告的,通常在腳本的最上方。程式的任何部分都可以看到並使用它。
比喻: 太陽是「全域」的。無論你在哪個「子程式」(房間)裡,每個人都看得到它。

你知道嗎? 一般來說,使用區域變數會更好。如果你使用了太多的全域變數,一個子程式可能會意外地更改了另一個子程式正在使用的數值,從而導致「邏輯錯誤」!


5. 內建子程式與自訂子程式

你不需要每次都從頭開始編寫所有子程式!

  • 內建子程式 (Built-in Subprograms): 這些是程式語言(例如 Python)已經提供好的。例子包括 print()input()len()
  • 函式庫子程式 (Library Subprograms): 這些是一組可以「匯入 (import)」的預先編寫好的子程式。例如,math 函式庫讓你能夠存取 math.sqrt()
  • 自訂子程式 (User-Devised Subprograms): 這些是為了解決特定問題而親手編寫的程式。

快速回顧箱:
- 程序: 執行任務,無回傳值。
- 函數: 執行任務,有回傳值。
- 範圍: 區域(內部)vs 全域(外部)。
- 單一入口/出口: 一個優秀的子程式應該從開頭進入,並只有一個明確的出口!


總結檢查表

在繼續往下學習之前,確認你能回答這些問題:
1. 我能解釋使用子程式的好處嗎?(分解/可重用性)
2. 我知道函數與程序有什麼不同嗎?(回傳值)
3. 我能在一小段程式碼中識別出參數嗎?
4. 我理解為什麼區域變數比全域變數「更安全」嗎?

如果起初覺得有點困難,別擔心!子程式就像積木——一旦你學會如何將它們組合在一起,你就能構建出更龐大、更酷的程式了!