二维数组 顾名思义就是有两个方向维度的数组,与其说是数组,更不如说是“矩阵”形象些,因为它就像矩阵一样几行几列地展开。
二位数组定义方式与一维数组相似,只不过下标由两个方括号表示,代表了它有横行纵列,正如: 类型名 数组名[行数量][列数量]
关于二维数组的使用
初始化:定义了一个二维数组首先就是对它进行初始化,这里举例一个可以对二维数组进行初始化的函数: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,运行结果:
程序运行成功!