1、,IT Education & Training,Neusoft Institute of Information,Date: 2019年7月14日星期日,第四章 模块化程序设计 -二维数组,办公室:C7 EMAIL: 课件下载网址:ftp:/,任课教师:黄伟,授课要点,二维数组的定义和引用 二维数组的初始化和赋值 二维数组的简单应用,问题1:有如下表, 在C程序中如何表示和存储,假定某班有3名学生期末考试共5门课程,要求输入每名学生各门成绩,计算出每名学生的总分并输出。,问题2,以上两个例子有什么共同之处?,分析:,1、每行都是4个整数,类型一致 2、每名学生都有5门课程,成绩类型一致,问题
2、解决二维数组,如何定义二维数组? 如何为数组元素赋值? 如何引用数组元素?,二维数组的定义和引用,二维数组有两个下标的数组 类型说明符 数组名常量表达式1 常量表达式2 例如: int a44 ;数组元素的存放顺序 原因:内存是一维的 二维数组:按行序优先,行数,列数,元素个数=行数*列数,二维数组理解,每个元素ai由包含4个元素 的一维数组组成,二维数组a是由3个元素组成,因此:二维数组中的每一行,相当于一个一维数组。或者说,一维数组是由多个简单变量组成,而二维数组是由多个一维数组组成。,二维数组的初始化,二维数组元素的初始化 分行初始化:,定义一二维数组,存放下表数据:,模仿练习,数组的赋
3、值只能对数组元素单独操作,不能对数组整体操作。 赋值的两种方式:int a54; 赋值运算符 如:a30=8; 输入函数 如:for(i=0;i5;i+)for(j=0;j4;j+)scanf(“%d”,单独为每个元素赋值 对数组的整体赋值只能在初始化时进行,二维数组的赋值,二维数组的遍历,数组的遍历一般用二重循环实现 注意下标的取值范围,不能越界(编译系统对下标的越界不做检查),假定某班有3名学生期末考试共5门课程,要求输入每名学生各门成绩,计算出每名学生的总分并输出。,问题2,#include void main() int a36,i,j;for(i=0;i3;i+)ai5=0; /*为
4、每位学生的总分赋初值0*/for(i=0;i3;i+) /*控制多少学生(多少行)*/ printf(“请输入第%d个学生5门课程成绩:“,i+1);for(j=0;j5;j+) /*控制每个学生的课程(每行的列)*/ scanf(“%d”, /*假设第i个学生的学号为i*/ ,问题2解决定义3行6列的二维数组存放学生每门课程成绩和总分,每行的最后一列存放总分,学生模仿练习,1、定义一个二维数组存放如下图形,并输出。123451357954321 3、某班(假设有2人)期中考试3门成绩:(1)从键盘输入每个学生成绩(2)求每个学生的总分和平均分(3)按每个学生的总分求出最高分,小组讨论并总结,
5、如何保证数组不越界? 有二维数组: int a55;其中a0、 a1、 a2、 a3、a4表示什么?,结论1保证数组不越界,C语言编译系统并不检查数组是否越界。它只给已定义的数组元素分配内存,超过的部分则依次往后排,至于那些位置的用途是什么,系统是不管的。读出那些单元一般不会出问题,但如果往那里面写入数据会导致不可预料的错误。 时刻注意数组的起始元素下标值和最后元素的下标值,结论2二维数组中a0、 a1、 a2、 a3、a4 表示什么?,a0为二维数组a的第1行起始地址 a1为二维数组a的第2行起始地址 a2为二维数组a的第3行起始地址 a3为二维数组a的第4行起始地址 a4为二维数组a的第5行起始地址 因此:二维数组中的每一行,相当于一个一维数组。或者说,一维数组是由多个简单变量组成,而二维数组是由多个一维数组组成。,学以致用,寻找你身边的一个实际问题,用到二维数组。例如:编写程序实现功能: 求一个34矩阵的所有靠外侧的元素值之和。 设矩阵为: 3 8 9 10a= 2 5 -3 57 0 -1 4,作业每人必做,将“学生成绩管理系统”中的“学生”变量定义成数组,学生信息的输入、输出代码做出相应的修改。,Neusoft Institute of Information,办公室:C7 EMAIL: 课件下载网址:ftp:/,