《C语言程序设计PPT课件(共13章)第7章数组》由会员分享,可在线阅读,更多相关《C语言程序设计PPT课件(共13章)第7章数组(76页珍藏版)》请在金锄头文库上搜索。
1、第7章 数组目录 CONTENT010203项目概述入口文件项目组件7.1 一维数组7.1 一维数组假如要存储 80 名学生的成绩,在没有数组之前,就需要定义 80 个变量,如下所示。int n1, n2, n3, ,n80;很明显这个定义的过程相当琐碎,耗费时间与精力,于是 C 语言提供了数组来存储相同类型的数据,现在要存储 80 名学生的成绩,只需定义一个数组,如下所示。int n80;数组是典型的构造数据类型之一,是具有一定顺序关系的若干个变量的结合,组成数组的各个变量称为数组的元素。数组中各元素的数据类型必须是相同的,数组可以是一维的,也可以是多维的。7.1.1 一维数组的定义一维数组
2、指的是存储一维数列中相同数据的集合,其语法格式如下所示。存储类型说明符 数组标识符常量表达式;存储类型说明符表示数组中存储的所有元素的类型,数组标识符表示数组型变量名,命名规则与普通变量名一致,常量表达式表示数组中存放的数据元素的个数,即数组长度。定义一个一维数组,如下所示。int array8;如上述一维数组的定义,表示数组中有 8 个元素,每个元素的数据类型都是整型,其下标值从 0 开始到 7 结束,即 array0表示数组的第一个元素,array4表示数组的最后一个元素,以此类推。7.1.2 数组元素数组定义完成后即可使用数组中的元素,数组元素是组成数组的基本单元。每一个数组元素都是一个
3、相对独立的变量,访问数组中的元素,可以通过指定数组名称和元素的位置(数组下标)进行确定,其语法格式如下所示。由上文描述可知,数组的下标从 0 开始,如果数组的大小为 N,则数组的最大下标为N-1。7.1.2 数组元素操作数组元素保存数据,具体如例7-1 所示。分析:上述示例中,第 810 行代码通过 for 循环语句对数组中的每一个元素(数组元素类型为整型)进行赋值操作,操作数组元素的方式为数组名与下标的方式,即 Arrayi,第 1315 行代码通过 for 循环语句依次输出数组中元素的值。7.1.3 一维数组初始化一维数组的初始化指的是定义数组时进行数组元素的赋值,其初始化的语法格式如下所
4、示。如果需要对数组全部元素赋初值,示例代码如下所示。在定义数组的同时将常量 1、2、3、4、5 分别保存到数组元素 a0、a1、a2、a3、 a4中。如果需要将所有的元素赋初值为 0,则初始化操作如下所示。 该初始化操作等价于以下操作。 上述初始化操作只适用于初始值为 0,如赋初始值为 1,则以下操作为错误操作。7.1.3 一维数组初始化分析: 上述示例中,第 6 行代码为数组初始化操作,通过第 810 行代码输出初始化后的数组 元素的值,由输出结果可知,初始化成功。第 14 行代码同样为数组初始化操作且初始值为 0,通过第 1618 行代码输出初始化后的数组元素的值,全部为 0。7.1.3
5、一维数组初始化释疑: 当对数组中的全部元素进行初始化时,可以不指定数组的长度,如 int a=0,1,2,3;表 示数组的元素共有 4 个,即长度为 4。 如果只需要初始化数组中的部分元素,则其他元素默认为 0,示例代码如下所示。 int a5 = 1, 2, 3;执行上述操作后,a0=1,a1=2,a2=3,a3=0,a4=0。如例 7-3 所示,初始化部 分元素,查看结果7.1.3 一维数组初始化执行上述操作后,a0=1,a1=2,a2=3,a3=0,a4=0。如例 7-3 所示,初始化部 分元素,查看结果分析: 上述示例中,第 6 行代码对数组进行初始化时,只赋值了部分数值,即 1、2、
6、3,分别 按顺序赋值给 Array0、Array1、Array2,剩余未赋值的数组元素则默认被赋值为 0。 7.1.4 数组的存储方式数组在内存中的存储是连续的,即每个元素都被存储在相邻的位置,具体如图 7.1 所示。如图 7.1 所示,数组中所有的元素在内存的位置都是连续的,最低的地址对应第一个元 素,最高的地址对应最后一个元素,如果数组为整型数组,则数组中的每一个元素在内存中 占用 4 个字节,数组变量的长度为 6,共占有 24 个字节。7.1.4 数组的存储方式通过获取内存地址的方式测试上述推理,具体如例 7-4 所示。 分析: 上述示例中,定义一个整型数组,其元素共有 5 个,使用 p
7、rintf()函数进行格式化输出, 格式“%p”用来输出内存地址,取地址符“&”用来获取某个元素(变量)的内存地址。 由输出结果可知,每个元素的内存地址差值为 4,内存的基本单位为字节,因此差值为 4 个 字节。由于数组为整型数组,可知数组在内存中的地址是连续的,最后一个元素的起始地址 与第一个元素的起始地址的差值为 14(十六进制数),即 20 个字节,包含最后一个元素占 有的 4 个字节,该数组共占用 24 个字节的内存空间,如图 7.2 所示。 7.1.5 数组的应用功能需求:输入 5 个整数,将其倒序存放到数组中,并将结果输出。如例 7-5 所示。分析: 上述示例中,第 1012 行代
8、码通过 for 循环语句依次遍历数组中的每一个元素,scanf() 函数通过用户输入的方式对每一个数组中的元素进行赋值(从数组的最后一个元素开始), 第 1618 行代码再次通过 for 循环遍历数组中的每一个元素(从数组的第一个元素开始), 输出元素中的值。7.2 二维数组7.2.1 二维数组的定义二维数组的声明与一维数组相同,其语法格式如下所示。数据类型 数组名常量表达式 1常量表达式 2;如上述定义形式,不同于一维数组的是,二维数组有两个常量表达式。其中,常量表达式 1 被称为行下标,常量表达式 2被称为列下标。简单地说,可以将二维数组看作代数中的矩阵,常量表达式 1 表示矩阵的行数,常
9、量表达式 2 表示矩阵的列数。假设定义一个二维数组 Arraymn,则二维数组的行下标取值范围为 0m-1,列下标取值范围为 0n-1,二维数组的最大下标元素是 Arraym-1n-1。7.2.1 二维数组的定义定义一个数组名为 Array,3 行 4 列的整型二维数组,如下所示。 int Array34; 如上述二维数组定义,该数组的变量共有 34 个,分别为 Array00、Array01、 Array02、Array03、Array10、Array11、Array12、Array13、Array20、 Array21、Array22、Array23,其对应的位置如图 7.3 所示。 注意
10、: 图 7.3 所示的二维数组的元素位置只是为了形象地显示二维数组的元素关系,不代表其 在内存中的存储位置,二维数组在内存中的存储为连续存储,按照图 7.3 所示的行进行排序, 如 Array03元素在内存中的下一个元素为 Array107.2.2 数组元素使用二维数组中的元素,其一般的形式如下所示。数组名下标下标;注意: 无论是行下标还是列下标,其索引值都是从 0开始,如 Array23表示的是二维数组中 第 3 行第 4 列对应的元素。 操作二维数组保存数据,如例 7-6 所示。7.2.2 数组元素分析: 上述示例中,对二维数组赋值以及输出值,都需要使用 for 语句循环嵌套,外层循环实
11、现按行遍历数组,内存循环实现按列遍历数组,如变量 i 为 0 时,表示操作数组的第一行, 变量 j 为 0,表示操作数组某一行的第 1 个元素。7.2.3 二维数组的初始化二维数组同样可以在声明的同时对其进行赋值,即初始化。二维数组初始化比一维数组 的初始化复杂,其主要可以分为分行初始化以及不分行初始化。1.分行初始化 采用分行的形式对二维数组初始化需要使用大括号,通过大括号将属于同一行的元素包 含起来,如下所示。 int Array23 = 1,2,3,4,5,6; 如上述操作,第一行的三个元素分别被赋值为 1、2、3,第二行的三个元素分别被赋值 为 4、5、6。在分行赋值时,可以只对部分元
12、素赋值,如下所示。 int Array23 = 1,2,4,5; 完成上述初始化操作后,Array00的值为 1,Array01的值为 2,Array02的值默 认为 0,Array10的值为 4,Array11的值为 5,Array12的值默认为 0。 7.2.3 二维数组的初始化采用分行的方式初始化二维数组,如例 7-7 所示。分析: 上述示例中,采用分行的方式对二维数组进行初始化,其中只初始化了部分元素,通过 双层 for 循环输出二维数组元素中的值,可知未被赋值的数组元素被默认赋值为 0。 7.2.3 二维数组的初始化1.不分行初始化 不分行初始化即将所有的数据写入到一个大括号中,按照
13、数组元素排列顺序对元素赋值, 如下所示。 int Array34 = 1,2,3,4,5,6; 如果大括号内的数据少于数组元素的个数,则系统将默认后面未被赋值的元素的值为 0。 在为所有的元素进行赋值时,可以省略行下标,不能省略列下标,如下所示。 int Array3 = 1,2,3,4,5,6; 7.2.3 二维数组的初始化释疑: 采用不分行的形式对二维数组所有元素进行赋值时,不能省略列下标,根据元素的个数 以及列数,即可确认二维数组的行数,而如果给定元素的个数以及行数,则不能确认二维数 组的列数。 分行初始化与不分行初始化具有一定的区别,如下所示。 int Array23 = 1,2,3;
14、 int Array23 = 1, 2,3; 上述第一行代码,该初始化操作后,第一行元素分别被赋值为 1、2、3,第二行元素被 默认赋值为 0。而执行上述第二行代码的初始化操作后,第一行元素分别被赋值为 1、0、0, 第二行元素分别被赋值为 2、3、0。 7.2.3 二维数组的初始化采用不分行的方式初始化二维数组,如例 7-8 所示。分析: 上述示例中,采用不分行的方式对二维数组进行初始化,其中只初始化了部分元素,通 过双层 for 循环输出二维数组元素中的值,可知未被赋值的数组元素被默认赋值为 0。7.2.4 数组的应用功能需求:使用二维数组实现输出杨辉三角。如图 7.4 所示,列出杨辉三角
15、的前 6 行。 如图 7.4 所示,杨辉三角每一层所有两端都是 1 并且左右对称,从第一层开始,每个不 位于左右两端的数等于上一层左右两个数相加之和。7.2.4 数组的应用如果将图 7.4 中等腰三角形转化为直角三角形,如图 7.5 所示。如图 7.5 所示,图中的杨辉三角可以视为一个二维模型,即一张表格,因此可以使用二 维数组 Array66存储杨辉三角中的所有数字,如第 4 行第 3 列的数字可以用 Array32 表示。图 7.5 中,第一列的数字都为 1,即 Arrayi0=1,行数等于列数的数字同样为 1,即 Arrayii=1 , 剩 余 数 字 可 以 通 过 相 邻 上 层 数
16、 字 相 加 得 到 , 即 Arrayij=Arrayi-1j-1+Arrayi-1j。 7.2.4 数组的应用至此,杨辉三角中的数字即可存放到二维数组中,最后通过控制间距输出等腰杨辉三角 形,具体如例 7-9 所示。分析: 上述示例中,第 817 行代码通过 for 循环实现将杨辉三角的数值保存到二维数组中, 外层循环控制行数,内层循环控制列数,保存杨辉三角的值时,需要考虑每一层左右两端的 数值为 1,其余数值等于上层相邻的数值之和。第 2027 行代码通过 for循环实现输出杨辉 三角的值,为了输出更加美观,按照可变的字段宽度先输出每一行第一列的数值,其余按顺 序输出。 7.3 数组的排序算法如直接插入排序、希尔排序、直接选 择排序、堆排序、冒泡排序、快速排序、归并排序等。7.3.1 冒泡排序1.冒泡排序的原理 冒泡排序(Bubble Sort)是一种简单且经典的排序算法。冒泡排序的核心思想是重复遍 历整个序列,从第一个元素开始,两两比较相邻元素的大小,如果反序则交换,直到整个序 列变为有序为止。 冒泡排序算法的具体操作如下所示。 (1)比较相邻元素,从第一个元素开始,即第一个元