C语言学习笔记:18_数组-二维数组

/*
 * 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;
}

你可能感兴趣的:(C语言)