《数组及其应用》PPT课件.ppt

上传人:小飞机 文档编号:5520181 上传时间:2023-07-18 格式:PPT 页数:38 大小:259.99KB
返回 下载 相关 举报
《数组及其应用》PPT课件.ppt_第1页
第1页 / 共38页
《数组及其应用》PPT课件.ppt_第2页
第2页 / 共38页
《数组及其应用》PPT课件.ppt_第3页
第3页 / 共38页
《数组及其应用》PPT课件.ppt_第4页
第4页 / 共38页
《数组及其应用》PPT课件.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《《数组及其应用》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《数组及其应用》PPT课件.ppt(38页珍藏版)》请在三一办公上搜索。

1、程序设计技术,C语言数据描述和C程序设计初步 结构化程序设计基础和C语言的控制结构 数组及其应用 函数与C程序结构 指针与函数 指针与数组 字符串及其应用 结构体类型和联合体类型 C语言的文件处理及其应用 位运算与枚举类型,本章概要和学习目标,数组是程序设计中使用的一种重要的数据结构。为了能够描述出若干相同类型的相关变量之间内在的联系,以便合理地使用程序的控制结构对它们进行处理,就需要把相同类型的多个变量按有序的形式组织起来,这些按序排列的相同数据类型的存储单元称为数组。在语言中,组成数组的每个成员的数据类型可以是基本数据类型,指针类型或其他构造类型,因此数组可分为数值数组、字符数组、指针数组

2、、结构数组等,本章仅讨论数值类型的数组及其简单应用。,数组及其应用,3.1 一维数组3.1.1 一维数组的定义和初始化3.1.2 一维数组元素的引用方法3.2 二维数组和多维数组3.2.1 二维数组和多维数组的定义3.2.2 二维数组和多维数组元素引用方法3.3 数组的简单应用3.3.1 数组元素值的随机生成3.3.2 常用排序方法3.3.3 常用查找方法,一维数组,一维数组是一组按线性排列有序且个数有限的同类型变量构成的数据集合,集合中的数据元素使用同一个名字来描述他们之间的共性,同时又通过各自不同的序号描述数据集合 中各个数据元素之间的关系。一维数组在存储时需要占用连续的内存空间,它们在存

3、储器中的映像如图3.1所示,其每一个数据元素所占用的字节长度与它们的数据类型相关。,3.1.1 一维数组的定义和初始化,在C程序设计中必须首先对数组进行定义,然后才能进行数组的各种操作。一维数组定义的一般形式:数据类型名 数组名常量表达式;其中,方括号在此处是数组运算符,方括号中的常量表达式值用以指定该数组可以拥有数组元素个数,也称为数组的长度。数组的长度一但定义就不能在程序的运行过程中进行修改,在定义数组时应该根据应用的实际情况为数组长度留有余地。下面是一些数组定义的示例:int array_int10;floatb10,c20;double arr100;,3.1.1 一维数组的定义和初始

4、化,定义数组还要注意以下几点:(1)数组名的命名必须符合C语言关于标识符的书写规定。(2)数组名也是变量,因此在定义数组时数组的名字不能与同一范围内已经定义的其它变量名字相同。(3)定义数组时,不能用变量来表示数组的长度(注:在C99标准中可以用变量表示数组长度),但是可以用符号常数或常量表达式。下面是一组用于比较的定义形式:(4)允许在同一个定义语句中,定义多个数组或者混合定义同类型的数组和简单变量。例如:inta,b,c,d,k110,k220;,3.1.1 一维数组的定义和初始化,(5)可以在定义数组时用“存储类型”对数组进行说明,指定数组的存储单元分配到内存的静态存储区或是动态存储区。

5、存储类型可以是自动的(auto)、静态的(static)或者外部的(extern),关于存储类别将在4.3节中详细介绍。例如,一个静态的单精度实型数组可以定义为:static float score50;C语言允许在数组定义时给数组元素赋予初值,这个过程称为数组初始化。数组初始化的一般形式:数据类型名 数组名存储单元数=常量列表;其中,常量列表中两项之间用逗号分隔。初始值用常量形式表示,也可以使用常量表达式,但不允许使用含变量的表达式。例如:int a10=1,2,3,4,5,6,7,8,9,10;int b3=1,3*5,4*3-2;,3.1.1 一维数组的定义和初始化,对数组进行初始化应当

6、注意以下几点:(1)可以对数组部分初始化,即中常量值的个数少于指定的数组元素个数。例如:inta10=0,1,2,3,4;/为a0a4元素赋值(2)若需要将数组全部元素初始化为0值,可以用如下形式实现:int a10=0;(3)不能给数组整体赋值。例如,inta5=1,1,1,1,1;表示将数组的所有元素值初始化为1,但不能将其写成inta10=1;。(4)可以省略数组的长度。例如:inta5=1,2,3,4,5;和inta=1,2,3,4,5;等效。(5)初始化列表中值的个数不能超过指定的数组长度。例如下面的数组定义是错误的:int a5=1,2,3,4,5,6;/初始值的个数超过了数组长度

7、,3.1.2 一维数组元素的引用方法,C语言中规定,在一般情况下数组不能作为一个整体参加数据处理,而只能通过处理每一个数组元素(下标变量)达到处理数组的目的。一维数组元素(下标变量)的表示形式为:数组名下标其中,下标值应该是整型常数或表达式,该值表示了数组元素在一维数组中的顺序号,实型下标值系统会自动取整。数组的下标变量和普通变量的用法是相同,凡是普通变量可以出现的地方,下标变量也可以出现。如下面语句序列所示:double a10,y;a5=300;/*将a数组中第6个元素(5号元素)赋值为300*/y=500;/*将变量y赋值为500*/,3.1.2 一维数组元素的引用方法,由于在一般情况下

8、对一维数组不能整体进行操作,所以对于一维数组的输入和输出操作常用一重循环的形式进行处理。设有定义数组和变量的C语句序列为:double a10;int i;则数组a的输入输出基本形式如图3.2所示。,3.1.2 一维数组元素的引用方法,例3-1 将一个整型数组中所有元素值在同一个数组中按逆序重新存放并输出。程序一次运行情况如下所示:Input ten value of Array:21 23 25 27 29 30 32 34 36 3838 36 34 32 30 29 27 25 23 21例3-2 在一次选举中,有五位候选人,分别由15编号,请编程序统计出各位候选人的得票数并找出得票数第

9、一名的编号。程序的一次运行情况如下:请输入候选人的编号(-1 表示结束)1 2 3 4 5 1 1 2 3 4 5 4 3 4 3 1 1 1 5-1 6 2 4 4 3票数最高的候选人编号是:1号。,3.1.2 一维数组元素的引用方法,例3-3 用数组存放一组统计数据,然后用“*”表示的条形图输出这组数据。程序输出效果如下所示:Element Value Striation1 11*2 3*3 7*4 10*5 20*例3-4 打印如下所示的杨辉三角形的前10行(要求使用一维数组处理),3.1.2 一维数组元素的引用方法,程序中,为了简化对应关系(避免使用0号元素对应第一个数据)使用了一个1

10、1个元素的数组进行处理,由于要求使用一维数组处理杨辉三角形,所以每生成一行杨辉三角形的元素值后立即将该行值输出。对每一行杨辉三角形值的具体处理方法为:首先用表达式yhrow=1将该行杨辉三角形的最后一个元素值置1,然后从后向前依次在循环条件满足的情况下执行表达式:yhcol=yhcol+yhcol-1,该表达式的意思是将一维数组yh上一次当前位置元素值与其前面一个位置上一次的元素值相加作为本次当前位置上的元素值,图3.3展示了通过第5行数据生成第6行数据的情况。,数组及其应用,3.1 一维数组3.1.1 一维数组的定义和初始化3.1.2 一维数组元素的引用方法3.2 二维数组和多维数组3.2.

11、1 二维数组和多维数组的定义3.2.2 二维数组和多维数组元素引用方法3.3 数组的简单应用3.3.1 数组元素值的随机生成3.3.2 常用排序方法3.3.3 常用查找方法,3.2 二维数组和多维数组,在程序设计中如果需要处理诸如矩阵、平面的或立体的图形等数据信息,使用一维数组显然不方便,在这种情况下,可以使用二维、三维以至更多维的数组。一维数组存储线性关系的数据,二维数组则可以存储平面关系的数据,三维数组可以存储立体信息,依次类推可以合理地使用更高维数的数组。C语言中对多维数组概念的解释是:n维数组是每个元素均为n-1维数组的一维数组。由此可以推论出C程序中的二维数组是由若干个一维数组作为数

12、组元素的一维数组,三维数组则是由若干个二维数组作为元素的一维数组等等,多维数组的这种概念对理解多维数组的存储、处理都有很大的帮助。,3.2.1 二维数组和多维数组的定义,二维数组定义的一般形式为:数据类型符 数组名常量表达式常量表达式;多维数组定义的一般形式为:数据类型符 数组名常量表达式常量表达式;例如,int a34,matrix1010;就定义了两个整型的二维数组a和matrix,其中a由3行4列共12个元素构成;matrix由1010共100个元素组成。而float b333;则定义了一个333共27个元素构成的数组b。,3.2.1 二维数组和多维数组的定义,C语言中规定数组按“行”存

13、储,由于计算机系统内存是一个线性排列的存储单元集合,所以当需要将二维或者更多维的数组存放到系统存储器中时,必须进行二维空间或多维空间向一维空间的投影。例如有定义语句:int a122,a2222;,则数组a1和a2在内存中存放的形式如图3.4和3.5所示。,3.2.1 二维数组和多维数组的定义,根据多维数组在存储器中按行存储的规则和多维数组的行列顺序可以计算出多维数组元素存储时在线性连续存储单元中的排列序号。设有mn(m行n列)二维数组a,则二维数组元素aij在数组的连续存储区域中的单元序号计算公式为:in+j;(行号列数+列号)例如有二维数组定义int a55;,则数组中的元素a23在线性存

14、储区域中的序号为:25+3=13,即将二维数组投影为一维数组存储后,二维空间中的2行3列元素是一维空间中的13号元素。设有mnl(m页n 行l列)三维数组a,则三维数组元素aijk在数组的连续存储区域中的单元序号计算公式为:inl+jl+k;(页号行数列数+行号列数+列号),3.2.1 二维数组和多维数组的定义,二维和多维数组也可以进行初始化,以二维数组和三维数组为例,初始化的方式有两种:分行赋值初始化方式二维(多维)数组分行初始化方式是将二维(多维)数组分解为若干个一维数组,然后依次向这些一维数组赋初值,赋值时使用大括号(花括号)嵌套的方法区分每一个一维数组,例如:int a23=1,1,1

15、,2,2,2;int a1233=1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,6,6,6;单行赋值初始化方式二维(多维)数组单行初始化方式是使用一个数据序列为多维数组赋初值。使用这种方式时将所有的初始化数据依次写在一个大括号中,书写时要注意数据应该的排列顺序。例如:int a23=1,1,1,2,2,2;int a1234=1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,6,6,6,6;,3.2.1 二维数组和多维数组的定义,对于二维数组或多维数组的初始化,还需要注意以下几点:初始化只给出部分数组元素的初始值。这种方法称为部分初始化,此时未初始化

16、元素值为0(字符类为0)。例如,int a23=1,1,2,2;,则初始化后二维数组a的取值形式如图3.6所示。例如,int arr23=1,1,2,2;,则初始化后二维数组a的取值形式如图3.7所示,读者应该特别注意上面两个初始化示例以及图3.6与图3.7的区别。,3.2.1 二维数组和多维数组的定义,同样,如果需要将二维数组或多维数组的所有元素值置初始为0,可按如下所示的部分初始化形式即可:int b1020=0;/*将b数组的200个元素初始化为0值*/int c10010050=0;/*将数组c的50万个元素初始化为0值*/数组的长度可以由初始化元素值的个数确定。初始化时,如果多维数组

17、最高维的长度没有指定,则系统通过对初始化序列中数值的个数的统计计算来确定多维数组最高维的长度,或者说如果在初始化时给出了全部的数组元素初始值,可以不指定多维数组最高维的长度。但需要特别提醒的是,如果仅定义数组没有初始化则必须指定数组的长度。例如,int a3=1,1,1,2,2,2;例如,int a13=1,1,1,2,2,2;多维数组初始化数值的个数不能大于指定的数组各个长度。例如下面多维数组初始化形式是错误的:int a123=1,1,1,2,2,2,3,3,3;/*初始化表中的数值个数太多*/,3.2.2 二维数组和多维数组元素引用方法,二维和多维数组在程序设计中也不能作为一个整体进行处

18、理,而只能通过处理每一个下标变量(数组元素)达到处理数组的目的。二维数组和多维数组元素的下标表示分别为:数组名下标下标;和 数组名下标下标;其中,下标值应该是整型常数或表达式,该值表示了数组元素(下标变量)在多维数组中的位置,如果下标值是实型数据系统会自动将其取整。数组的下标变量和普通变量的用法是相同,凡是普通变量可以出现的地方,下标变量也可以出现。例如有定义:double a55,y;,则该语句同时定义了26个实型变量,只不过前面25个a00a44属于某一个集体,而 y则是一单个普通变量。double a55,y;a23=300;/*将a数组中2行3列元素赋值为300*/y=500;/*将变

19、量y赋值为500*/,3.2.2 二维数组和多维数组元素引用方法,对于二维数组的输入输出一般使用二重循环,同理可以使用多重循环处理多维数组的输入输出问题。设有定义语句:int a510,i,j;,则数组a的输入输出基本形式如图3.8 所示。,3.2.2 二维数组和多维数组元素引用方法,例3-5 在二维数组a34中依次选出各行最大元素值存入一维数组b3对应元素中。程序运行结果:array a:3 16 87 65 4 32 11 108 10 25 12 27array b:87 108 27,3.2.2 二维数组和多维数组元素引用方法,例3-6 编程序输出魔方阵。所谓魔方阵是指一个由整数构成的

20、奇数矩阵中,任意一行、任意一列以及对角线的所有数之和均相等。例如,一个三阶的魔方阵如图3.9所示。n阶的自然数构成的魔方阵中各数的排列规律:(1)将“1”放在魔方阵的第一行中间一列;(2)从“2”开始直到n*n的各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1、列数加1;(3)如果上一个数的行数为1,下一个数的行数为n;如果上一个数的列数为n,下一个数的列数为1;(4)如果按上面规则确定的位置上有数(不为零),或者上一个数是第1行第n列时,则把下一个数放在上一个数的下面。,数组及其应用,3.1 一维数组3.1.1 一维数组的定义和初始化3.1.2 一维数组元素的引用方法3.2 二维

21、数组和多维数组3.2.1 二维数组和多维数组的定义3.2.2 二维数组和多维数组元素引用方法3.3 数组的简单应用3.3.1 数组元素值的随机生成3.3.2 常用排序方法3.3.3 常用查找方法,3.3.1 数组元素值的随机生成,为了能够在学习程序设计的过程中深刻体会被处理数据的多样性和不可预见性,有必要用某种方法来模拟所处理的数据。让计算机自动生成“随机数”就是一种比较好的模拟数据方法。为了能够在程序中产生随机生成的数据,需要使用C语言提供的srand、rand和time等3个标准库函数。Srand函数的功能是初始化随机数发生器,函数原型在头文件stdlib.h中声明,其原型为:void s

22、rand(unsigned int seed);rand函数的功能是随机产生一个在0到RAND_MAX(0 x7fff)之间的一个正整数,函数的原型在头文件stdlib.h中声明如下所示:int rand(void);,3.3.1 数组元素值的随机生成,time函数的功能是获取系统时间,函数原型在头文件time.h中声明,其原型为:time_t time(time_t*timer);其中的数据类型time_t是一个系统定义好的一个长整型数据类型,其变量用于存放从系统中取出的以秒为单位的整型数据,参数time_t*timer 表示用timer数据对象保存取出的时间值,调用时用空(NULL)作为参

23、数(即调用形式为:time(NULL))则表示只需要用其返回的长整数值而不需要保存该值。下面通过两个示例讨论随机生成一维数组和二维数组元素值的问题。,3.3.1 数组元素值的随机生成,例3-7 随机生成20个3位以内的整数序列存放在一维数组中,然后按每行5个数输出所有数组元素。程序一次运行结果为:659 100 184 135 876348 934 293 587 338179 243 523 799 653234 657 439 776 297 例3-8 编程序实现如图3.10形式的矩阵转置功能,即将NM矩阵转换为MN矩阵;要求被处理的二维数组元素值(2位数以内)随机产生。,数组的常用排序方

24、法,排序是用计算机处理数据的一种常见的重要操作,其作用是将数组中的数据按照特定顺序,如升序或降序重新排列组织。排序分为内部排序和外部排序。在进行内部排序时,要求被处理的数据全部进入计算机系统的内(主)存储器,整个排序过程都在计算机系统的内存储器中完成。针对不同的实际应用,数据排序方法有很多种。本节介绍几种基本的内部排序思想,帮助读者初步理解排序方法的计算机解决思路。,数组的常用排序方法,1冒泡排序(Bubble sorting)冒泡排序算法的基本思想是两两比较待排序数据序列中的数据,根据比较结果来对换这两个数据在序列中的位置。其算法基本概念可描述如下:从待排序列中第一个位置开始,依次比较相邻两

25、个位置上的数据,若是逆序则交换,一趟扫描后,最大(或最小)的数据被交换到了最右边。不考虑已排好序的数据,将剩下的数据作为待排序列。重复、两步直到排序完成,n个记录的排序最多进行n-1趟。,数组的常用排序方法,例3-9 编程序实现冒泡排序算法,对随机生成的20个整数按升序进行排序并输出。上面程序中用变量flag作为标志,每一趟排序开始时将其设置为0,当本趟排序过程中有数据交换时将flag设置为1,表示数据还没有排序完成;当本趟排序过程中没有一次数据交换时,flag保持为0值,表示被排序的数据已经完全满足排序的要求,没有必要再继续进行以后的排序过程,程序中用break语句退出排序循环。程序的一次执

26、行结果为:Before sorting.293 31 365 849 867 166 487 826 487 775331 630 294 5 242 136 953 123 849 65After sorting.5 31 65 123 136 166 242 293 294 331365 487 487 630 775 826 849 849 867 953,数组的常用排序方法,2选择排序(Select sorting)选择排序法的基本思想是对于待排的n个数据,在其中寻找最大(或最小)的数值,并将其移动到的最前面作为其第一个数据;在剩下的N-1个数据中用相同的方法寻找最大(或最小)的数值,

27、并将其作为第二个数据;以此类推,直到将整个待排数据集合处理完为止(只剩下一个待处理数据)。选择排序的基本方法是:在所有的记录中选取关键字值最大(或最小)的记录,并将其与第一个记录交换位置。将上次操作完成后剩下的记录中构成一个新处理数据集。在新处理数据集的所有记录中选取关键字值最大(或最小)的记录,并将其与新处理数据集中第一个记录交换位置。如果还有待处理记录,转到。,数组的常用排序方法,例3-10 编程序实现选择排序算法,对随机生成的20个整数按升序进行排序并输出。程序的一次运行结果为:Before sorting.341 74 545 498 809 626 913 433 567 56013

28、0 479 505 95 96 143 851 634 830 665After sorting.74 95 96 130 143 341 433 479 498 505545 560 567 626 634 665 809 830 851 913,3.3.3 数组的常用查找方法,查找也称为检索,其基本概念就是在一个记录的集合中找出符合某种条件的记录。查找的结果有两种:在表中如果找到了与给定的关键字值相符合的记录,称为成功的查找,根据需要可以获取所找记录的数据信息或给出记录的位置。若在表中找不到与给定关键字值相符合的记录,则称为不成功的查找,给出提示信息或空位置指针。本节介绍最常用的两种查找方

29、法:顺序查找和折半查找。,3.3.3 数组的常用查找方法,1顺序查找(Linear search)顺序查找又称为线性查找。其基本过程是:从待查表中的第一个记录开始,将给定的关键字值与表中每一个记录的关键字值逐个进行比较。如果找到相符合的记录时,查找成功,如果查找到标得末端都未找到相符合的记录时,查找失败。顺序查找法适应于被查找集合无序的场合。例3-11 编程序实现顺序查找算法,在随机生成的20个整数中查找指定值,要求程序能够显示出查找进行比较的次数以及本次查找成功与否。程序的一次运行结果为:请输入被查找的整数值:43被查找数据集合如下.15 5 70 43 64 17 10 4 58 9639

30、 51 5 51 67 0 49 56 12 12查找43成功,共进行了4次比较。,3.3.3 数组的常用查找方法,2折半查找(Binary search)折半查找法又称为二分查找法,该算法要求在一个对查找关键字而言有序的数据序列上进行,其基本思想是:逐步缩小查找目标可能存在的范围,具体描述如下:选取表中中间位置的记录作为基准,将表分为两个子表。当基准记录的关键字值与查找的关键字值相符合时,返回基准记录位置,算法结束。当基准记录的关键字值与查找的关键字值不符合时,在处理的两个子表中选取一个子表,重复执行、,直到被处理的子表中没有记录为止。图3.11示意的是在一有序序列中实现对key=21进行折半查找的过程。,3.3.3 数组的常用查找方法,例3-12 编程序实现折半查找算法,在随机生成的20个整数中查找指定值,要求程序能够显示出查找进行比较的次数以及本次查找成功与否。程序中首先输出随机产生、未经排序的查找数据集合,执行结果中用数组元素形式显示出来的是排序后与查找关键字key值相同的元素。程序的一次执行结果如下所示:下面是未排序的查找数据集合.41 28 91 83 86 62 96 93 41 5779 47 12 94 36 34 56 36 2 97请输入被查找的关键字值:91查找a15成功,共进行了4次比较。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号