学习目标:
掌握二维数组的概念(难点)
掌握二维数组的定义和引用
掌握二维数组的应用
重点:
二维数组的遍历方法
难点:
二维数组的概念的理解
一、二维数组
1.定义
格式: 类型说明符 数组名[常量表达式][常量表达式]
1)类型说明符:表示数组的类型int , short , long ,unsigned , float , double , char等
2)数组名:表示各数组元素的统一名字
3)常量表达式:表示数组的长度
即:int a[3][4] //定义一个3行4列的二维数组
说明:
a)每一维的下标从0开始,整个数组元素为:3×4=12个
b)C语言中,二维数组中元素排列的顺序是按行存放。
即:先存放第一行的元素,再存放第二行的元素,12个元素的存放的顺序及坐标如下所示:
| a[0][0] | a[0][1] | a[0][2] | a[0][3] |
| a[1][0] | a[1][1] | a[1][2] | a[1][3] |
| a[2][0] | a[2][2] | a[2][2] | a[2][3] |
如有赋值为3,4,5,6,7,8,9,10,11,12,13,14则存储单元对应图如下图所示:
| a[0][0] | 3 | 第0行元素 |
| a[0][1] | 4 | |
| a[0][2] | 5 | |
| a[0][3] | 6 | |
| a[1][0] | 7 | 第1行元素 |
| a[1][1] | 8 | |
| a[1][2] | 9 | |
| a[1][3] | 10 | |
| a[2][0] | 11 | 第2行元素 |
| a[2][1] | 12 | |
| a[2][2] | 13 | |
| a[2][3] | 14 |
2.二维数组初始化
1)分行给二维数组赋初值,没有赋值的元素值为0。
如:int a[2][3]={{1,2,3},{5,6,7}};
2)所有数据写在一个化括弧内
如:int a[2][3]={1,2,3,5,6,7};
3)可以对部分元素赋初值
如:int a[3][4]={{1},{3}};
等价于: int a[3][4]={{1,0,0,0},{3,0,0,0},{0,0,0,0};
如:int a[3][4]={{1,5},{0},{0,0,9}};
等价于: int a[3][4]={{1,5,0,0},{0,0,0,0},{0,0,9,0}};
4)定义数组时,第一维的长度可以不指定,但第二维的长度要指定。
如int a[][3]={1,2,3,4,5,6,7,8,9};
等价于: int a[3][3]={1,2,3,4,5,6,7,8,9};
如int a[][4]={{1},{3,1},{0,0,9}};
等价于: int a[3][4]={{1,0,0,0},{3,1,0,0},{0,0,9,0}};
3.二维数组元素的引用
1)只能逐个引用数组元素,而不能一次引用整个数组,引用方式同一维数组。
2)同样要注意引用越界错误。
即:int a[3][4]={{1,0,0,0},{3,1,0,0},{0,0,9,0}};
printf(“%d”,a[2][2]);//输出结果为9
printf(“%d”,a[0][4]);//如此引用错误,越界
printf(“%d”,a[3][0]);//如此引用错误,越界
printf(“%d”,a[3][4]);//如此引用错误,越界
二、二维数组应用举例
1.例7.3:二维数组的遍历输入输出。定义一个二维数组a[3][4],输入100以内随机整数,然后输出。
2.例7.4:定义一个二维数组a[4][4],输入二位随机整数,求对角线上元素之和。
讨论题:
1)在例7.3中代码中第11行代码中的\t换成\n,结果会怎么样?没有第13行代码,结果会怎么样?
2)在例7.3中输出结果如果按下列要求分10个一行输出,代码如何改写?
上机实践题:
1)8名学生,三门功课,所有的分数(60~100随机整数)存入一个二维数组中,求每位同学的总分。
求每门功课的最高分。
2)定义一个二维数组a[5][5],输入二位随机整数,求四周元素之和。

