# 【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]]
```

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

---
### 陣列的遍歷
因為有兩個變數,所以我們要用兩個 `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 子柚筆