[IT认证]厦门理工学院11级C语言 第4章数组.ppt
《[IT认证]厦门理工学院11级C语言 第4章数组.ppt》由会员分享,可在线阅读,更多相关《[IT认证]厦门理工学院11级C语言 第4章数组.ppt(53页珍藏版)》请在三一办公上搜索。
1、第四章 数 组,2,本章主要内容,4.1 一维数组的定义、初始化和引用,4.2 二维数组的定义、初始化和引用,4.3 字符数组与字符串,3,数组是C语言中提供的一种专门用来组织批量数据的数据类型,它可以将性质相同且需要共同参与某项操作的多个数据有效地组织起来,是一种应用十分频繁且非常重要的数据类型。对批量数据进行处理的情况在实际问题中经常会遇到,如对一组数据进行排序、求平均值;在一组数据中查找某一数值;矩阵运算;表格数据处理等等。假设要输入全年级100个学生的成绩,然后排出名次。显然定义100个变量来存放这100个学生的成绩是不现实也是不可取的,然而利用数组类型来解决这一问题却非常方便。所谓数
2、组就是一批同类型数据的有序集合,每个数组在内存中占一片连续的存储空间,用一个统一的数组名和下标来唯一确定数组中的元素,其中每一个元素通常称为下标变量。只有一个下标的数组称为一维数组,有二个下标的数组称为二维数组,依此类推。,4,4.1 一维数组的定义、初始化和引用,4.1.1 一维数组的定义方式 与前面章节介绍的基本数据类型变量的处理方式相同,数组作为带有下标的变量,也需要经历定义、初始化和引用3个阶段。一维数组定义的一般形式为:类型说明符 数组名常量表达式 其中:类型说明符用于说明数组的基类型,即数组中每一个元素的类型,可以是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符,应
3、符合标识符的书写规定。在同一个函数中数组名不能与其它变量名相同。方括号中的常量表达式表示数组元素的个数,也称为数组的长度。例如:int a10;/*说明整型数组a,有10个元素*/float score20;/*说明实型数组score,有20个元素*/char letter26;/*说明字符数组letter,有26个元素*/,5,4.1 一维数组的定义、初始化和引用,对于数组类型说明应注意以下几点:1、允许在同一个类型说明中,说明多个数组和多个变量。如:int a,b,c,d,k110,k220;2、方括号中的常量表达式通常取整型常量或整型常量表达式(包括符号常量)。如:#define N 2
4、0/*用此命令行定义符号常量N,方便程序修改*/float scoreN;/*正确的定义方式,提倡使用*/C语言中不允许用变量下标形式对数组进行动态定义。如n为一个普通变量,定义:float scoren;/*不正确的定义方式*/是非法的。即使在数组定义语句前用变量初始化、用赋值语句或用输入函数scanf()对n进行了赋值,上面这条语句仍然是非法的。,6,4.1 一维数组的定义、初始化和引用,3、与其他高级语言(如PASCAL、BASIC)不同,C语言中规定数组元素的下标总是从0开始,例如int a10;说明整型数组a,有10个元素。这10个元素是:a0,a1,a2,a3,a4,a5,a6,a
5、7,a8,a9;注意最后一个元素是a9,而不是a10,该数组不存在数组元素a10。并且特别值得注意的是,C编译器对数组下标越界不作检查。如上述数组不存在数组元素a10,但是在程序中不小心引用了a10,程序编译时仍认为是合法的。但程序运行后可能会出现逻辑错误,因为a10 已不是数组中的元素,越界的操作可能破坏a9后面的数据或程序,要特别引起注意。,7,4.1 一维数组的定义、初始化和引用,4、在说明一个数组后,系统会在内存中分配一段连续的空间用于存放数组元素,并且数组名代表首地址。如说明int a10;则其在内存中的存放形式如图4-1所示:a0 a1 a2 a3 a4 a5 a6 a7 a8 a
6、9 图4-1 数组a在内存中的存放形式在内存中一维数组所占用的总字节数为:数组长度*sizeof(基类型),如在Turbo C环境中,整型数组a所占用的总字节数为:10*2=20。从上面可以发现每一个元素都相当于一个整型变量,其中可存放一个整型数值。,8,4.1 一维数组的定义、初始化和引用,4.1.2 一维数组的初始化 数组与简单变量一样,也可以对各元素初始化。数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的,这样将减少运行时间,提高效率。初始化赋值的一般形式为:类型说明符 数组名常量表达式=初值表 其中初值表中的各数据值即为各元素的初值,各值之间用逗号分隔。例
7、如:int a10=0,1,2,3,4,5,6,7,8,9;相当于a0=0;a1=1;.a9=9;语言对数组的初始化赋值还有以下几点规定:1、可以只对部分元素赋初值。当 中值的个数少于元素个数时,只给前面部分元素赋值。例如:int a10=0,1,2,3,4;表示只给a0a45个元素赋值,而后5个元素自动赋0值。如果想使一个数组中全部元素值为0,可以写成:static int a10=0;/*第1个元素赋值0,后面9个元素自动为0*/,9,4.1 一维数组的定义、初始化和引用,2、只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:int a10=1,1,1,1,1,1
8、,1,1,1,1;而不能写为:int a10=1;3、如给全部元素赋值,则在数组说明中,可不指定数组长度。例如:int a5=1,2,3,4,5;可写为:int a=1,2,3,4,5;4、当数组被说明为静态(static)或外部存储类型(即在所有函数外部定义)时,若不赋初值,则在程序编译阶段对数值型数组全部元素赋初值0,对字符型数组全部元素赋空字符(ASCII码为0的字符0)。,10,4.1 一维数组的定义、初始化和引用,4.1.3 一维数组元素的引用 数组是由若干个元素组成,数组名只能表示整个数组(首地址),而并不能说明其中某一个元素。如果希望指出具体的元素,需要按照下列格式书写:数组名下
9、标表达式 其中数组名是一个已经定义的数组,下标表达式的结果应该是一个介于数组下标取值范围内的整型数值,通常是一个整型表达式(其中可以包含整型常量或已赋值的整型变量)。数组元素也是一种变量,对数组元素的访问是通过下标来进行的,因此,可用循环语句操作数据,这在处理数据时带来很大方便。定义数组后,它所占有的存储单元的值是不确定的。在引用数组元素之前,必须保证数组元素已经被赋以确定的值。给数组元素赋值的方法有很多种,除了前面介绍过的数组初始化外,还可以象普通变量一样用赋值语句或用键盘输入的方式。,11,4.1 一维数组的定义、初始化和引用,例4-1 用数组来处理求Fibonacci数列问题(具体描述见
10、上一章的例3-20)。源程序如下:#include#define N 40main()int i;long int fN=1,1;/*数组初始化,f0及f1分别为1,其它为0*/for(i=2;iN;i+)fi=fi-2+fi-1;/*计算从第3个月起每月的总兔子对数*/for(i=0;iN;i+)if(i%5=0)printf(n);/*控制一行输出5个数*/printf(%12ld,fi);,说明:(1)在上一章的例3-20中主要是采用迭代递推的方法来求解,从而避免了使用大量变量所带来的不便。引入数组类型后,可以直接定义一维数组long int f40来存放所要求的40个数,并配合循环语句
11、通过一个控制下标变化的变量来访问一维数组的所有元素,显得直观、简单。由此可知,用一维数组来有序地存储和表示一组相同类型的数据是十分方便的。(2)本例中对数组元素的赋值主要通过初始化和赋值语句配合循环语句来进行。,12,4.1 一维数组的定义、初始化和引用,4.1.4 一维数组程序举例 例4-2 某电视台举办青年歌手大奖赛。假设有11个评委参与评分工作。计算每位歌手最终得分的方法是:首先去掉一个最高分和一个最低分,然后计算剩余9个分数的平均值,所得结果就是选手的最终得分。希望编写一个程序,帮助工作人员计算每个歌手的分数。分析:在进行程序设计之前需要考虑两个问题:(1)数据结构:程序所要处理的数据
12、如何存储和表示,本题中参加统计的数据是11位评委的评分,因此应该将这11个数据组织在一起形成批量数据。显然选用一维数组来存储比较合适。(2)算法:根据计算每位歌手最终得分的方法,关键是如何求出每位歌手所得的最高分和最低分?求最高分可以采用打擂台的方法:先假设第一个得分为最高分(即擂主),然后把其他的每个得分依次与最高分(即擂主)进行比较,若发现后面的得分高于前面的最高分,则将把最高分修改为后面的得分(产生新擂主)。当所有的得分都比较完毕,最高分也就求出来了(最终擂主产生)。求最低分的方法类似于求最高分,并且两者可以合并在同一个if语句中完成。,源程序如下:#include#define NUM
13、 11/*评委人数*/main()float scoreNUM,sum;/*一维数组score用于保存11位评委的评分*/int i,maxvalue,minvalue;printf(nEnter 11 score:);for(i=0;imaxvalue)maxvalue=scorei;else if(scoreiminvalue)minvalue=scorei;sum=sum+scorei;sum=(sum-maxvalue-minvalue)/(NUM-2);/*计算歌手的最终得分*/printf(nFinal score is%6.2f,sum);运行结果如下:Enter 11 scor
14、e:91 92 89 87 93 88 87 90 91 93 91Final score is 90.22,13,4.1 一维数组的定义、初始化和引用,例4-3 某电视台举办青年歌手大奖赛。假设有12位歌手参加决赛,经过评委评分工作,得到每位歌手最终得分。希望编写一个程序,帮助工作人员对12位歌手的最终得分按从大到小排列。分析:本例需要用到排序算法。排序和查找作为计算机应用中的两种最基本的操作,几乎在所有的数据库程序、编译程序、解释程序和操作系统中都可以见到它们的应用。所谓排序就是将一组无序的数列重新排列成升序或降序的过程。现有的排序算法有很多种类,如交换法、选择法、冒泡法、插入法等。本例采
15、用交换法来进行排序(从大到小),虽然此法执行效率较低,但其算法简单易懂,并且对理解选择法很有帮助。,14,4.1 一维数组的定义、初始化和引用,交换法排序借鉴了求最大值(降序时)、最小值(升序时)的思想。对n个数降序(或升序)排序可以分解为n-1趟(轮)比较来进行:第一趟:把第一个数依次和后面的数比较,如果后面的某数大于(小于)第一个数,则两个数交换,比较结束后,第一个数则是最大(最小)的数。第二趟:把第二个数依次和后面的数比较,如果后面的某数大于(小于)第二个数,则两个数交换,比较结束后,第二个数则是次大(次小)的数;依上类推 第n-1趟:从剩下的两个数中找出较大(小)的数,并将它交换到第n
16、-1个位置。至此,整个排序结束。为简单起见,假如现有6个整数:88,89,95,91,94,86,则利用交换法从大到小排序的过程如图4-2所示(阴影部门为有序部分,请读者自己认真理解):,15,4.1 一维数组的定义、初始化和引用,#include#define N 12main()float aN,temp;int i,j;printf(Please input numbers:);for(i=0;iN;i+)scanf(%f,运行结果如下:Please input numbers:90.5 90.22 91.4 90.1 89.5 88.7 93.2 94.2 92.4 90.2 93.2
17、 95.7 The sorted numbers:95.70 94.20 93.20 93.20 92.40 91.40 90.50 90.22 90.20 90.10 89.50 88.70 思考:排序中的外循环:for(i=0;iN-1;i+)中的i有什么作用?能否改为从1开始?说明:仔细研究上述算法可以发现,在每趟的比较中,若发现后面的数大就要交换位置,这样在整个算法中需要交换的次数太多,导致效率较低。其实完全可以在每趟的比较中先求出此趟中的最大值,再交换到相应位置即可,这样每趟至多做一次交换。虽然比较操作未能减少,但交换操作可以总体上减少,效率提高。这种改进的算法称为选择法排序。,16
18、,4.1 一维数组的定义、初始化和引用,例4-4 用选择排序法改写例4-3 分析:对n个数降序(或升序)排序可以分解为n-1趟(轮)比较来进行:第一趟:通过n-1次的比较,从n个数中找出最大(小)数的下标,通过下标找到相应的元素即最大(小)数,并将它交换到第1个位置。这样最大(小)数的数被安置在第1个位置上。第二趟:再通过n-2次的比较,从剩余的n-1个数中找出次大(小)数的下标,并将次大(小)数交换到第2个位置上。重复上述过程,共经过n-1趟排序后,排序结束。为简单起见,假如现有6个整数:88,89,95,91,94,86,则利用选择法从大到小排序的过程如图4-4所示(请读者自己认真理解):
19、,17,4.1 一维数组的定义、初始化和引用,#include#define N 12main()float aN,temp;int i,j,k;/*k用来记录得分最高元素的下标*/printf(Please input numbers:);for(i=0;iN;i+)scanf(%f,说明:在本程序每趟选择最高得分时,记录的是最高得分的下标,而不是最高得分本身,这样便于将最高得分交换到前面的位置。这是一个经常使用的编程技巧。从上面的几个例子可以看到,用数组来表示一组性质相同且需共同参与某项操作的批量数据是很方便的。通常,用下标表示批量数据中的不同个体,用数组元素记录批量数据中的每个数值。,1
20、8,本章主要内容,4.1 一维数组的定义、初始化和引用,4.2 二维数组的定义、初始化和引用,4.3 字符数组与字符串,19,4.2 二维数组的定义、初始化和引用,4.2.1 二维数组的定义假设一个学习小组有5个人,每个人有3门课的考试成绩。求全组各科的平均成绩和每人的总成绩,如图4-5所示。对于上述问题,若用一维数组来进行表示和处理,以课程(行)为单位至少要定义三个一维数组,以人(列)为单位至少要定义五个一维数组。并且在处理全组各科的平均成绩和每人的总成绩时,必须涉及到多个一维数组中的数据。显然这种表示方法不能很好地反映上述二维表中数据间的整体关系,处理起来也比较困难。这时引入两维数组可以方
21、便地表示和处理这个问题。,20,4.2 二维数组的定义、初始化和引用,二维数组定义的一般形式为:类型说明符 数组名常量表达式1常量表达式2其中:常量表达式1及常量表达式2分别表示数组的行数和列数,经常也称为行数常量表达式和列数常量表达式。例如:float s35;定义了一个3行5列实型数组s,有15个元素。逻辑上可以用一个矩阵(二维表格)来表示,如图4-6所示。把图4-5与图4-6比较,可以发现图4-6刚好可用来存储学习小组中有5个人,每个人有三门课的15个考试成绩。,说明:(1)与一维数组相同,二维数组的行标与列标也总是从0开始。(2)观察图4-6,可以发现同一行上的元素的行标是一样的,列标
22、从0开始增长。如第1行上的元素的行标都是0,若用b来代替s0,第1行上的元素可以改写为b0,b1,b2,b3,b4。显然这是一个一维数组,数组名为b,因此第1行可以看成一维数组,数组名为s0。所以二维数组s可以看成是由s0、s1、s2三个元素组成的一维数组,而每个元素s0、s1、s2本身又是一个包含5个元素的一维数组。因此我们可以把二维数组看作是一种特殊的一维数组,它的元素又是一个一维数组。,21,4.2 二维数组的定义、初始化和引用,必须强调的是:s0,s1,s2不能当作下标变量使用,它们是数组名,不是一个单纯的下标变量。图4-7数组a在内存中的存放形式(3)尽管二维数组在概念上是二维的,而
23、不象一维数组只是一个向量。但是,实际的硬件存储器却是连续编址的,也就是说存储器单元是按一维线性排列的。因此在语言中,二维数组与一维数组一样,在被说明为一个数组后,系统会在内存中分配一段连续的空间用于存放数组元素,并且数组名代表首地址。只是数组元素存放时是按行优先排列的,即先存放第一行,再存放第二行,依此类推。假设定义一个二行三列的整型数组int a23(int类型在TC软件中占二个字节的内存空间,所以每个元素均占有二个字节)。则其在内存中的存放形式如图4-7所示,它在内存中所占用的总字节数为:行数*列数*sizeof(基类型),即为:232=12(字节)。,22,4.2 二维数组的定义、初始化
24、和引用,4.2.2 二维数组的初始化 二维数组初始化也是在类型说明时给各下标变量赋以初值。二维数组可按行分段赋值,也可按行连续赋值。例如对数组float s35:(1)按行分段赋值可写为:float s35=80,75,92,61,65,71,59,63,70,85,87,90,76,77,85;(2)按行连续赋值可写为:float s35=80,75,92,61,65,71,59,63,70,85,87,90,76,77,85;这两种赋初值的结果是完全相同的。,23,4.2 二维数组的定义、初始化和引用,对于二维数组初始化赋值还可以用下列方式:(1)可以只对部分元素赋初值,未赋初值的元素自动
25、取0值。例如:int a33=1,2,3;是对每一行的第一列元素赋值,未赋值的元素取0值。赋值后各元素的值为:1 0 0 2 0 0 3 0 0 而对于int a33=0,1,0,0,2,3;赋值后的元素值为:0 1 0 0 0 2 3 0 0(2)如对全部元素赋初值,则第一维的长度可以不给出。例如:int a33=1,2,3,4,5,6,7,8,9;可以写为:int a3=1,2,3,4,5,6,7,8,9;注意:不能出现省略第二维长度的情况。,24,4.2 二维数组的定义、初始化和引用,4.2.3 二维数组元素的引用 二维数组的元素也称为双下标变量,其表示的形式为:数组名行下标列下标 其中
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IT认证 IT认证厦门理工学院11级C语言 第4章数组 IT 认证 厦门 理工学院 11 语言 数组

链接地址:https://www.31ppt.com/p-4593935.html