# 【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 子柚筆