250 likes | 327 Views
学习情境二第二讲二 维数组. 能用 C 语言设计和实现数据结构 PDA 描述算法的能力 能用 C 语言描述建立算法 能用 C 语言描述输出算法. 通过本次课的学习, 使学生掌握 线性表的建立、输出。. 例 4-1. 在介绍数组概念之前,我们先看一个例子。 【 例 4-1】 求 5 名学生某门功课的平均成绩。 分析 :. 根据前面所学的知识,我们只能将 5 个成绩分别用 5 个变量来存储,然后将这 5 个成绩相加,得到和之后再求平均值。 . 10/31/2014 10:19 AM. 例 4-1 流程图. 10/31/2014 10:19 AM.
E N D
学习情境二第二讲二维数组 能用C语言设计和实现数据结构 PDA描述算法的能力 能用C语言描述建立算法 能用C语言描述输出算法 通过本次课的学习, 使学生掌握 线性表的建立、输出。
例4-1 在介绍数组概念之前,我们先看一个例子。 【例4-1】求 5名学生某门功课的平均成绩。 分析: 根据前面所学的知识,我们只能将5个成绩分别用5个变量来存储,然后将这5个成绩相加,得到和之后再求平均值。 10/31/2014 10:19 AM
例4-1流程图 10/31/2014 10:19 AM
例4-1源程序 /*******************************************************/ /* 程 序 名:samp4_1.c */ /* 作 者:wqy */ /* 编制时间:2004年7月8日 */ /* 程序功能:求5名学生某门功课的平均成绩 */ /********************************************************/ void main() { float s1, s2, s3, s4, s5, avg; printf ( "Enter the 5 scores :"); scanf("%f, %f, %f, %f, %f", &s1, &s2, &s3, &s4, &s5 ); avg=s1 + s2 + s3 + s4 + s5; avg =avg/5; printf ("average score is %6.2f\n", avg ); } 10/31/2014 10:19 AM
缺点和解决办法 缺点: 随学生个数增加,编程将日益繁琐; 如学生数目在编程时未定,则无法编程。 解决办法: 引入数组。 10/31/2014 10:19 AM
数组 初识数组: 1、数组是有序数据的集合。 2、数组中的每一个元素都属于同一个数据类型。 3、数组的标识:数组名,本质:标识符。 4、集合中不同元素的标识:下标 5、分类:一维数组、二维数组、多维数组。 10/31/2014 10:19 AM
引入数组后,【例4-1】可改写为 void main ( ) { float s[6] , avg=0; int i; for (i=1;i<=5;i++) { scanf ("%f", &s[i] ); avg += s[i] ; } avg = avg/5; printf (" average score is %6.2f\n", avg ); } 在上述程序中,s数组的第一个元素即s[0]闲置不用,这是 为了与读者一般的习惯一致。 10/31/2014 10:19 AM
一维数组的定义 1、定义的形式: <类型标识符> <数组名> [<整型常量表达式>] 2、定义的本质:声明数组元素的类型和个数之后编译器才能为该数组分配合适的内存。 3、定义的示例: #define M 20 int a[10]; float b[5]; char ch[M+6]; 定义a是有10个整型元素的数组 定义b是有5个浮点型元素的数组 定义ch是有M+6即26个元素的字符型数组 10/31/2014 10:19 AM
补充说明 【说明】: (1)数组中的第一个元素的下标从0开始。 (2)数组名 ( 如 a ) 表示该数组中第一个元素 ( 如 a[0] ) 的地址,即a和&a[0]同值。数组名是地址常量。经过定义的数组,编译后,会分配到一段连续的内存单元。其首地址即数组名(如 a); (3)数组定义后,编译时无越界保护; (4)数组定义中的常量表达式中可以包含常量和符号常量,但不能包含变量。 (5)同类型数组可一起定义,用逗号隔开。 10/31/2014 10:19 AM
一维数组元素的引用 1、引用形式: <数组名>[<整型表达式>] 2、下标的取值: 0≤<整型表达式>≤元素个数-1 10/31/2014 10:19 AM
例4-2 【例4-2】将从1开始的10个奇数逆序输出。 分析: 因为要输出10个奇数,所以我们定义一个有10个元素的整型数组。然后将从1开始的10个奇数依次放到数组中去,最后以逆序的形式输出。 10/31/2014 10:19 AM
例4-2流程图 10/31/2014 10:19 AM
例4-2源程序 /********************************************************/ /* 程 序 名:samp4_2.c */ /* 作 者:wqy */ /* 编制时间:2004年7月8日 */ /* 程序功能:将从1开始的10个奇数逆序输出 */ /********************************************************/ #include <stdio.h> void main() { int i,a[10]; for(i=0;i<=9;i++) a[i]= 1+2*i; for(i=9;i>=0;i--) printf(“%d ”,a[i]); } 10/31/2014 10:19 AM
一维数组的初始化 可以在定义一个数组变量的同时就给它赋值。 初始化方法: 1、对全部数组元素初始化。 int a[5]={1,2,3,4,5}; 2、只给数组的前半部分元素赋初值,可连续写出初值。 int a[5]={1,2}; 3、只给数组的后半部分元素或某些不连续的元素赋初值,则花括号中分隔数值的逗号不能缺少,把要赋的值写入适当的地方,而不予赋值的地方应写0。 int a[5]={0,3,0,7,9} 10/31/2014 10:19 AM
一维数组程序举例 对数组赋值除了前面介绍的两种方法外,还可以在程序执行过程中,对数组作动态赋值,即:用循环语句配合scanf函数逐个对数组元素赋值。 【例4-3】 一维数组的简单应用:输入10个整数,求其中最大的数。 分析: 10个整数可以用数组来存储,编程时用循环语句给数组元素赋值,通过穷举比较的方法求最大值。 10/31/2014 10:19 AM
例4-3流程图 10/31/2014 10:19 AM
例4-3源程序 /*********************************************************/ /* 程 序 名:samp4_3.c */ /* 作 者:wqy */ /* 编制时间:2004年7月8日 */ /* 程序功能:输入10个整数,求其中最大的数 */ /*********************************************************/ void main( ) { int i,max,a[10]; printf("input 10 numbers:\n"); for(i=0;i<10;i++) scanf("%d",&a[i]); max=a[0]; for(i=1;i<10;i++) if (a[i]>max) max=a[i]; printf("maxmum=%d\n",max); } 10/31/2014 10:19 AM
二维数组变量的定义 二维数组定义的一般形式是: <类型标识符> <数组名> [<常量表达式1>][<常量表达式2>] 其中, 常量表达式1表示第一维下标的长度 常量表达式2表示第二维下标的长度 在一维存储器中存放二维数组,可有两种方式: (1)按行排列,即放完一行之后顺次放入第二行。 (2)按列排列,即放完一列之后再顺次放入第二列。 在C语言中,二维数组是按行排列的。 10/31/2014 10:19 AM
二维数组元素的引用 二维数组的元素表示的形式为: 数组名[下标][下标] 其中:下标应为整型常量或整型表达式。 例如: a[3][4]表示a数组三行四列的元素。 数组元素的引用和数组定义在形式中有些相似,但这两者具有完全不同的含义。 数组说明的方括号中给出的是某一维的长度,即可取下标的最大值;而数组元素引用中的下标是该元素在数组中的位置标识。前者只能是常量,后者可以是常量,变量或表达式。 10/31/2014 10:19 AM
例4-4 【例4-4】一个学习小组有5个人,每个人有三门课的考试成绩。如表4-1所示。求全组分科的平均成绩和各科总平均成绩。 10/31/2014 10:19 AM
例4-4分析 分析: (1)可用一个二维数组a[5][3]存放五个人三门课的成绩。 再设一个一维数组v[3]存放所求得各分科平均成绩,设变量average 为全组各科总平均成绩。 (2)程序中需要用到双重循环。在内循环中依次读入某一门课程的各个学生的成绩,并把这些成绩累加起来,退出内循环后再把该累加成绩除以5送入v[i]之中,这就是该门课程的平均成绩。外循环共循环三次,分别求出三门课各自的平均成绩并存放在v数组之中。退出外循环之后,把v[0],v[1],v[2]相加除以3即得到各科总平均成绩。 (3)最后按题意输出各个成绩。 10/31/2014 10:19 AM
例4-4流程图 源程序 调用集成 编译环境 10/31/2014 10:19 AM
二维数组的初始化 二维数组初始化也是在类型说明时给各数组元素赋以初值。二维数组可按行分段赋值,也可按行连续赋值。 例如,对数组a[5][3]: 按行分段赋值可写为: inta[5][3]={ {80,75,92},{61,65,71},{59,63,70},{85 ,87,90},{76,77,85} }; 按行连续赋值可写为: inta[5][3]={ 80,75,92,61,65,71,59,63,70,85,87,90 ,76,77,85}; 这两种赋初值的结果是完全相同的。 10/31/2014 10:19 AM
二维数组初始化赋值说明 (1)可以只对部分元素赋初值,未赋初值的元素自动取0值。 (2)如对全部元素赋初值,则第一维的长度可以省略。 (3)二维数组可以看作是由一维数组的嵌套而构成的。 设一维数组的每个元素都又是一个数组,就组成了二维数组。 如二维数组a[3][4],可分解为三个一维数组,其数组名分别为:a[0]、a[1]、a[2]。 必须强调的是,a[0]、a[1]、a[2]不能当作数组元素使用,它们是数组名,不是单纯的数组元素。 10/31/2014 10:19 AM
下课 谢谢! 结束. 10/31/2014 10:19 AM