二維數組 顧名思義就是有兩個方向維度的數組,與其說是數組,更不如說是“矩陣”形象些,因為它就像矩陣一樣幾行幾列地展開。
二位數組定義方式與一維數組相似,只不過下標由兩個方括號表示,代表了它有橫行縱列,正如: 類型名 數組名[行數量][列數量]
關於二維數組的使用
初始化:定義了一個二維數組首先就是對它進行初始化,這里舉例一個可以對二維數組進行初始化的函數:memset(void *s, int x, unsigned long n)
其中三個傳入參數分別是:
待初始化的數組(*s) 表示傳入數組的首地址,通常情況是數組名
初始化目標值(x) 表示要初始化為何值
初始化字節長度(n) 表示初始化該數組的前n個字節 通常情況我們都是初始化整個數組 所以這里可以用 sizeof(數組名) 來表示
我們也可以通過循環遍歷的方法對數組內的每個元素進行賦值來達到對整個數組進行初始化的效果
也就是用兩個for循環來完成:
for (int i = 0; i < m; i++){ // m表示行數量 for (int j = 0; j < n; j++){ // n表示列數量 arr[i][j] = 0; } }
輸入&輸出:
也是可以像初始化一樣通過循環遍歷的的方法依次輸入或輸出數組內的每個元素,只要將最內層循環里的語句換成對應的輸入(scanf)或輸出(printf)語句即可。
應用示例:
“螺旋方陣”,是指對任意給定的N,將1到N×N的數字從左上角第1個格子開始,按順時針螺旋方向順序填入N×N的方陣里。本題要求構造這樣的螺旋方陣。
輸入格式:
輸入在一行中給出一個正整數N(<10)。
輸出格式:
輸出N×N的螺旋方陣。每行N個數字,每個數字占3位。
分析:
本題要構造一個n*n的二維數組,然后將數據從1開始按順時針的螺旋方向依次填入數組內,直至構成一個“螺旋方陣”
具體說明見代碼注釋
代碼:
#include <stdio.h> #include <string.h> int main() { int n, arr[10][10]; scanf("%d", &n); memset(arr, 0, sizeof(arr)); // 數組初始化 memset函數需引用string.h頭文件 int t = 1, x = 0, y = 0; // t表示填入方陣的數值,從1開始累加到n² x和y分別表示行和列坐標,從0開始算 arr[0][0] = t; // 先將方陣的第一行第一列賦值為1,接着進入循環 while (t < n*n){ // 循環結束條件為 當t達到n²時 while (y+1 < n && arr[x][y+1] == 0){ // 第一條子循環表示 從左往右對方陣賦值 結束條件為 當下一次的列數超出方陣范圍時 這里的第二條條件保證不會對已賦值過的單元重復賦值 arr[x][++y] = ++t; } while (x+1 < n && arr[x+1][y] == 0){ // 第二條子循環表示 從上往下對方陣賦值 結束條件為 當下一次的行數超出方陣范圍 或下一個單元為已經賦值過的單元時 arr[++x][y] = ++t; } while (y-1 >= 0 && arr[x][y-1] == 0){ // 第三條子循環表示 從右往左對方陣賦值 結束條件與前面的子循環相同 arr[x][--y] = ++t; } while (x-1 >= 0 && arr[x-1][y] == 0){ // 第四條子循環表示 從下往上對方陣賦值 結束條件與前面的子循環相同 arr[--x][y] = ++t; } } for (int i = 0; i < n; i++){ // 遍歷輸出 for (int j = 0; j < n; j++){ printf("%3d", arr[i][j]); } printf("\n"); // 輸出完一行后進行換行 } return 0; }
運行測試:
輸入5,運行結果:
輸入10,運行結果:
程序運行成功!