/*
* 18_数组-二维数组.c
*
* Created on: 2015年7月6日
* Author: zhong
*/
#include
#include
/**
* 二维数组:
* 为什么要用二维数组呢;
* 例如: 网络班有2个班,每班有5人。
* 要想存储一班的学生的年龄 定义一个一维数组搞定 int ages[5]={18,19,20,18,19};
* 然后将两个班中的所有年龄分开存入一个数组中 int classes[2]={ages,ages};
* 当然,在c语言中,一维数组的元素不能存放一个数组。
*
* int classes[2][50]={{18,19,20,18,19},{18,19,20,18,19}};
* 这样就定义一个二维数组,存放二个班的信息。
*
* 二维数组的定义 :
* float a[3][4]; //3行,4列 3X4的数组
* c语言对二维数组采用这样的定义方式,使得二维数组可被看作是一种特殊的一维数组,
* 这的元素又是一个一维数组。
*
* 二维数组的初始化:
* int a[3][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4}};//分别给二维数组所有元素赋值
* int a[3][4] ={{1},{1},{1}}; //也可以只给元素的一部分元素赋值,其它不赋值的元素被 初始化为0
* 1 0 0 0
* 1 0 0 0
* 1 0 0 0
* int a[3][4]={{1},{1,2},{1,2,3}}; //随便你怎样子弄都行
* 1 0 0 0
* 1 2 0 0
* 1 2 3 0
*
* int a[][4]={{1,2,3,4},{1,2,3,4},{1,2,3,4}};//如果赋值时全部赋值,可以省略第一维的长度,但不能省略第2维的长度。
* int a[][4]={{1,2,3,4},{ },{}};//这样也可以省略
*
* 二维数组中的元素排列的顺序是按行存放的,即在内存中先顺序存放第1行的元素,接着再存放第2行的元素
* 用矩阵形式表示二维数组,是逻辑上的概念,能形象地表示出行列的关系。
* 但在内存中,各元素是连续存放的,不是二维的,是线性的。就像二叉树一样。
*
* 访问二维数组的元素:
* 数组名[下标][下标];
* 如 int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
* a[0][0]; //取得第一个数组中的第一个元素 1
* a[0][3] //取得第一个数组中的第4个元素 4
* a[1][0] //取得第二个数组中的第1个元素 5
* //和一维数组一样,引用数组元素时,下标不要超过数组长度-1。数组角标越界是不报错的,但返回的结果是随机的,无意义的
*
*/
/**
* 将一个二维数组行和列的元素互换,存到另一个二维数组中
* 如 a={{1,2,3},{4,5,6}}; --> b={{1,4},{2,5},{3,6}};
*/
void swap_row_column() {
int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
int b[3][2], i, j;
printf("原数组\n");
for (i = 0; i < 2; i++) { //i < 2; 这个2为数组a[2][3]中一维数组的长度
for (j = 0; j < 3; j++) {
printf("%5d", a[i][j]); //先打印原数组a
b[j][i] = a[i][j]; //将a数组的元素赋值给b数组相应的元素 如 a[0][2] -->b[2][0] 行和列刚好互换
}
printf("\n");
}
printf("互换后的数组\n");
for (i = 0; i < 3; i++) {
for (j = 0; j < 2; j++) {
printf("%5d", b[i][j]); //打印新数组b
}
printf("\n");
}
/*
* output:
原数组
1 2 3
4 5 6
互换后的数组
1 4
2 5
3 6
*/
}
//取得二维数组中的最大值,其它思路和一维数组是一样的,都是遍历第一个元素,将最大的保存下来
void array_max_() {
int a[3][4] = { { 64, 76, 32, 12 }, { 45, 32, 1, 4 }, { 78, 3, 323, 5 } }; //随机数组
int i, j; //c语言很不爽的就是,for循环里面的变量要在片面定义。妈b,麻烦
int row = 0, colum = 0; //记录最大值所在的行和列
int max = a[0][0]; //一定要给max初始化一个值,否则结果不是你想要的
for (i = 0; i < 3; i++) { //外层循环是控制a[3][4]中的[3],即是二级数组中的第几个数组
for (j = 0; j < 4; j++) { //内层循环控制的是第n个数组中的第n个元素
if (a[i][j] > max) {
max = a[i][j]; //记录下最大值,
row=i;
colum=j;
}
}
}
printf("二维数组中的最大值为:%d,坐标为(%d,%d)\n",max,row,colum);
//output:二维数组中的最大值为:323,坐标为(2,2)
}
int main18() {
// swap_row_column();
array_max_();
return 0;
}