c语言程序设计教学资料第8章数组_第1页
c语言程序设计教学资料第8章数组_第2页
c语言程序设计教学资料第8章数组_第3页
c语言程序设计教学资料第8章数组_第4页
c语言程序设计教学资料第8章数组_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

3、数组中汇集了多个数据项,称为数组中汇集了多个数据项,称为数组元素数组元素。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 a10; 定义一个有定义一

5、个有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;

9、scanf(“%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

12、,0; 3.3.如果想使一个数组中全部元素值为如果想使一个数组中全部元素值为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个数,系统就会据此个数,系统就会据此自动定义自动定

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

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

15、元素的引用方式:数组元素的引用方式:p 一维数组元素引用的程序实例一维数组元素引用的程序实例程序使a0到a9的值为09,然后按逆序输出。数组来处理数组来处理,求解求解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种方法对二维数组初始化

18、种方法对二维数组初始化数据类型数据类型 数组名数组名 常量表达式常量表达式11常量表达式常量表达式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

19、,2,3,4,5,6,7,8,9,10,11,12; 1 0 0 01 0 0 05 0 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=

21、0,0,3,0,10; 如如: int a33=1,2,3,4,5,6,7,0,0;它等价于:它等价于: int a3=1,2,3,4,5,6,7;注意:不能省略第二维的长度。注意:不能省略第二维的长度。二维数组在内存中的存放二维数组在内存中的存放p 二维数组中的元素在内存中的排列顺序是:按行存按行存放放,即先顺序存放第一行的元素,再存放第二行的元素 地址地址 值值 数组元素数组元素b b0000b b0101b b0202b10b10b11b11b12b12b b2020b b2121b b22223003000 0h h3003002 2h h3003004 4h h3003006 6h

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

23、维数组元素的表示形式为:二维数组元素的表示形式为: 数组名下标下标数组名下标下标 例如:例如: a23p 下标可以是整型表达式,下标可以是整型表达式,如如 a2-12*2-1常出现的错误有:常出现的错误有: int a34; /* 定义定义a为为34的数组的数组 */ a34=3; 在使用数组元素时,应该注意下标值应在已定义的数组在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。大小的范围内。下标越界是大忌!下标越界是大忌!p 以一维数组为例,以一维数组为例,an-1是数组的最后一个元素是数组的最后一个元素p 编译程序不检查是否越界编译程序不检查是否越界p 下标越界,将访问数组以外

24、的空间下标越界,将访问数组以外的空间p 那里的数据是未知的,不受我们掌控,可能带来严那里的数据是未知的,不受我们掌控,可能带来严重后果重后果b0b1b2b3b4caib8b9b10b113034383c4044484c5054585c12012345891011c和和a的值因数组越界而被破坏了的值因数组越界而被破坏了0 1 2 34566 7 8 9 1011二维数组程序举例二维数组程序举例 例例: : 将一个二维数组行和列元素互换,存到另一个二维数将一个二维数组行和列元素互换,存到另一个二维数组中。组中。例:有一个例:有一个3 34 4的矩阵,要求编程序求出其中值最大的那的矩阵,要求编程序求

25、出其中值最大的那个元素的值,以及其所在的行号和列号。个元素的值,以及其所在的行号和列号。 先用先用n-s流程图表示算法流程图表示算法 ,如下:,如下:例:从键盘输入某年某月(包括闰年),变成输入该月的例:从键盘输入某年某月(包括闰年),变成输入该月的天数天数如何使两个数组的值相等如何使两个数组的值相等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数组,并数组,并分别统计

26、出两个数组相应元素大于、等于、小于的次分别统计出两个数组相应元素大于、等于、小于的次数。数。 例:有一个一维数组例:有一个一维数组score,内放,内放10个学生成绩,求平均个学生成绩,求平均成绩。成绩。解题思路:解题思路:用函数用函数average求平均成绩,用数组名作为函数求平均成绩,用数组名作为函数实参,形参也用数组名实参,形参也用数组名在在average函数中引用各数组元素,求平均成绩函数中引用各数组元素,求平均成绩并返回并返回main函数函数例:有两个班级,分别有例:有两个班级,分别有35名和名和30名学生,调用一个名学生,调用一个average函数,分别求这两个班的学生的平均成绩。

27、函数,分别求这两个班的学生的平均成绩。解题思路:解题思路:需要解决怎样用同一个函数求两个不同长度的数需要解决怎样用同一个函数求两个不同长度的数组的平均值的问题组的平均值的问题定义定义average函数时不指定数组的长度,在形参函数时不指定数组的长度,在形参表中增加一个整型变量表中增加一个整型变量i从主函数把数组实际长度从实参传递给形参从主函数把数组实际长度从实参传递给形参i这个这个i用来在用来在average函数中控制循环的次数函数中控制循环的次数为简化,设两个班的学生数分别为为简化,设两个班的学生数分别为5和和10向函数传递二维数组向函数传递二维数组p 使用不带方括号的数组名作为参数传递使用

28、不带方括号的数组名作为参数传递传递的是数组的首地址,也是二维数组的第一个元素的传递的是数组的首地址,也是二维数组的第一个元素的地址地址p 二维数组作为形参时不可以省略二维长度二维数组作为形参时不可以省略二维长度由于二维数组的按行存储,编译器必须知道每行有多少由于二维数组的按行存储,编译器必须知道每行有多少个元素,否则会不确定具体的元素地址个元素,否则会不确定具体的元素地址用多维数组名作为函数实参和形参。在被调函数中对用多维数组名作为函数实参和形参。在被调函数中对形参数组定义时可以指定每一维的大小形参数组定义时可以指定每一维的大小 。例:有一个例:有一个的矩阵,求所有元素中的最大值。的矩阵,求所有元素中的最大值。解题思路:解题思路:先使变量先使变量max的初值等于矩阵中第一个元素的值,然的初值等于矩阵中第一个元素的值,然后将矩阵中各个元素的值与后将矩阵中各个元素的值与max相比,每次比较后都相比,每次比较后都把把“大者大者”存放在存放在max中,全部元素比较完后,中,全部元素

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论