---
# System prepended metadata

title: 【3-3】二維陣列

---

# 【3-3】二維陣列

隨著學期的過去，小考的次數也越來越多，上次我們學會用陣列來儲存考試成績，但不同次的考試成績不能存在一起，怎麼辦呢？

你可能會說，那就，多宣告幾個一維陣列：

```cpp
int a[50]; // 第一次考試成績
int b[50]; // 第二次考試成績
int c[50]; // 第三次考試成績
int d[50]; // 第四次考試成績
int e[50]; // 第五次考試成績

for(int i=0;i<50;i++){
    cin >> a[i];
}

for(int i=0;i<50;i++){
    cin >> b[i];
}

for(int i=0;i<50;i++){
    cin >> c[i];
}

for(int i=0;i<50;i++){
    cin >> d[i];
}

for(int i=0;i<50;i++){
    cin >> e[i];
}
```

看著很疲勞的感覺，有沒有辦法不要宣告這麼多陣列呢？

## 二維陣列

二維陣列，本質上就是多個長度相同的一維陣列合併，就像平常畫表格一樣。

### 宣告方式

```cpp
int a[m][n]; // 宣告一個名稱為 a，由 m 個長度為 n 的一維陣列組成的二維陣列
```

### Python對照

```python
a = [[0] * n for _ in range(m)]  # 建立一個 m 行 n 列，初始值為 0 的二維 list
```

如果已經知道要存什麼，也可以這樣寫：

```cpp
int a[2][3]={{4,6,3},{1,2,5}};
```

### Python對照

```python
a = [[4, 6, 3], [1, 2, 5]]
```

![image](https://hackmd.io/_uploads/S1zoVIZHgx.png)

---

### 編碼方式

原則上和一維陣列相同，只不過有兩個變數可以改。表格左上角為 `a[0][0]`，往右跟往下都為正。

![image](https://hackmd.io/_uploads/ryXyHL-Bgl.png)

---

### 陣列的遍歷

因為有兩個變數，所以我們要用兩個 `for` 迴圈。

### 輸入

宣告一個大小合適的二維陣列，依序讀入資料。

```cpp
int m,n;
cin >> m >> n;
int a[m][n];
for(int i=0;i<m;i++){
    for(int j=0;j<n;j++){
        cin >> a[i][j];
    }
}
```

### Python對照

```python
m, n = map(int, input().split())
a = []
for i in range(m):
    row = list(map(int, input().split()))
    a.append(row)
```

透過 `i`，我們先選定其中一列（其中一個一維陣列），再用 `j` 遍歷每一格。接著再換下一個一維陣列，重複直到讀入所有資料。

---

### 輸出

假設陣列中已經有資料了，這時候就一樣用 `for` 迴圈遍歷，只是改成 `cout` 而已。

```cpp
for(int i=0;i<m;i++){
    for(int j=0;j<n;j++){
        cout << a[i][j];
    }
}
```

### Python對照

```python
for i in range(m):
    for j in range(n):
        print(a[i][j], end='')  # end='' 表示不換行輸出
```

如果只需要特定一格的資料，也可以直接 `cout` 那一格的編號就好。

---

套用回剛才的例子，我們就可以宣告長度為 50，由 5 個一維陣列合併成的二維陣列：

```cpp
int a[5][50];
for(int i=0;i<5;i++){
    for(int j=0;j<50;j++){
        cin >> a[i][j];
    }
}
```

### Python對照

```python
a = []
for i in range(5):
    row = list(map(int, input().split()))
    a.append(row)
```

要查詢第 `i` 次座號 `j` 的小考成績，就直接輸出 `a[i-1][j-1]` 就可以了。

```cpp
cout << a[i-1][j-1];
```

### Python對照

```python
print(a[i-1][j-1])
```

記得！陣列是 0-index 編碼。

---

聯絡方式：[codecodefunny@gmail.com](mailto:codecodefunny@gmail.com)
最後編修時間：2025/07/10 子柚筆
