。。。
二维数组
类型名 数组名[常量表达式] [常量表达式];
如:
int a[3][3];
它定义了一个有9个元素的二维数组(3*3),两个维数的下标都是0-2
初始化:int a[3][3]={{0,1,2},{3,4,5},{6,7,8}};
或
int a[3][3]={{0,1},{5},{6,7,8}};
它相当于
int a[3][3]={{0,1,0},{5,0,0},{6,7,8}};
int a[2][4]={{0,1},{0}};
两个数组,每个数组里面有四个元素。
多维数组的规律
※数组其实也是一种嵌套结构,二维数组也叫数组的数组,那么三维数组呢?n维呢?
※像Photoshop这样的平面图像处理软件中,经常用到二维数组,处理二维数组通常要用到双重循环。
※像3D Max这样的三维图像处理软件中,经常用到三维数组,处理三维数组通常会用到三重循环。
※类似Windows资源管理器中的“树状菜单”,经常会用到多维数组。
程序1
将一张矩阵笑脸上下翻转成哭脸
也就是说把矩阵a中第0行的数据放到矩阵b中的第3行,第1行放到第2行,第2行放到第1行,第3行放到第0行。经过4次重置,任务完成。
第一个规律:在4次放置中,b的第一位下标刚好是递减的,a的第一位下标刚好是递增的。无论在哪一排,b的第一位下标数字刚好是3减去a的第一位下标数字。
// 22-1笑脸翻转数组.c #include <stdio.h> void fun( int a[4][4] ) { //打印数组 for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { printf("%d ", a[i][j]); } printf(" "); } } main() { //定义整型数组 int a[4][4] = { {1,0,0,1}, {0,1,1,0}, {0,0,0,1}, {0,0,0,1} }; fun(a); //打印数组a //翻转将其改变为 int b[4][4]; //int b[4][4] = //{ // {0,0,0,1}, // {0,0,0,1}, // {0,1,1,0}, // {1,0,0,1} //}; printf("翻转后的b数组 " ); //翻转数组 for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { b[4 - i -1][j] = a[i][j]; //将a的数组值赋值给b } } //打印出翻转的 fun(b); //打印出数组b }
排序
程序2
将任意5个数按由大到小的顺序排序
(1)将第1个数与后面所有数比较,如果有比它大的,就与它交换
(2)将第2个数与后面所有数比较,如果有比它大的,就与它交换
(3)以此类推,将第n(n=1~5)个数组元素与n+1到n+5个数比较,较大的数字会被选择到第n个元素中
(4)全部比较完成后,数组已经按从大到小的顺序排好,用循环输出数组
用5个数来描述以上过程:
1)57428:5和7比较得:
2)75428:7和42比,还是原来顺序,与8比较得:
3)85427:第一轮比较完毕,老大已经出现在第1位。第二轮开始:5跟42比较,还是原来顺序,与7比较得:
4)87425:第二轮比较完毕,老2已经出现在第2位。第三轮开始:4跟2比较,还是原来顺序,与5比较得:
5)87524:第三轮比较完毕,老3已经出现在第3位。第四轮开始:2跟4比较得:
6)87542:第四轮比较完毕,老4已出现在第4位。最后一位不用比,排序结果已经出来。
// 22-2数组排序.c //57428 #include <stdio.h> //排序函数 int fun(int a[],int length) { int max; //中间变量 for (int i = 0; i < length ; i++) { for (int j = 0; j < length-1; j++) { if (a[j] < a[j + 1]) { max = a[j + 1]; //最大值数据交换 a[j + 1] = a[j]; a[j] = max; } } } } main() { int a[5] = { 5,7,4,2,8 }; int length = sizeof(a) / sizeof(a[0]); //检查数组长度 fun(a,length); //调用排序 for (int i = 0; i < length; i++) { printf("%d ", a[i]); //输出数组 } printf(" "); }
数组与函数
数组元素可直接做函数实参传递,下面的代码是一维数组和二维数组元素传递给普通函数:
int a[10]={5,10},b[10][10]={{2,3},{5,6}};
int c;
c= max (a[1],b[0][0] );
有时候要将整个数组传进函数,这时函数的形式参数要改变。
程序3
※函数的形参可以省略元素个数,如:
double sum(double array[])
也合法
// 22-3数组当做形参实参函数定义.c //求五个学生的总分 #include <stdio.h> double sum(double array[]) { double total = 0; for (int i = 0; i < 5; i++) { total += array[i]; } return total; } main() { double a[5]; for (int i = 0; i < 5; i++) scanf_s("%lf", &a[i]); printf("总分为:%g ", sum(a)); }
程序4
将两个矩阵相加
// 22-4矩阵数组相加.c #include <stdio.h> void add(int a[][4], int b[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { a[i][j] += b[i][j]; } } } main() { int a[4][4] = { {1,2,3,4}, {1,2,3,4}, {1,2,3,4}, {1,2,3,4} }; int b[4][4] = { {1,2,3,4}, {1,2,3,4}, {1,2,3,4}, {1,2,3,4} }; add(a,b); printf("输出和是: "); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { printf("%d ", a[i][j]); } printf(" "); } }
※数组元素做函数参数时,如果子函数改变了数组元素的值,父函数里的数组元素不会变。但是用数组名做函数参数时,父函数里的的数组也会随之改变。
※函数定义时,二维和多维数组的第一维元素可以省略。
已有一个按从小到大排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。比如数组a元素为2,5,7,12,20,0(多出个0是为了方便插入数据用),用户输入10后,数组变成了2,5,7,10,12,20。
// 数组添加元素并排序.c #include <stdio.h> //已有一个按从小到大排好序的数组, //今输入一个数,要求按原来排序的规律将它插入数组中。 //比如数组a元素为2, 5, 7, 12, 20, 0(多出个0是为了方便插入数据用), //用户输入10后,数组变成了2, 5, 7, 10, 12, 20。 void sort(int a[],int length) //排序函数 { int min; for (int i = 0; i < length; i++) { for (int j = 0; j < length-1; j++) { if (a[j] > a[j+1]) { min = a[j+1]; a[j+1] = a[j]; a[j] = min; } } } } main() { int a[] = { 2, 5, 7, 12, 20, 0 }; int length = sizeof(a) / sizeof(a[0]); //数组长度 scanf_s("%d", &a[length - 1]); sort(a,length); //数组 长度 for (int i = 0; i < 6; i++) { printf("%d ",a[i]); } }