二維陣列(Two-dimensional Array)

以「表格/格子」理解資料結構,並掌握 arr[row][col]、大小(列×欄)與雙重循環逐格掃描。

一、學習目標

重點

  • 表格/格子作直觀比喻,理解二維陣列的結構。
  • 掌握列(row,橫向)欄(col / column,縱向),並能用兩個索引定位元素。
  • 能用 arr[row][col] 存取或修改指定格子,並避免把 row/col 顛倒。
  • 理解二維陣列的大小是列數 × 欄數,並能處理常見錯誤(索引越界、列長不一致)。
  • 能使用雙重循環(nested loops)逐格掃描,完成計數、搜尋、條件檢查等任務。

在日常生活中,我們經常接觸到「表格」:例如座位表、時間表、成績表、棋盤、像素圖像。二維陣列的用途,就是把這些「表格」用程式的方式表達出來,讓電腦可以逐格處理。

本頁會循序介紹二維陣列的概念、arr[row][col] 的讀法、大小(列數×欄數)、以及雙重循環逐格掃描。學到最後,你應該能把二維陣列套用到不同情境,並能自行寫出處理表格的程式。

二、概念引入:二維陣列是甚麼

重點

  • 一維陣列像一條清單;二維陣列像一張表格
  • 二維陣列可以理解為由多個一維陣列組成(清單中的清單)。
  • 每格要用兩個索引定位:row(列)col(欄)

一維陣列可以想像成「一列清單」,例如分數清單、商品價格清單;只要用一個位置(第幾個)就能找到資料。

二維陣列則是「表格化」的清單:它由多列資料組成,而每列又有多欄。當資料天然呈現為表格(例如:座位表、棋盤、地圖、試算表)時,用二維陣列可以令資料結構更貼近問題本身。

三、為甚麼需要二維陣列

重點

  • 當資料需要同時用兩個方向(列與欄)定位時,二維陣列最自然。
  • 二維陣列令程式更容易寫出「逐格處理」:計數、搜尋、檢查。
  • 若硬用一維存表格,往往要自行換算索引,較易出錯。

很多問題本身就是「表格」:資料不是排成一條直線,而是有兩個方向可延伸。當你需要用「第幾列 + 第幾欄」去描述位置時,二維陣列能直接反映問題結構,程式也更容易閱讀。

此外,二維陣列非常適合配合雙重循環逐格處理。只要建立一個固定的掃描骨架,你便可以在表格上完成大量任務,例如統計、搜尋、判斷某一列是否全部符合條件等。

表格例子:成績表(3 位同學 × 3 次測驗)

測驗 0 測驗 1 測驗 2
同學 0 72 68 80
同學 1 91 86 88
同學 2 60 73 70

若用二維陣列表示,這張表可寫成 scores[row][col]:row 代表「第幾列(哪位同學)」,col 代表「第幾欄(第幾次測驗)」。

Check Point 1:何時要用二維陣列?

重點

  • 若資料天然是格子/表格,通常應考慮二維陣列。
  • 若只是一條清單(只有一個方向),一維會更簡潔。
  • 按情境判斷:座位表、棋盤、地圖 → 二維;分數清單、紀錄序列 → 一維。

小測:何時要用二維陣列?

(載入中…)



      
    

四、結構理解:列(Row)與欄(Column)

重點

  • 香港教材常用:Row(橫向)= 列Column(縱向)= 欄
  • 二維陣列常用 arr[row][col]:先列(row),後欄(col)。
  • 索引多數由 0 開始:第一列是 row=0,第一欄是 col=0。

要處理二維陣列,第一步必須把「列」與「欄」分清楚。當你看到 arr[row][col],請把它理解成「先選一列,再選該列中的一欄」。

香港教材常見譯法是:Row(橫向)稱為「列」,Column(縱向)稱為「欄」。只要你在整個題目中保持一致,不論採用哪一種叫法,最重要都是弄清楚:哪一個索引代表哪一個方向。

表格例子:按格子顯示它的 row/col

請按任何一格,系統會顯示它屬於第幾列(row)及第幾欄(col)。

Check Point 2:arr[row][col] 的讀法與常見混淆

重點

  • arr[row][col] 讀法:先列(row),後欄(col)。
  • 把 row/col 顛倒,最常見後果是取錯格或越界。
  • Python 的 list-of-lists:通常用 arr[row][col]
  • 偽代碼/部分語言(或 NumPy 陣列):有時會見到 arr[row, col] 這種記法(逗號代表同時提供兩個索引)。

小測:arr[row][col] 的讀法

(載入中…)



      
    

五、基本操作:存取(讀取)與更新(修改)

重點

  • 存取某一格:value = arr[row][col]
  • 更新某一格:arr[row][col] = newValue
  • 本節的表格會跟隨 Python 程式更新,讓你看到「改哪一格」的效果。

二維陣列的「地址」是 (row, col)。一旦你能正確指出某格的位置,讀取與更新就只是兩行程式:讀取用 arr[row][col],修改則把它放在等號左邊。

為了把概念連到具體效果,本節提供一個可互動表格:你可以直接執行(或修改)Python 程式,表格會同步顯示目前的二維陣列內容,讓你觀察「改哪一格」會怎樣影響整張表。

互動示範:Python 修改二維陣列 → 表格同步更新

步驟:① 修改下面的 Python 程式(例如改某一格的值)→ ② 按 Run 程式 → ③ 觀察表格變化。

# 1) 建立二維陣列(列×欄)
arr ← [[10,20,30],
       [40,50,60]]

# 2) 讀取:輸出第 0 列第 2 欄
輸出 arr[0][2]

# 3) 更新:把第 1 列第 1 欄改成 999
arr[1][1] ← 999

# 4) 輸出整個 arr(方便檢查)
小提示:你可以嘗試把 arr[1][1] 改成其他座標,例如 arr[0][0]arr[1][2],再觀察表格哪一格會改變。

六、大小與形狀:列數 × 欄數

重點

  • 二維陣列大小可描述為:列數(rows)× 欄數(cols)
  • 合法索引範圍:row = 0..rows-1col = 0..cols-1
  • 列長不一致(不規則陣列)會增加處理難度;初學建議先用規則矩陣。

理解二維陣列的大小,最直接的方法是把它當成一張表格:有多少列,就代表你可以用多少個 row 索引;每列有多少欄,就代表你可以用多少個 col 索引。

寫程式時,最常見錯誤就是「索引越界」。所以請牢記:總列數是 rows,但最後一列索引是 rows-1;總欄數是 cols,但最後一欄索引是 cols-1。

互動練習:輸入列數與欄數,生成一張表格

提示:按格子可查看其座標(row/col)。

Check Point 3:索引範圍與越界(out of range)

重點

  • Python 的 list 索引通常由 0 開始(0-based)。
  • rows 代表總列數,但合法 row 索引是 0..rows-1
  • 越界最常見原因:把上界寫成 rows 或 cols。

小測:索引範圍(避免越界)

(載入中…)



      
    

七、核心能力:雙重循環(Nested Loops)逐格掃描

重點

  • 二維陣列最重要用途之一:用程式逐格處理整張表格。
  • 最典型掃描骨架:外層走 row(列),內層走 col(欄)。
  • 本節提供「Step 模式」:你可以逐步看到程式走到哪一格。

二維陣列的強大之處不只在於「可以存表格」,更在於「可以逐格處理表格」。只要你掌握雙重循環,就能用程式走遍整張表,完成大量重複工作。

很多題目其實都是同一套路:先用雙重循環逐格掃描,然後在循環內做條件判斷或累加。以下的 Step 模式示範,會把掃描過程可視化,幫助你真正理解程式是如何一格一格走過表格。

互動示範:逐格掃描(Step 模式)

步驟:① 按 Run 程式 產生掃描步驟 → ② 用「下一步」觀察掃描順序(目前所在格會以黃色標示)。

grid ← 3×4 的二維陣列(0/1)
steps ← 空清單
walls ← 0

for row = 0 到 rows-1
  for col = 0 到 cols-1
    把 (row, col) 加入 steps
    若 grid[row][col] == 1
      walls ← walls + 1

輸出 walls
觀察要點:外層 row(列)每加 1,程式就會回到最左邊(col=0)重新由左至右掃一次。

Check Point 4:雙重循環的掃描順序

重點

  • 最常見逐格掃描:外層 row(列),內層 col(欄)。
  • 若要「按欄」統計,可改為外層 col、內層 row。
  • 二維資料若不先轉換,通常需要雙重循環才能遍歷每一格。

小測:雙重循環掃描順序

(載入中…)



      
    

八、典型情境連結:二維陣列在現實中出現在哪裡?

重點

  • 二維陣列最常見於格子化資料:座位表、棋盤、迷宮地圖、試算表、像素圖像。
  • 同一個概念,可以在不同場景套用:每格都有 (row, col)。
  • 理解情境有助你在題目中快速辨認「這其實是一張表格」。

要真正掌握二維陣列,你需要能把它「對應到現實中的表格」。以下提供五個常見情境的迷你模擬器:它們看似不同,但本質都是同一件事——用 (row, col) 表示一格,並在格子上存放狀態或數值。

你可以在不同情境之間切換,觀察每個模擬器背後的二維資料如何改變。特別留意:無論是座位、棋子、迷宮格、試算表格,或像素點,操作時其實都是在修改某一個 grid[row][col]

座位表(每格存放姓名/狀態)

操作:先按格子選取座位,再在右邊輸入內容並按「更新此格」;這就相當於更新 seat[row][col]

編輯選取座位

目前選取:(未選取)
對應程式:seat[row][col] = ...
顯示二維陣列資料(seat)

九、20 條偽代碼挑戰:偽代碼 → Python

重點

  • 每題都有偽代碼、Python 編輯器、以及「核對答案」。
  • 建議先寫讀入與建立矩陣,再寫雙重循環骨架,最後處理 if 條件。
  • 遇到錯誤可用 print 輸出中間結果(row、col、累加值)協助除錯。

以下 20 題已按難度由淺入深排列。每題都提供偽代碼與 Python 編輯器;你可以直接在頁面內撰寫程式並執行。若想快速檢查是否做對,可以使用「核對答案」。

建議做題流程:先根據偽代碼把輸入讀入與矩陣建立完成,再寫雙重循環骨架,最後才處理 if 條件與輸出格式。若核對失敗,可以暫時在循環內加入 print 輸出中間結果(例如目前的 row/col、目前累加值),找出哪一步與偽代碼不一致。

若你在「核對答案」中看到不正確,請先檢查:
① 是否把 rows / cols 寫反?② range 的上界是否正確?③ 是否把 row/col 顛倒?④ 是否按題目要求輸出(換行/空格)?
(正在載入挑戰題…)