《c语言程序设计教学资料》第8章-数组.ppt

上传人:wuy****n92 文档编号:80483218 上传时间:2023-03-23 格式:PPT 页数:87 大小:8.67MB
返回 下载 相关 举报
《c语言程序设计教学资料》第8章-数组.ppt_第1页
第1页 / 共87页
《c语言程序设计教学资料》第8章-数组.ppt_第2页
第2页 / 共87页
点击查看更多>>
资源描述

《《c语言程序设计教学资料》第8章-数组.ppt》由会员分享,可在线阅读,更多相关《《c语言程序设计教学资料》第8章-数组.ppt(87页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第8章章 数组数组 主要内容主要内容 一维数组的定义、初始化和引用一维数组的定义、初始化和引用 二维数组的定义、初始化和引用二维数组的定义、初始化和引用 向函数传递一维数组向函数传递一维数组 向函数传递二维数组向函数传递二维数组 常用的排序和查找算法常用的排序和查找算法p 前几章前几章使用的变量都属于使用的变量都属于基本类型基本类型,例如,例如:整型、整型、字符型、浮点型数据,这些都是简单的数据类型。字符型、浮点型数据,这些都是简单的数据类型。p 对于有些数据,只用简单的数据类型是不够的,对于有些数据,只用简单的数据类型是不够的,难以难以反映出数据的反映出数据的特点特点,也难以有效地进行处理

2、。,也难以有效地进行处理。问题:问题:问题:问题:有如下几组数据,它们分别该如何存储呢?有如下几组数据,它们分别该如何存储呢?是一组具有是一组具有相同数据类型相同数据类型的数据的的数据的有序集合。有序集合。数组数组 一个班学生的学习成绩一行文字一个矩阵这些数据的特点是:这些数据的特点是:1、具有相同的数据类型、具有相同的数据类型2、使用过程中需要保留原始数据、使用过程中需要保留原始数据 C语言为这些数据,提供了一种语言为这些数据,提供了一种构造数据类型:数组。构造数据类型:数组。p 保存大量同类型的相关数据保存大量同类型的相关数据为什么使用数组为什么使用数组50,50;p数组数组是是多个同类型

3、数据多个同类型数据对象的组合对象的组合。p数组中汇集了多个数据项,称为数组中汇集了多个数据项,称为数组元素数组元素。p数组元素的数组元素的排列是有一定规律的,下标代表数据在排列是有一定规律的,下标代表数据在数组中的序号数组中的序号p用一个用一个数组名数组名和和下标下标唯唯一确定数组中的元素一确定数组中的元素p数组中,可已统一方式处理一批数组中,可已统一方式处理一批/所有元素,是数所有元素,是数组和独立变量的主要区别组和独立变量的主要区别数组的定义数组的定义p 定义数组时需要说明:定义数组时需要说明:n 数组元素类型数组元素类型n 数组名数组名n 数组的元素个数数组的元素个数 元素个数也称数组的

4、大小或长度元素个数也称数组的大小或长度p 数组定义:数组定义:数据类型数据类型 数组名数组名 整数整数1 整数整数2 整数整数n 如:如:int a10;double b107;p 数组定义可以与其它变量定义在一起数组定义可以与其它变量定义在一起 如:如:int a10,n,a125;p 数组大小最好使用宏来定义,以适应可能的变化数组大小最好使用宏来定义,以适应可能的变化 如:如:#define SIZE 10 int aSIZE;p 数组大小定以后,将数组大小定以后,将不能改变不能改变数组存储数组存储p 系统会在内存分配连续的空间给此数组。系统会在内存分配连续的空间给此数组。如:如:int

5、a10;定义一个有定义一个有10个个int型元素的数组型元素的数组 使用使用a0、a1、a9这样这样的形式访问每个元素,可以像使用的形式访问每个元素,可以像使用普通变量一样使用它们。普通变量一样使用它们。直接对直接对a访问,就是访问此数组的访问,就是访问此数组的首地址。首地址。p 不带小标的数组名具有特殊含义,表示数组的首不带小标的数组名具有特殊含义,表示数组的首地址地址数组的存储结构数组的存储结构p 根据数组的数据类型,为每个元素安排相同长度根据数组的数据类型,为每个元素安排相同长度的存储空间的存储空间p 根据数组的存储类型,将其安排在内存的动态、根据数组的存储类型,将其安排在内存的动态、静

6、态存储区或者寄存器区。静态存储区或者寄存器区。p用用sizeof(数组名数组名)获得数组所占字节数获得数组所占字节数 一维数组占用字节数一维数组占用字节数=数组长度数组长度sizeof(数组名数组名)二维数组占用字节数二维数组占用字节数=第一维长度第一维长度第二维长度第二维长度 sizeof(数组名数组名)数组使用数组使用p 对于数组:类型对于数组:类型 数组名数组名 整数整数n,元素顺序编号,元素顺序编号为:为:首元素序号首元素序号0,其余顺序编号。,其余顺序编号。p n元数组元素编号:元数组元素编号:0到到n-1。p 元素编号称为元素编号称为下标下标。p一维数组的定义格式为:一维数组的定义

7、格式为:类型说明符类型说明符 数组名常量表达式;数组名常量表达式;例如:例如:int a10;它它表表示示定定义义了了一一个个整整形形数数组组,数数组组名名为为a,此此数数组组有有1010个元素。个元素。一维数组一维数组p说明:说明:1.1.数组名定名规则和变量名相同,遵循标识符定名规则。数组名定名规则和变量名相同,遵循标识符定名规则。2.在定在定义义数数组时组时,需要指定数,需要指定数组组中元素的个数,方括弧中的常中元素的个数,方括弧中的常量表达式用来表示元素的个数,即数量表达式用来表示元素的个数,即数组长组长度。例如,指定度。例如,指定a10,表示,表示a数数组组有有10个元素,注意下个元

8、素,注意下标标是从是从0开始的,开始的,这这10个元素是,个元素是,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9。请请持持别别注意,按上面的定注意,按上面的定义义,不存在数,不存在数组组元素元素a10。3.常量表达式中可以包括常量和符号常量,但不能包含常量表达式中可以包括常量和符号常量,但不能包含变变量。量。也就是也就是说说,C语语言不允言不允许对许对数数组组的大小作的大小作动态动态定定义义,即数,即数组组的大小不依的大小不依赖赖于程序运行于程序运行过过程中程中变变量的量的值值。例如,下面。例如,下面这样这样定定义义数数组组是不行的:是不行的:举例:举例:int n;scanf(

9、“%d,&n);int an;float a0;/*/*数组大小为数组大小为0 0没有意义没有意义*/int b(2)(3);/*/*不能使用圆括号不能使用圆括号*/int k,ak;/*/*不能用变量说明数组大小不能用变量说明数组大小*/数组说明中其他常见的错误数组说明中其他常见的错误数组说明中其他常见的错误数组说明中其他常见的错误一维数组的输入和输出一维数组的输入和输出输入方法:输入方法:输入第输入第i i个数组元素:个数组元素:scanf(“%d”,&ai-1);输输入整个数入整个数组组元素:元素:for(i=0;i10;i+)scanf(“%d”,&ai);输出方法:输出方法:输出第输

10、出第i i个数组元素:个数组元素:printf(“%d”,ai-1);输输入整个数入整个数组组元素:元素:for(i=0;i10;i+)printf(“%d”,ai);int a10int a10p 不为自动数组初始化,数组中的元素值是不确定的不为自动数组初始化,数组中的元素值是不确定的 p 不为静态或外部数组初始化,则对数值型数组元素,不为静态或外部数组初始化,则对数值型数组元素,初值为初值为0 0,而对字符型数组元素,初值为空字符,而对字符型数组元素,初值为空字符 00p 对数组元素初始化的实现方法:对数组元素初始化的实现方法:一维数组的初始化一维数组的初始化1.1.在定义数组时对数组元素

11、赋以初值。在定义数组时对数组元素赋以初值。例如:例如:int a10=0,1,2,3,4,5,6,7,8,9;将数组元素的初值依次放在一对花括弧内。经过上将数组元素的初值依次放在一对花括弧内。经过上面的定义和初始化之后,面的定义和初始化之后,a0=0,a1=1,a2=2,a3=3,a4=4,a5=5,a6=6,a7=7,a8=8,a9=9。2.2.只给一部分元素赋值只给一部分元素赋值,未初始化的元素将自动被初未初始化的元素将自动被初始化为始化为0 0。如:如:int a10=0,1,2,3,4;相当于:相当于:int a10=0,1,2,3,4,0,0,0,0,0;3.3.如果想使一个数组中全

12、部元素值为如果想使一个数组中全部元素值为0 0,可以写成,可以写成 int a10=0,0,0,0,0,0,0,0,0,0;或或 int a10=0;不能写成:不能写成:int a10=0*10;4.4.在在对对全部数全部数组组元素元素赋赋初初值时值时,由于数据的个数已,由于数据的个数已经经确定,因此可以不指定数确定,因此可以不指定数组长组长度。度。例如:例如:int a5=1,2,3,4,5;也可以写成也可以写成 int a=1,2,3,4,5;在第二种写法中,花括弧中有在第二种写法中,花括弧中有5个数,系个数,系统统就会据此自就会据此自动动定定义义a数数组组的的长长度度为为5。但。但若数若

13、数组长组长度与提供初度与提供初值值的的个数不相同,个数不相同,则则数数组长组长度不能省略度不能省略。例如,想定。例如,想定义义数数组长组长度度为为10,就不能省略数,就不能省略数组长组长度的定度的定义义,而必,而必须须写写成成 int a10=1,2,3,4,5;只初始化前只初始化前5个元素,个元素,后后5个元素个元素为为0。一维数组在内存中的存放一维数组在内存中的存放每个数据元素占用的每个数据元素占用的字节数,就是基类型字节数,就是基类型的字节数的字节数一个元素占一个元素占4个字节个字节一维数组:一维数组:float mark100;mark0mark1mark2mark3.mark9986

14、.592.077.552.0.94.0低地址低地址 高地址高地址数组名数组名 下标下标 下标可以是整型常量或整型表达式。例如下标可以是整型常量或整型表达式。例如:a0=a5+a7-a2*3定定义义数数组时组时用到的用到的“数数组组名常量表达式名常量表达式”和引用数和引用数组组元素元素时时用到的用到的“数数组组名下名下标标”是有区是有区别别的。的。例如例如 int a10;/定定义义数数组长组长度度为为10 t=a6;/引用引用a数数组组中序号中序号为为6的元素的元素注意注意一维数组元素的引用一维数组元素的引用p 数组元素的引用方式:数组元素的引用方式:p 一维数组元素引用的程序实例一维数组元素

15、引用的程序实例程序使a0到a9的值为09,然后按逆序输出。程序程序程序程序举举举举例例例例1 1:用用用用数数组组来来处处理理,求解求解Fibonacci数列数列。Fibonacci数列:斐波那契数列,又称黄金分割数列或数列:斐波那契数列,又称黄金分割数列或兔子数列。兔子数列。指的是指的是这样这样一个数列:一个数列:0、1、1、2、3、5、8、13,即,即满满足公式:足公式:F(0)=0,F(1)=0、F(n)=F(n-1)+F(n-2)一维数组程序举例一维数组程序举例二二维数数组不能写成不能写成 float a3,4,b(5)(10);p二维数组的定义格式为:二维数组的定义格式为:数据类型数

16、据类型 数组名行标列标;数组名行标列标;例如:定例如:定义义a为为34(3行行4列列)的数的数组组,b为为510(5行行10列列)的数的数组组。如下:。如下:float a34,b510;注意注意可以把二维数组看作是一种特殊的一维数组:它的元可以把二维数组看作是一种特殊的一维数组:它的元素又是一个一维数组。素又是一个一维数组。例如,例如,int a34,可以把可以把a看作是一个一维数组,它看作是一个一维数组,它有有3个元素:个元素:a0、a1、a2,每个元素又是一个包每个元素又是一个包含含4个元素的一维数组。个元素的一维数组。二维数组的输入和输出二维数组的输入和输出输入方法:输入方法:输入第输

17、入第i i行行j j列元素:列元素:scanf(“%d”,&ai-1j-1);输输入整个数入整个数组组元素:元素:for(i=0;i2;i+)for(j=0;j3;i+)scanf(“%d”,&aij);输出方法:输出方法:输出第输出第i i行行j j列元素:列元素:printf(“%d”,ai-1j-1);输输入整个数入整个数组组元素:元素:for(i=0;i2;i+)for(j=0;j3;i+)printf(“%d”,aij);int a2 3int a2 3可以用下面可以用下面4 4种方法对二维数组初始化种方法对二维数组初始化数据类型数据类型 数组名数组名 常量表达式常量表达式11常量表

18、达式常量表达式2 初始化数据;初始化数据;二维数组的初始化二维数组的初始化1.1.分行给二维数组赋初值(按行初始化)。分行给二维数组赋初值(按行初始化)。如:如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;2.2.可以将所有数据写在一个花括弧内,按数组排列的顺序可以将所有数据写在一个花括弧内,按数组排列的顺序对各元素赋初值(按元素初始化)。对各元素赋初值(按元素初始化)。如:如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;如:如:int a34;a34=1,2,3,4,5,6,7,8,9,10,11,12;1 0 0 01 0 0 05 0

19、0 0 5 0 0 0 9 0 0 0也可以对各行中的某一元素赋初值也可以对各行中的某一元素赋初值如:如:int a34=1,0,6,0,0,0,11;1 0 0 01 0 0 00 6 0 00 6 0 00 0 0 0 110 0 11 1 0 0 01 0 0 05 6 0 0 5 6 0 0 0 0 0 0如:如:int a34=1,5,6;3.3.对部分元素赋初值,未初始化的元素将自动被初始化为对部分元素赋初值,未初始化的元素将自动被初始化为0 0。如:如:int a34=1,5,9;也可以只对某几行元素赋初值。也可以只对某几行元素赋初值。在定义时也可以只对部分元素赋初值而省略第一维

20、的长度,最在定义时也可以只对部分元素赋初值而省略第一维的长度,最好按行赋初值。好按行赋初值。0 0 3 00 0 0 00 10 0 04.4.如果对全部元素都赋初值,则定义数组时对第一维的长度可如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。以不指定,但第二维的长度不能省。如:如:int a34=1,2,3,4,5,6,7,8,9,10,11,12;它等价于:它等价于:int a4=1,2,3,4,5,6,7,8,9,10,11,12;如:如:int a4=0,0,3,0,10;如如:int a33=1,2,3,4,5,6,7,0,0;它等价于:它等价于:

21、int a3=1,2,3,4,5,6,7;注意:不能省略第二维的长度。注意:不能省略第二维的长度。二二维数组在内存中的存放维数组在内存中的存放p 二维数组中的元素在内存中的排列顺序是:按行存按行存放放,即先顺序存放第一行的元素,再存放第二行的元素 地址地址 值值 数组元素数组元素b b0000b b0101b b0202b10b10b11b11b12b12b b2020b b2121b b22223003000 0H H3003002 2H H3003004 4H H3003006 6H H3003008 8H H300300A AH H300300C CH H300300E EH H3030

22、1010H H例如:整型数组例如:整型数组 b33=1,2,3,4,5,6,7,8,9;123456789问题:问题:有了二维数组的基础,那么有了二维数组的基础,那么多维数组多维数组如何定义呢?如何定义呢?定定义义三三维维数数组组:float a234;p 第一第一维维下下标值标值和第二和第二维维下下标标的的值值从从0开始开始p 数数组组元素可以出元素可以出现现在表达式中,也可以被在表达式中,也可以被赋值赋值。例如:例如:b12=a23/2二二维数数组的引用的引用p 二二维维数数组组元素的表示形式元素的表示形式为为:数数组组名下名下标标下下标标 例如:例如:a23p 下下标标可以是整型表达式,

23、可以是整型表达式,如如 a2-12*2-1常出常出现现的的错误错误有:有:int a34;/*定定义义a为为34的数的数组组*/a34=3;在使用数组元素时,应该注意下标值应在已定义的数组在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。大小的范围内。下标越界是大忌!下标越界是大忌!p 以一维数组为例,以一维数组为例,an-1是数组的最后一个元素是数组的最后一个元素p 编译程序不检查是否越界编译程序不检查是否越界p 下标越界,将访问数组以外的空间下标越界,将访问数组以外的空间p 那里的数据是未知的,不受我们掌控,可能带来严那里的数据是未知的,不受我们掌控,可能带来严重后果重后果b0

24、b1b2b3b4caib8b9b10b113034383c4044484c5054585c12012345891011c和和a的值因数组越界而被破坏了的值因数组越界而被破坏了0 1 2 34566 7 8 9 1011二维数组程序举例二维数组程序举例 例例:将一个二维数组行和列元素互换,存到另一个二维数将一个二维数组行和列元素互换,存到另一个二维数组中。组中。例:有一个例:有一个3434的矩阵,要求编程序求出其中值最大的那的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。个元素的值,以及其所在的行号和列号。先用先用N-S流程图表示算法流程图表示算法,如下:,如下:例:从键

25、盘输入某年某月(包括闰年),变成输入该月的例:从键盘输入某年某月(包括闰年),变成输入该月的天数天数如何使两个数组的值相等如何使两个数组的值相等void main()int b4=1,2,3,4,a4;a=b;方法二:方法二:int i;for(i=0;ibbi i6 6次,次,b bi iaai i3 3次,其中次,其中i i每次为不同的值每次为不同的值),则认为,则认为a a数组大于数组大于b b数组,并分别数组,并分别统计出两个数组相应元素大于、等于、小于的次数。统计出两个数组相应元素大于、等于、小于的次数。例:有一个一维数组例:有一个一维数组score,内放,内放10个学生成绩,求平均

26、成个学生成绩,求平均成绩。绩。解题思路:解题思路:用函数用函数average求平均成绩,用数组名作为函数实求平均成绩,用数组名作为函数实参,形参也用数组名参,形参也用数组名在在average函数中引用各数组元素,求平均成绩并函数中引用各数组元素,求平均成绩并返回返回main函数函数例:例:有两个班级,分别有有两个班级,分别有35名和名和30名学生,调用一个名学生,调用一个average函数,分别求这两个班的学生的平均成绩。函数,分别求这两个班的学生的平均成绩。解题思路:解题思路:需要解决怎样用同一个函数求两个不同长度的数需要解决怎样用同一个函数求两个不同长度的数组的平均值的问题组的平均值的问题

27、定义定义average函数时不指定数组的长度,在形参表函数时不指定数组的长度,在形参表中增加一个整型变量中增加一个整型变量i从主函数把数组实际长度从实参传递给形参从主函数把数组实际长度从实参传递给形参i这个这个i用来在用来在average函数中控制循环的次数函数中控制循环的次数为简化,设两个班的学生数分别为为简化,设两个班的学生数分别为5和和10向函数传递二维数组向函数传递二维数组p 使用不带方括号的数组名作为参数传递使用不带方括号的数组名作为参数传递传递的是数组的首地址,也是二维数组的第一个元素的传递的是数组的首地址,也是二维数组的第一个元素的地址地址p 二维数组作为形参时不可以省略二维长度

28、二维数组作为形参时不可以省略二维长度由于二维数组的按行存储,编译器必须知道每行有多少由于二维数组的按行存储,编译器必须知道每行有多少个元素,否则会不确定具体的元素地址个元素,否则会不确定具体的元素地址用多维数组名作为函数实参和形参。在被调函数中对用多维数组名作为函数实参和形参。在被调函数中对形参数组定义时可以指定每一维的大小形参数组定义时可以指定每一维的大小。例:例:有一个有一个的矩阵,求所有元素中的最大值。的矩阵,求所有元素中的最大值。解题思路:解题思路:先使变量先使变量max的初值等于矩阵中第一个元素的值,然的初值等于矩阵中第一个元素的值,然后将矩阵中各个元素的值与后将矩阵中各个元素的值与

29、max相比,每次比较后都相比,每次比较后都把把“大者大者”存放在存放在max中,全部元素比较完后,中,全部元素比较完后,max 的值就是所有元素的最大值。的值就是所有元素的最大值。当形参被声明为二维数组时,可以当形参被声明为二维数组时,可以省略数组第一维的长度声明,但不省略数组第一维的长度声明,但不能省略第二维的长度声明能省略第二维的长度声明例:某班期末考试科目为数学、英语、物理。班级人数不例:某班期末考试科目为数学、英语、物理。班级人数不超过超过40人,要求计算:人,要求计算:排序和查找算法排序和查找算法p 排序算法排序算法交换法排序交换法排序选择法排序选择法排序冒泡法排序冒泡法排序插入法排

30、序插入法排序交换法排序:交换法排序:例:例:用选择法对数组中用选择法对数组中10个整数按由小到大排序。个整数按由小到大排序。解题思路:解题思路:选择法就是先将选择法就是先将10个数中最小的数与个数中最小的数与a0对换对换;再将再将a1到到a9中最小的数与中最小的数与a1对换对换每比较一每比较一轮轮,找出一个未经排序的数中最小的一个找出一个未经排序的数中最小的一个共比较共比较9轮轮程序程序程序程序举举举举例:用冒泡法例:用冒泡法例:用冒泡法例:用冒泡法对对对对1010个数排序个数排序个数排序个数排序(由小到大由小到大由小到大由小到大)。起泡法的思路是:起泡法的思路是:将相邻两个数比较,将小的调到

31、前头。将相邻两个数比较,将小的调到前头。第第一一轮轮比比较较经过第一轮经过第一轮(共共5 5次比较与交换次比较与交换)后,最大的数后,最大的数9 9已已“沉底沉底”。然后进行对余下的前面。然后进行对余下的前面5 5个数第二轮比较个数第二轮比较第第二二轮轮比比较较如果有如果有n个数,则要进行个数,则要进行n-1轮轮比较。在第比较。在第1轮轮比较中比较中要进行要进行n-1次两两比较,在第次两两比较,在第j轮轮比较中要进行比较中要进行n-j次两次两两比较。两比较。经过第二轮经过第二轮(共共4 4次比较与交换次比较与交换)后,得到次大的数后,得到次大的数8 8。程序流程图如下:程序流程图如下:数据溢出数据溢出mid=(high+low)/2;如果数组很多,如果数组很多,low和和high之和大于整数的取值范围之和大于整数的取值范围 就会发生数据溢出就会发生数据溢出 防止溢出的解决方案防止溢出的解决方案 修改计算中间值的方法,用减法代替加法修改计算中间值的方法,用减法代替加法 mid=low+(high-low)/2;常见错误P219

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁