算法是為了解決某一個問題而設計的一連串清晰、可執行、按次序排列的步驟。它重點在於「思路與流程」,而不是某一種程式語言的語法。
- 輸入(Input):程式需要讀取的資料,例如數字、文字、選項。
- 處理(Process):對輸入資料進行運算、判斷、重複等操作。
- 輸出(Output):運算後要呈現的結果,例如答案、提示訊息、統計值。
算法 → 偽代碼 → 變量/賦值/運算算式/數據類型 → 選擇結構 → 循環結構,一步一步建立基礎。
以烹調食物、使用說明書等作例子:一份清楚、按次序寫好的指示,就是一個 算法。
算法是為了解決某一個問題而設計的一連串清晰、可執行、按次序排列的步驟。它重點在於「思路與流程」,而不是某一種程式語言的語法。
一般而言,一個可取的算法應具備以下特徵:
sum、count、max。空運行是不真正執行程式,而是以紙筆或心算逐行模擬程式運行,記錄每一步後各變量的值。其作用包括:
做追蹤表時,可以用「每一行執行後」作為一個步驟,並在表格內更新變量:
i、sum)。x ← x + 1,先用舊的 x 計算右邊,再把結果放回 x。偽代碼(例:n = 3):
輸入 n
sum ← 0
i ← 1
當 i ≤ n
sum ← sum + i
i ← i + 1
輸出 sum追蹤(只示意關鍵行):
| 步驟 | i | sum | 說明 |
|---|---|---|---|
| 初始化後 | 1 | 0 | 準備進入迴圈 |
| 第 1 次迴圈 | 2 | 1 | sum = 0 + 1;i = 1 + 1 |
| 第 2 次迴圈 | 3 | 3 | sum = 1 + 2;i = 2 + 1 |
| 第 3 次迴圈 | 4 | 6 | sum = 3 + 3;i = 3 + 1 |
| 停止 | 4 | 6 | i = 4 > 3,跳出迴圈並輸出 6 |
偽代碼是接近自然語言的描述方式,用簡短句子寫出每一步的動作,方便討論算法,不受任何程式語言限制。
偽代碼(Pseudocode)是一種介乎自然語言與程式語言之間的描述方法。它的目的不是讓電腦直接執行,而是讓人清楚理解算法流程。
不同教材用詞可能略有差異,但常見關鍵字與概念大致如下:
輸入 x、輸出 resultx ← 5(把右邊結果放入左邊變量)如果 條件 … 否則 …(雙向)當 條件 …、對 i 由 a 到 b …、重複 … 直到 條件流程圖(Flowchart)用圖形表示控制流程,常見符號包括:
互換的核心是辨認三種基本結構:
← 表示賦值;= 多用於比較。i ← i + 1,容易造成無窮迴圈。輸入 數值 n
sum ← 0
i ← 1
當 i <= n
sum ← sum + i
i ← i + 1
輸出 sum
建議學生先用偽代碼設計,再把邏輯轉寫成實際程式語言。
流程圖用不同圖形(開始/結束、處理、判斷、輸入輸出等)配合箭嘴,顯示控制流程。
變量可以想像成記憶體中的一個有標籤的盒子:盒子內儲存數據,盒子上寫上名稱。 在運算過程中可以讀取或更新盒子內的值。
變量可以理解為記憶體中的一個儲存位置,我們用名稱去代表它,並在程式運行期間讀取或改變其值。
score、total_mark。在偽代碼中常用箭嘴 ← 表示賦值:先計算右邊,再把結果放入左邊變量。
x ← 5 x ← x + 1 # 先用舊的 x (5) 計算右邊,得到 6,再放回 x
x ← x + 1 在數學上看似矛盾,但在程式中代表「把 x 增加 1」。很多變量在使用前需要先給定初值(初始化),否則變量可能是「未定義/不確定」狀態。
sum ← 0、count ← 0。sum ← sum + x。輸入 x 再使用 x。常數是程式中不希望被更改的固定值,例如圓周率。實務上常用全大寫表示:
PI ← 3.14159
良好命名能令算法更易讀:
total、maxScore、studentName。a、b(除非題目本身如此定義)。例子:
a ← 4 b ← a + 3 a ← b - 2
| 行 | a | b | 說明 |
|---|---|---|---|
| 1 | 4 | (未定) | a 被賦值為 4 |
| 2 | 4 | 7 | b = a + 3 = 4 + 3 |
| 3 | 5 | 7 | a = b - 2 = 7 - 2 |
x、y 時,如果沒有臨時變量,原本的值可能被覆蓋。sum 前忘記設為 0。total vs totals)。_。1number 不可)。new number、price$ 不可)。
變量名稱應反映用途,例如 weight、total_mark,避免全部只用
A、B 等。
有些值在程式中不會改變,例如圓周率 3.14159。可以用全大寫的變量名稱代表,例如 PI。
可以提醒學生:在程式中修改常數是非常不良的習慣,實際程式語言一般會以語法保護常數。
按「下一題」由題庫隨機抽一個變量名稱,然後判斷是否合法。
判斷變量名稱是否合法時,可先記住最常見的規則(不同語言細節略有差異,但考試通常依這些):
_。1stScore 不可)。new number、price$ 不可)。不少程式語言會把一些字眼保留作關鍵字(例如 if、while、for)。
score 與 Score 會被視為不同變量,但不建議這樣做,因為容易看錯。total_mark 比 x 更清楚。snake_case(例如 student_name)或 camelCase(例如 studentName)。count 來存放價錢;不要用 price 來存放人數。l(小寫 L)與 1(數字 1)。total_mark、StudentName、_index、PI1number(數字開首)、new number(有空格)、price$(有符號)、mark-1(有減號)
偽代碼通常使用箭嘴 ← 表示「把右邊的值放入左邊的變量」。
輸入 price price ← 8000 # 把 8000 放入 price new_price ← price # 把 price 的值複製到 new_price
需強調:賦值會覆蓋原來的值,並不是數學上「左右兩邊永遠相等」的意思。
除了把固定值放入變量外,也可以把運算算式的結果儲存在變量中。 算式可以由數字、變量、常數和數學運算符組成。
算術表達式(Arithmetic expression)是由數字、變量、常數及運算符組合而成的式子,重點是它計算後會得到一個值,可用於賦值或輸出。
total ← price * qty 輸出 total
+ 加法、- 減法、* 乘法、/ 除法(可得到小數)// 整數除法(只取整數部分,例如 9 // 2 = 4)% 或 MOD 取餘數(例如 9 % 2 = 1)( ) 用來改變運算次序%(餘數)。當一個表達式包含多個運算符時,需要依優先次序計算。常見次序如下(由高到低):
( )*、/、//、%)+、-)同一層級通常由左至右計算。
以 total = 17、n = 5 為例:
total // n = 17 // 5 = 3(只取整數部分)total % n = 17 % 5 = 2(因為 17 = 5 × 3 + 2)例:已知 a = 10、b = 3,計算 result ← a + b * 2
b * 2 = 3 * 2 = 6a + 6 = 10 + 6 = 16result = 16a ← 10 b ← 3 result ← a + b * 2
a + b * 2 錯算成 (a + b) * 2。5 / 2 會得到 2.5,而 5 // 2 才是 2。| 運算符 | 意義 | 例子 |
|---|---|---|
+ |
加法 | total ← a + b |
- |
減法 | diff ← x - y |
* |
乘法 | area ← length * width |
/ |
除法 | avg ← total / 5 |
// |
整數除法 | avg ← total // 5 |
% |
餘數除法 | avg ← total % 5 |
可以在課堂上配合代入數值,讓學生練習由右至左計算,再寫出存入變量後的新值。
題目會給出 x、y 的初始值及程式碼,請計算運算後 x 和 y 的最終值。
題目會給出 x、y 的初始值,以及一段包含運算與賦值的偽代碼。你需要計算程式執行完後 x、y 的最終值。
←,先計算右邊,再把結果放入左邊。x、y。如果右邊表達式較長,建議分步計算:
t = y * 2 再代回。// 或餘數 %,可用「被除數 = 除數 × 商 + 餘數」檢查。為了有效運用記憶體及進行運算,程式需要知道每一份數據的類型。常見的基本類型包括:
電腦在記憶體中儲存資料時,需要知道資料屬於哪一種數據類型,原因包括:
-5、0、27。3.14、-0.5。在很多教材/偽代碼表示法中:
'A'、'7'。"Hello"、"123"。"123" 看起來像數字,但因為有引號,所以它是字串,不能直接當作數值計算。布爾值只有兩個可能:True 或 False。它經常來自比較或邏輯運算:
isAdult ← (age ≥ 18)
如果 isAdult
輸出 "可以購票">、≤、=)的結果是布爾值。AND、OR、NOT 也是針對布爾值運算。有時資料的外觀與需要的類型不一致,例如輸入通常是文字,需要轉成數字才能計算。
age ← INT(inputAge)msg ← STRING(score)(方便輸出拼接文字)"12" + "3" 可能得到 "123",而不是 15。"9" > "10" 可能為 True(視語言字典序)。-5、0、27。3.14、-0.5。'A'、'7'。"Hello"。True 或 False 兩種情況。系統會顯示一個資料,請選擇它屬於哪一種數據類型。
系統會顯示一個資料(可能是數字、文字、True/False 等),你需要判斷它屬於哪一種數據類型。
"0"、"123":有引號 → 字串(不是整數)。'7':單一字元且有單引號 → 字元(不是整數 7)。3.0:即使小數部分是 0,有小數點 → 實數。選完類型後,可以反問自己一句:
交換兩個變量的數值是一個經典例子。若直接寫成
x ← y;y ← x,結果兩個變量會變成相同的值。
正確做法是使用臨時變量。
交換兩個變量的值(swap)是很多算法的基礎操作,例如:
a 大於 b,就交換它們的位置。最標準、最易懂的交換方法:
temp ← x x ← y y ← temp
x 的舊值存入 temp(備份)。y 放入 x。x(temp)放回 y。若寫成:
x ← y y ← x
第二行的 x 已經是「新的 x」(即原本的 y),原本的 x 已經遺失,因此最後會變成:
x 與 y 變成相同值(都是原本的 y)。有些語言/情況會介紹不用臨時變量的技巧,例如:
x ← x + y y ← x - y x ← x - y
但這種做法有風險:
x、y、temp。temp ← x 後,temp 保存的是「舊 x」。按「下一步」觀察每一行執行後 x、y、temp 的變化,再思考為甚麼需要臨時變量。
如果語句用來在條件成立時才執行某些陳述。條件通常是布爾算式(結果為 True 或 False)。
選擇結構(Selection)令程式可以根據條件,決定是否執行某些語句。最基本的是 if 單向選擇:
if 的條件是一個布爾算式,結果只能是 True 或 False。常見比較運算符:
>、<、>=、<==(相等)、≠ 或 !=(不相等)>= 50 還是 > 50。典型偽代碼寫法:
如果 條件
(條件為 True 才會執行的語句)
(if 結束後繼續往下)實際問題常需要多個條件同時判斷,可用邏輯運算符:
(age ≥ 18) AND (member = True)。= 寫成賦值;在偽代碼中建議用 ← 表示賦值以避免混淆。x > 10 不包括 10;要包括 10 應寫 x ≥ 10。例:消費滿 500 元可打九折(把 pay 更新):
輸入 amount
pay ← amount
如果 amount ≥ 500
pay ← amount * 0.9
輸出 pay解釋:
pay 設成原價,確保「不符合條件」時也有正確輸出。amount ≥ 500 才會把 pay 改為九折價。輸入 x
如果 x > 10
x ← x + 1
輸出 x
注意:只有當條件 x > 10 為 True 時,縮排在「如果」之下的 x ← x + 1 才會執行。
觀察條件是否成立,計算 if 執行後 x、y 的最終值。
這類題目通常給出初始 x、y,以及一段 if 偽代碼。解題時:
x、y。x ← x + 1,先用舊 x 計算右邊,再放回 x。> 與 >=、< 與 <= 很容易混淆。例:初始 x = 10,偽代碼:
如果 x > 10
x ← x + 5
輸出 x因為 10 > 10 為 False,所以 if 內不執行,最後輸出仍是 10。
如果…否則結構用於根據條件在兩組陳述之間作出二選一。 縮排是判斷哪一行屬於哪一部分的關鍵。
if…else 用於「二選一」情況:
如果 條件
(True 時執行)
否則
(False 時執行)
(結束後繼續往下)如果 與 否則 應在同一縮排層。當有多於兩個情況時,常用「else if」串成多分支(不同教材寫法略有差異):
如果 score ≥ 80
grade ← "A"
否則如果 score ≥ 60
grade ← "B"
否則
grade ← "C"若條件寫得不恰當,可能出現「重疊」或「永遠到不了」的分支:
score ≥ 60,再寫 score ≥ 80,後者就永遠不會被執行。60 ≤ score < 80)。例:輸入分數,輸出結果字串:
輸入 mark
如果 mark ≥ 50
result ← "及格"
否則
result ← "不及格"
輸出 result無論條件真或假,最後都會得到 result 的值,因此通常不需要在 if 之外再額外處理。
輸入 mark
如果 mark ≥ 50
result ← "及格"
否則
result ← "不及格"
輸出 result
正確的縮排方式為:如果 與 否則 置於同一層,
而屬於它們的陳述向右縮排一層。這樣即使程式較長,也能清楚看出哪一些陳述屬於哪一個分支。
留意條件為真或假時,程式執行哪一邊分支。
解題時記住:if…else 只有一邊會被執行。
x、y。建議在草稿上把不會執行的一邊劃掉(或在心中標記),避免混入計算。
> vs >=)。例:初始 x = 4:
如果 x % 2 = 0
y ← 100
否則
y ← 200因為 4 % 2 = 0,條件 True,所以 y = 100。
這一部分只包含變量及四則運算,沒有如果或循環。學生須在追蹤表中寫出每一行執行後各變量的值,然後由系統自動對答案。
本練習只包含順序結構:程式由上而下逐行執行,沒有 if(分支)和 loop(重複)。
遇到較長算式時,可以分步:
x,你卻把 y 也改了。提示:只需填寫表格中出現的變量,沒有出現的變量可以留空。
每題會給出一段迴圈程式碼,請計算迴圈結束後變量的最終值。
迴圈用於重複執行一段語句,直到達成某個停止條件。設計迴圈時,通常要同時想清楚三件事:
for 迴圈通常用於「重複次數已知」或「由某範圍逐步掃描」的情況。
sum ← 0
對 i 由 1 到 5
sum ← sum + i
輸出 sumi 會自動由 1 變到 5(是否包含終點視題目寫法)。while 迴圈會先檢查條件,只有在條件為 True 時才進入迴圈。
i ← 1
當 i ≤ 5
輸出 i
i ← i + 1do…while 的特點是:先執行一次迴圈內容,再檢查條件是否繼續。
do
x ← x + 1
while x < 10x 已經不小於 10,也會先執行一次 x ← x + 1。repeat…until 常見寫法是:
重複
(迴圈內容)
直到 條件i ← i + 1 放錯位置,會影響執行次數或導致無窮迴圈。