學習筆記:主題 4 - 演算法與流程圖 (9626 AS Level)

你好,未來的資訊科技專家!這一章我們將要學習如何用「計算機語言」來解決問題。無論你是要構建一個龐大的企業系統,還是僅僅決定晚餐要吃什麼,你都在執行一系列的步驟。在計算領域中,這些步驟被稱為演算法 (Algorithms)。

理解演算法與流程圖是所有工作的基石,它們構成了每一款軟件的藍圖。只要掌握了這些,你就掌握了編程的核心邏輯!

快速複習:為什麼我們需要演算法?

  • 提供一套清晰、無歧義的步驟序列,以解決特定問題。
  • 讓程式設計師在編寫代碼之前就能設計好邏輯(節省時間與成本)。
  • 確保解決方案合乎邏輯,並能讓他人易於理解與維護。

4.1 演算法:操作說明書

演算法 (Algorithm) 是一組用於完成特定任務的有限、定義明確、循序漸進的程序。你可以把它想像成電腦的「食譜」。

在考試中,你需要使用結構化的英語來撰寫演算法,這被稱為偽代碼 (Pseudocode)

4.1.1 基本輸入與輸出

這些指令用於處理資料如何進入及離開系統。

  • INPUT/READ (輸入/讀取): 從用戶或檔案獲取資料。

    範例: INPUT UserName

  • WRITE/PRINT (輸出/打印): 在螢幕、打印機或檔案中顯示或輸出資料。

    範例: WRITE "Welcome, " & UserName

4.1.2 算術運算

演算法使用標準算術運算符來進行計算:

  • 加法:\(+\)
  • 減法:\(-\)
  • 乘法:\(*\)
  • 除法:\(/ \)

範例:
TotalCost = Quantity * Price

4.1.3 選擇 (決策)

選擇結構允許演算法根據條件在不同的執行路徑中進行選擇。這被稱為條件分支 (conditional branching)

IF...ELSE...ENDIF 結構

當有兩條可能的路徑時使用此結構。

結構:

IF (條件為真) THEN
    // 執行此動作
ELSE
    // 執行另一個動作
ENDIF

範例 (檢查年齡):
INPUT Age
IF Age >= 18 THEN
    WRITE "Access granted"
ELSE
    WRITE "Access denied"
ENDIF

比較運算符 (Comparison Operators) 對於條件判斷至關重要:
\(>\) (大於), \(<\) (小於), \(=\) (等於), \(\neq\) (不等於), \(\ge\) (大於或等於), \(\le\) (小於或等於)。

CASE...ENDCASE 結構

當你需要根據單一變數的值做出多個選擇時使用此結構。這比嵌套大量的 IF 語句更整潔、易讀。

結構:

CASE OF 變數
    值 1: // 值 1 對應的動作
    值 2: // 值 2 對應的動作
    OTHERWISE: // 若均不匹配時的動作
ENDCASE

4.1.4 迭代 (迴圈)

迭代,或稱迴圈 (looping),是指將一段代碼重複執行多次的過程。

FOR...NEXT 迴圈

當你知道迴圈需要運行多少次時(確定次數的迭代),請使用此結構。

結構:

FOR 計數器 = 起始值 TO 結束值 [STEP 遞增值]
    // 迴圈內的動作
NEXT 計數器

範例 (倒數計時):
FOR i = 10 TO 1 STEP -1
    WRITE i
NEXT i

小知識: 如果你省略 STEP 遞增值,預設步長為 1。

WHILE...ENDWHILE 迴圈

這是一個前置條件 (pre-condition) 迴圈:條件會在迴圈第一次執行之前進行檢查。如果條件一開始就是假的,迴圈將永遠不會執行。

結構:

WHILE (條件為真)
    // 迴圈內的動作
ENDWHILE

類比: 出門前檢查天氣(條件)。如果是晴天,你就不會帶雨傘(迴圈內的動作)。

REPEAT...UNTIL 迴圈

這是一個後置條件 (post-condition) 迴圈:迴圈內的動作至少會執行一次,條件是在執行之後才進行檢查。迴圈會一直持續,直到條件變為真 (TRUE) 為止。

結構:

REPEAT
    // 迴圈內的動作(至少會執行一次)
UNTIL (條件為真)

類比: 你試著打開一個很難開的罐子(迴圈動作),並不斷嘗試(repeat),直到蓋子打開為止(條件為真)。

嵌套迴圈 (Nested Loops)

嵌套迴圈是指迴圈裡面還有另一個迴圈。這對於處理表格(行與列)等資料至關重要。

重要提示: 內部迴圈必須完成所有迭代,外部迴圈才能進入下一次迭代。請務必使用不同的計數器變數(例如:外部迴圈用 i,內部迴圈用 j)。

4.1.5 程序與副程式 (Procedures and Subroutines)

程序 (Procedure)(或稱副程式 (Subroutine))是一個獨立的代碼區塊,專門用於執行特定任務。

  • 它們有助於將複雜的程序拆解為更小、易於管理的部分(模組化)。
  • 它們允許代碼輕鬆重用,無需重複編寫。

在偽代碼中,你會定義或宣告 (declare)該副程式,然後在稍後呼叫 (call)它:

範例:
PROCEDURE Calculate_Tax (Salary)
    Tax = Salary * 0.20
    WRITE Tax
ENDPROCEDURE

呼叫副程式:
CALL Calculate_Tax (50000)


快速複習:偽代碼結構

  • 選擇 (Selection): 選擇執行路徑 (IF/ELSE 或 CASE)。
  • 迭代 (Iteration): 重複動作 (FOR, WHILE, REPEAT)。
  • 程序 (Procedures): 組織並重用代碼區塊。

記憶小幫手: 根據檢查點記住迴圈類型:WHILE 在 Whole time(整個過程)開始時檢查(前置條件);REPEAT 在 Rear(末端/後面)檢查(後置條件)。


4.2 流程圖:視覺化地圖

流程圖 (Flowchart) 是演算法的圖解表示。它使用標準符號來呈現為了得出解決方案而需執行的操作順序。

流程圖對於遇到困難的學生非常有用,因為它提供了一種視覺化的方式來跟蹤程式邏輯,並輕鬆識別潛在錯誤。

4.2.1 標準流程圖符號

你必須掌握以下(課程大綱中規定的)標準符號的形狀、名稱及其功能:

符號名稱 形狀 (描述) 功能 / 用途
終止符 (Start/Stop) 橢圓形 / 圓角矩形 表示程式或演算法的開端或終點。
輸入/輸出 平行四邊形 用於任何資料輸入 (READ, INPUT) 或資料輸出 (WRITE, PRINT)。
處理方塊 (Process) 矩形 表示任何處理或計算步驟(例如:賦值、算術運算)。
決策 (Decision) 菱形 代表決策或條件測試 (IF...THEN)。它必須有一條進入流程線和兩條輸出流程線(通常標記為 YES/NO 或 TRUE/FALSE)。
副程式 (Subroutine) 帶有雙垂直線的矩形 代表對已定義的特定程序或副程式的呼叫。
連接符 (Connector) 圓形(通常包含字母/數字) 用於表示流程圖連接到同一頁面的其他位置,以避免交叉的流程線。
流程線 (Flowline) 箭頭 顯示流程圖中控制的指向與順序。

4.2.2 繪製流程圖:逐步指南

讓我們以檢查用戶年齡的條件分支結構 (IF...ELSE...ENDIF) 為例:

  1. 開始:終止符開始,標註為 START。
  2. 輸入: 使用輸入/輸出平行四邊形來獲取年齡:INPUT Age
  3. 決策: 使用決策菱形來檢查條件:Age >= 18?
  4. 處理路徑:
    • 如果為 YES (True):沿著流程線指向一個輸入/輸出平行四邊形:WRITE "Access granted"
    • 如果為 NO (False):沿著另一條流程線指向一個輸入/輸出平行四邊形:WRITE "Access denied"
  5. 合併與結束: 如有必要,使用連接符將兩條路徑合併,或直接將它們連回至最終的終止符,標註為 STOP。

(註:由於無法在此 HTML 格式中直接呈現圖像,請按照上述步驟在腦海中勾勒這些形狀!)

4.2.3 在流程圖中表示迴圈

所有的迭代結構 (FOR, WHILE, REPEAT) 主要都是通過決策菱形和指回圖表上方的流程線來表示的。

  • WHILE 迴圈: 決策菱形必須出現在處理方塊之前,用以控制是否進入迴圈主體。
  • REPEAT 迴圈: 決策菱形出現在處理方塊之後,確保迴圈在檢查條件前至少執行一次。

編輯與識別錯誤

能夠識別錯誤(無論是在偽代碼還是在流程圖中)是一項關鍵技能。

4.3.1 應避免的常見演算法錯誤

  1. 無限迴圈 (Infinite Loops): 當迴圈的停止條件永遠無法達成時發生。

    錯誤範例: 一個 WHILE 迴圈沒有更新其條件所使用的變數(例如:WHILE Count < 10,但 Count 從未遞增)。

  2. 迴圈邊界錯誤: 使用了 < 而不是 <=,或是計數器應該從 1 開始卻從 0 開始。請務必檢查迴圈是否運行了正確的次數。
  3. 分支邏輯錯誤: 使用了錯誤的比較運算符(例如:當你本意是 >= 時卻使用了 >),這會導致演算法在邊界情況下走錯路徑。
  4. 偽代碼語法錯誤: 關鍵字不匹配(例如:以 IF 開始卻以 NEXT 結束,或者忘記了 ENDIF)。

4.3.2 識別流程圖中的錯誤

檢查流程圖時,請留意:

  • 斷開的符號: 是否每個符號都由流程線連接?
  • 無效的決策輸出: 決策菱形是否有兩條明確標記的出口路徑(例如:T/F 或 Y/N)?
  • 符號使用錯誤: 是否將處理方塊誤用於輸入,或將輸入/輸出方塊誤用於計算?
  • 迴圈方向: 在重複結構中,流程線是否正確地迴圈回到決策點?

如果起初覺得識別錯誤很棘手,別擔心!這項技能會隨著練習而進步。檢查的最佳方法是使用簡單的測試數據來追蹤演算法,看看它是否如預期般運作。


重點回顧

演算法是用偽代碼編寫的描述性步驟,重點在於清晰度與結構化邏輯(選擇、迭代、程序)。流程圖則是視覺化圖表,使用標準符號來規劃演算法的流程與順序。兩者都必須準確反映所要解決的問題。