學習筆記:主題 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) 為例:
- 開始: 從終止符開始,標註為 START。
- 輸入: 使用輸入/輸出平行四邊形來獲取年齡:INPUT Age。
- 決策: 使用決策菱形來檢查條件:Age >= 18?
- 處理路徑:
- 如果為 YES (True):沿著流程線指向一個輸入/輸出平行四邊形:WRITE "Access granted"。
- 如果為 NO (False):沿著另一條流程線指向一個輸入/輸出平行四邊形:WRITE "Access denied"。
- 合併與結束: 如有必要,使用連接符將兩條路徑合併,或直接將它們連回至最終的終止符,標註為 STOP。
(註:由於無法在此 HTML 格式中直接呈現圖像,請按照上述步驟在腦海中勾勒這些形狀!)
4.2.3 在流程圖中表示迴圈
所有的迭代結構 (FOR, WHILE, REPEAT) 主要都是通過決策菱形和指回圖表上方的流程線來表示的。
- WHILE 迴圈: 決策菱形必須出現在處理方塊之前,用以控制是否進入迴圈主體。
- REPEAT 迴圈: 決策菱形出現在處理方塊之後,確保迴圈在檢查條件前至少執行一次。
編輯與識別錯誤
能夠識別錯誤(無論是在偽代碼還是在流程圖中)是一項關鍵技能。
4.3.1 應避免的常見演算法錯誤
-
無限迴圈 (Infinite Loops): 當迴圈的停止條件永遠無法達成時發生。
錯誤範例: 一個 WHILE 迴圈沒有更新其條件所使用的變數(例如:
WHILE Count < 10,但Count從未遞增)。 -
迴圈邊界錯誤: 使用了
<而不是<=,或是計數器應該從 1 開始卻從 0 開始。請務必檢查迴圈是否運行了正確的次數。 -
分支邏輯錯誤: 使用了錯誤的比較運算符(例如:當你本意是
>=時卻使用了>),這會導致演算法在邊界情況下走錯路徑。 -
偽代碼語法錯誤: 關鍵字不匹配(例如:以
IF開始卻以NEXT結束,或者忘記了ENDIF)。
4.3.2 識別流程圖中的錯誤
檢查流程圖時,請留意:
- 斷開的符號: 是否每個符號都由流程線連接?
- 無效的決策輸出: 決策菱形是否有兩條明確標記的出口路徑(例如:T/F 或 Y/N)?
- 符號使用錯誤: 是否將處理方塊誤用於輸入,或將輸入/輸出方塊誤用於計算?
- 迴圈方向: 在重複結構中,流程線是否正確地迴圈回到決策點?
如果起初覺得識別錯誤很棘手,別擔心!這項技能會隨著練習而進步。檢查的最佳方法是使用簡單的測試數據來追蹤演算法,看看它是否如預期般運作。
重點回顧
演算法是用偽代碼編寫的描述性步驟,重點在於清晰度與結構化邏輯(選擇、迭代、程序)。流程圖則是視覺化圖表,使用標準符號來規劃演算法的流程與順序。兩者都必須準確反映所要解決的問題。