入門:像玩樂高一樣構建程式

想像一下,你正在堆砌一座巨大的樂高城堡。你會嘗試用一塊巨大的塑膠模型來把它完成嗎?當然不會!你會使用較小的積木、窗戶和門來組合出最終的傑作。

在電腦科學中,結構化編程(Structured programming)的原理也是一樣。我們不會編寫一個冗長且令人混淆的指令列表,而是將程式拆解成更小、易於管理的「積木」,這些積木被稱為子程序(Subroutines)。這能讓我們的代碼更容易閱讀、更容易除錯(fix),並且條理分明。

如果一開始覺得有點抽象也別擔心——看完這份筆記,你就會明白這些「代碼積木」是如何讓程式設計師的生活變得輕鬆多了!


1. 什麼是子程序?

子程序(Subroutine)是一個已命名的「獨立(out of line)」代碼區塊。簡單來說,它就是一組放在主程序之外的指令集。它只有在你特別「呼叫」它的時候才會執行。

要使用子程序,你只需在程式語句中寫下它的名字來「呼叫(call)」它即可。

現實生活中的類比:食譜

想像一份週日烤肉的食譜。其中一個步驟寫著:「製作肉汁(Make the gravy)。」

這個「製作肉汁」的步驟就像是一個子程序呼叫。製作肉汁的實際指令並不會寫在烤牛肉步驟的中間——它們通常放在另外一頁。你會翻到那一頁,按照步驟完成,然後再回到你原本中斷的地方繼續。

重點總結:

子程序是已命名的代碼區塊,用於執行特定任務,並可在需要時隨時被呼叫


2. 使用子程序的優點

為什麼要麻煩地把程式拆分開來?為什麼不一次過寫完呢?

  • 可重複使用性(Reusability):你只需要編寫一次代碼。如果你需要在程式中計算十次折扣,你只需呼叫 calculateDiscount 子程序十次,而不需要重複寫十次數學運算。
  • 更容易測試(Easier to Test):你可以一次測試一個子程序,確保它運作完美後,再將其加入程式的其他部分。
  • 團隊合作(Teamwork):在現實世界中,大型程式(如 Minecraft 或 Instagram)都是由團隊共同開發的。一個人可以負責編寫「登入」子程序,而另一個人則編寫「照片濾鏡」子程序。
  • 可讀性(Readability):閱讀一句 checkPassword() 比閱讀中間夾雜著 50 行複雜保安代碼的程式要容易得多。

3. 參數:傳入數據

有時候,子程序需要資訊才能完成工作。我們使用參數(Parameters)來傳遞這些資訊。

你知道嗎?在考試中,你可能會聽到人們使用「引數(arguments)」這個詞。對於 AQA GCSE,我們使用參數(parameter)一詞來指代傳送的數據以及子程序內的佔位符。

例子:自動販賣機

將自動販賣機想像成一個子程序。要讓它運作,你需要給它兩樣東西:商品代碼。這些就是參數。沒有這些參數,機器就不知道該做什麼!

逐步說明:運作流程
1. 主程序「呼叫」子程序。
2. 主程序提供參數(數據)。
3. 子程序使用這些參數來進行計算或執行任務。


4. 回傳值:傳出數據

當子程序完成任務後,它可能會得到一個答案。它會使用回傳值(return value)將這個答案傳回給主程序。

程序(Procedures)與函數(Functions)的區別:
函數(Function)是一種總是會回傳值的子程序(就像計算機給你 \( 5 + 5 \) 的結果一樣)。
程序(Procedure)是一種執行任務但未必需要回傳值的子程序。

快速回顧:

參數(Parameters) = 傳子程序的數據。
回傳值(Return Values) = 從子程序傳的數據。


5. 區域變數:「拉斯維加斯發生的事...」

子程序在執行任務時,往往需要自己的變數來儲存暫時性的數據。這些被稱為區域變數(Local variables)

區域變數的重要規則:
1. 它們只在子程序執行期間存在。
2. 它們只能在該特定的子程序內部被存取。

為什麼這是良好的編程習慣?

  • 記憶體效率(Memory Efficiency):一旦子程序結束,電腦就會「刪除」區域變數,釋放 RAM 空間。
  • 安全性(Safety):使用區域變數可以防止你不小心更動了程式其他部分的變數。這能將「混亂」控制在範圍內!

記憶小撇步:將區域變數想像成你用來做快速計算的廢紙。當你得出答案後,你就會把那張廢紙丟掉。


6. 結構化方法

結構化方法(Structured approach)是一種專業的編碼方式。它涉及模組化編程(Modularized programming)(將事項拆分為子程序)並使用清晰且有良好文件說明(well-documented)的介面

「良好文件說明的介面」意味著你可以非常清楚該子程序需要什麼參數,以及它會提供什麼回傳值

結構化方法的優點:

  • 程式更容易維護,因為你可以更新一個模組而不影響其他模組。
  • 代碼更容易除錯(尋找錯誤)。
  • 程式的邏輯對於其他程式設計師來說更清晰。

常見錯誤提示

「隱形」變數:學生經常嘗試在主程序中使用來自子程序的區域變數。這會導致錯誤!記住:如果在子程序內建立變數,主程序是「看不見」它的。

混淆參數與回傳值:請記住,參數是你放入果汁機的食材,而回傳值則是最後打出來的果汁!


最終快速檢查

你能解釋嗎……
1. 什麼是子程序?(一個已命名、獨立的代碼區塊)。
2. 子程序的兩個好處?(可重複使用性和更容易除錯)。
3. 參數與回傳值之間的區別?(參數傳入;回傳值傳出)。
4. 為什麼要使用區域變數?(為了節省記憶體並防止意外更動其他代碼)。

你做得很好!結構化編程是成為專業編碼員的基礎。繼續練習,試著把你自己的小程式拆解成子程序吧!