簡介:結構化與邏輯程式設計
歡迎來到結構化程式設計 (Structured Programming) 的章節!別擔心這個名字聽起來很複雜,它其實只是一套規則與最佳實踐,能幫助我們寫出清晰、易讀且容易修正(除錯/debug)的程式碼。
你可以把結構化程式設計想像成拼樂高積木。與其隨意亂堆,你透過說明書(結構)來確保你的成品既穩固又合理。
掌握了這些概念後,你將學會如何將程式碼組織成強大且合乎邏輯的步驟。這對每一位電腦科學家來說都至關重要!
1. 結構化程式設計的基石
結構化程式設計完全依賴三個基礎控制結構。無論你編寫的程式有多複雜,終究都只會運用這三種技術。
1.1 循序結構 (Sequence)
循序結構是最基本的控制結構。這意味著程式中的指令會按照它們編寫的確切順序,一條接一條地執行。
類比: 參考食譜或綁鞋帶。你必須先完成第 1 步,才能繼續進行第 2 步,以此類推。
- 執行指令 A。
- 接著執行指令 B。
- 最後執行指令 C。
重點筆記: 循序結構決定了程式執行時由上而下的線性流向。
1.2 選擇結構 (Selection)
選擇結構(或稱條件式/Conditionals)允許程式根據特定條件為真(TRUE)或為假(FALSE)來做出決策,進而決定程式將執行哪一條指令路徑。
我們常用到的架構包括 IF、ELSE IF(有時寫作 ELIF)以及 ELSE。
選擇結構如何運作:
- 程式檢查一個條件(例如:氣溫是否高於 20 度?)。
- 如果條件為 TRUE,則執行一段程式碼。
- 如果條件為 FALSE,則可能執行另一段不同的程式碼(即 ELSE 的部分)。
範例:
IF (User_is_18_or_older) THEN
DISPLAY "歡迎,請進。"
ELSE
DISPLAY "拒絕存取。"
END IF
重要提示: 當你需要檢查多個條件時,請使用 ELSE IF (ELIF),而 ELSE 則會捕捉所有未符合上述條件的情況。
快速回顧: 選擇結構讓你的程式能從兩個或多個可能性中選擇一條路徑。
1.3 重複結構 (Iteration)
重複結構是指將一段程式碼重複執行多次。這對於節省時間並提升程式效率極為有用(試想如果必須手寫 100 次 "print 'Hello'" 會有多累!)。
你需要知道兩種主要的重複結構:
1.3.1 固定次數重複 (FOR 迴圈)
當你精確知道程式碼需要重複多少次時使用,這通常稱為計數控制迴圈 (count-controlled loop)。
類比: 在健身房計算次數。你預先決定要做 10 個伏地挺身(迴圈精確重複 10 次)。
FOR Count FROM 1 TO 10 DO
// 程式碼區塊將執行 10 次
END FOR
1.3.2 條件控制重複 (WHILE 迴圈)
當你不知道程式碼需要重複的確切次數時使用。迴圈會一直(WHILE)重複,直到特定條件不再為真。這是一種條件控制迴圈 (condition-controlled loop)。
類比: 攪拌湯汁直到它變得滑順。你不知道確切需要攪拌幾次,但你持續攪拌,直到湯不再不滑順(即:WHILE 湯不滑順,則繼續攪拌)。
WHILE (Score_is_less_than_100) DO
Add_Points()
END WHILE
避免常見錯誤:無窮迴圈 (Infinite Loop)!
如果 WHILE 迴圈中的條件永遠無法變成 FALSE(例如 WHILE 5 > 2 DO...),迴圈將會永遠執行下去,導致程式崩潰。務必確保迴圈有一個明確的終止方式!
2. 模組化程式設計:程序與函式
隨著程式規模擴大,管理起來會變得更加困難。模組化程式設計 (Modular Programming) 透過將龐大的程式分解成較小、獨立的迷你程式(稱為模組 (modules) 或子程式 (sub-programs))來解決此問題。
2.1 為什麼要使用模組(子程式)?
使用程序與函式非常重要,因為它能提升:
- 可讀性 (Readability): 主程式看起來更簡潔,更容易理解。
- 可維護性 (Maintainability): 如果發生錯誤(bug),你只需要查看該小型模組,而不需要翻遍整個龐大的程式。
- 可重用性 (Reusability): 你可以在程式的不同部分重複使用同一個模組(例如:計算稅額),甚至在不同程式中重複使用,而無需重新編寫。
2.2 程序 (Procedures)
程序是一組已命名的指令序列,旨在執行特定的任務。
- 它們用於執行某個動作(例如:顯示訊息、儲存檔案)。
- 程序執行完其指令後,會將控制權交回給主程式。
- 關鍵點在於,它們不一定會回傳值。
範例: 一個程序可能名為 DisplayWelcomeMessage()。它執行其動作(顯示訊息)然後結束。它不會進行計算或回傳任何結果。
2.3 函式 (Functions)
函式與程序相似,但有一個關鍵差異:
- 函式旨在計算出一個數值。
- 函式必須回傳一個值給主程式(或呼叫它的程式碼區段)。
- 它們就像迷你計算機。
範例: 一個函式可能名為 CalculateArea()。你給它寬與高,它執行計算,並回傳計算後的面積值。
記憶小撇步: Function (函式) 總是會回傳一個 Final (最終) 答案。而程序只是單純遵循指令。
2.4 參數 (Parameters / Passing Data)
我們如何將資料傳入程序與函式,讓它們完成工作?我們使用參數 (Parameters)(有時稱為引數 / Arguments)。
參數是一種用來在呼叫子程式時,將資料或資訊傳入其中的變數。
類比: 如果你的函式是果汁機,參數就是你放入果汁機的配料(水果、牛奶),這樣它才能製作果昔。
當你定義一個函式或程序時,你需要指定它所預期的參數:
FUNCTION CalculateArea (Width, Height)
Area = Width * Height
RETURN Area
END FUNCTION
當主程式呼叫 (call) 此函式時,它會提供實際的資料:
My_Space = CalculateArea(10, 5) // 10 和 5 是被傳入的值
在此範例中:Width 和 Height 是函式中定義的參數,而 10 和 5 則是使用函式時傳遞給這些參數的數值。
參數總結:
- 它們允許模組在每次呼叫時處理不同的資料。
- 它們使程式碼更具彈性且易於重用。
你知道嗎? 模組化程式設計在 1960 年代是一個革命性的概念!在那之前,程式碼通常被寫成一長串令人困惑的區塊,讓除錯成為一場徹底的惡夢。結構化程式設計讓複雜軟體的誕生變得可能!
快速回顧盒:結構化程式設計精華
三大控制結構:
1. 循序結構 (Sequence): 做 A,接著做 B,最後做 C。
2. 選擇結構 (Selection): 如果條件為 TRUE,則做此動作。
3. 重複結構 (Iteration): 重複程式碼(FOR 指定次數,或 WHILE 條件為真)。
模組化程式設計:
• 程序 (Procedure): 執行任務;不一定需要回傳值。
• 函式 (Function): 計算數值;必須回傳值。
• 參數 (Parameter): 傳入子程式的資料,使其能執行任務。