第6章 数组2019年5月(第13_14_15周).ppt

上传人:安*** 文档编号:64391529 上传时间:2022-11-29 格式:PPT 页数:130 大小:2.76MB
返回 下载 相关 举报
第6章 数组2019年5月(第13_14_15周).ppt_第1页
第1页 / 共130页
第6章 数组2019年5月(第13_14_15周).ppt_第2页
第2页 / 共130页
点击查看更多>>
资源描述

《第6章 数组2019年5月(第13_14_15周).ppt》由会员分享,可在线阅读,更多相关《第6章 数组2019年5月(第13_14_15周).ppt(130页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、第6章 数组 数组的引人数组的引人6.1 一维数组一维数组6.2 二维数组二维数组6.3 字符数组字符数组6.4 数组作为函数参数数组作为函数参数1数组的引入数组的引入l输入一个班级学习输入一个班级学习C C语言的学生的成绩语言的学生的成绩 (假如这个班级共有6名学生学习了C语言)。l分别统计优、良、中、及格和不及格五个等级分别统计优、良、中、及格和不及格五个等级的人数并计算高于平均成绩的人数的人数并计算高于平均成绩的人数l最后输出成绩清单。最后输出成绩清单。2例例 子:子:编写一个程序,实现下列功能:编写一个程序,实现下列功能:编程分析:n为保存6名学生的C语言成绩,需定义6个float型的

2、变量,变量定义如下:float stud1,stud2,stud3,stud4,stud5,stud6;n为输入这6个学生的成绩,编程如下:scanf(“%f%f%f%f%f%f”,&stud1,&stud2,&stud3,&stud4,&stud5,&stud6);3n如何统计优良中差各等级人数和计算平均成绩呢如何统计优良中差各等级人数和计算平均成绩呢?必须针对每一名学生,都写一段程序来完成优、良、中、差各等级的判定功能,先对stud1stud1变量判定,编编程思路如下程思路如下:4 if(stud1=90.0)优秀人数优秀人数+;else if(stud1=80.0)良好人数良好人数+;e

3、lse if(stud1=70.0)中等人数中等人数+;else if(stud1=60.0)及格人数及格人数+;else 不及格人数不及格人数+;5n如果学生人数从如果学生人数从6增加到增加到80或者甚至增加到或者甚至增加到1000,需要怎样写如此多的需要怎样写如此多的重复代码?!重复代码?!n然后对stud2,stud3,stud4,stud5,stud6变量重复上面相同的判定程序,显然程序代码将十分冗长而且容易出错。使用数组来帮忙!使用数组来帮忙!6u 什么是一维数组?如何使用?什么是一维数组?如何使用?u 什么是什么是二二维数组?维数组?如何使用?如何使用?u 字符数组的使用及常用的字

4、符处理函数。字符数组的使用及常用的字符处理函数。u 数组如何作为函数的参数使用?数组如何作为函数的参数使用?n数组是具有相同的数据类型具有相同的数据类型且按一定顺序排列的若干对象若干对象的集合体集合体,并用一个名字命名。存储在内存的一段连续区域。n组成数组的对象称为数组元素数组元素,使用统一的数组名统一的数组名和下标下标来唯一地确定数组中的元素。如array3等;例如:一个班级学生的某门课程的成绩,一行字符,一个整例如:一个班级学生的某门课程的成绩,一行字符,一个整数向量,由向量组成的矩阵等。数向量,由向量组成的矩阵等。什么是数组?什么是数组?6.1 一维数组一维数组6.1.1 一维数组的定义

5、一维数组的定义6.1.2 一维数组的初始化一维数组的初始化6.1.3 一维数组元素的引用一维数组元素的引用6.1.4 一维数组的应用一维数组的应用76.1.1 一维数组的定义一维数组的定义8n定义:定义:类型标识符类型标识符 数组名数组名整型常量表达式整型常量表达式;数组属于数组属于自己定义类型,所以使用前需要类定义类型,所以使用前需要类型声明,声明数组时应该包含下面几方面:型声明,声明数组时应该包含下面几方面:u数组的名字。数组的名字。u数组元素的类型。数组元素的类型。u数组的结构数组的结构(维数、每维大小维数、每维大小)。9 针对前例编程需要,可以如下定义一个数组:针对前例编程需要,可以如

6、下定义一个数组:float stud6;u定义了数组定义了数组stud,共有,共有6个元素个元素。u6 个元素都是个元素都是float型变量型变量。u如果需要处理如果需要处理100个学生的个学生的C语言的成绩,则语言的成绩,则定义如下:定义如下:float s100;说明101.数组名数组名:命名规则遵循标识符标识符命名规则。2.类类型型标标识识符符:指明该数组中所所有有元元素素的的数数据据类类型型(char、int、float、double等基本数据类型)。3.常常量量表表达达式式:指定数组中元素的个数,即数数组组的的大大小小(长度)。必须为大于或等于1的整整数数(整型常量、符号常量或整型常

7、量表达式,不能含变量,也不能为浮点型的常量不能含变量,也不能为浮点型的常量)。例如:例如:int m=8,xm;/*数组的大小不能用变量的值指定,所以这是不合法不合法的*/#define NUMBER 80 float scoreNUMBER;/用符号常量 /*数组的大小可用符合常量,所以这是合法合法的*/114.允许在同一数据类型的变量定义中,定义允许在同一数据类型的变量定义中,定义多个变量和多个多个变量和多个数组数组。分析:分析:定义了一个名为string 的数组,因为字符常量2的ASCII值为50,所以string 数组共有50个元素定义了一个名为a 的数组,共有20个元素,每个元素的类

8、型是整型。例如:int i,j,a5,b10;还可以按如下形式定义一维数组:float string2;int a5*2+10;6.1.2 一维数组的初始化一维数组的初始化12l数组元素在内存中顺序、连续存储,并占据一段连续连续的存储单元的存储单元,逻辑上相邻的元素在内存中也是相邻相邻的。说明说明l在数组定义的同时定义的同时对数组元素赋值赋值,称之为数组初始数组初始化化。l格式如下:类型类型 数组名数组名 常量表达式常量表达式=表达式表达式1,表达式,表达式n;l初始值初始值通过括在一对花括号花括号中的数据序列提供。数组初始化的各种形式数组初始化的各种形式 13例如:例如:double f4;

9、该数组有4个元素;分配给数组f相邻的连续内存空间:即共48个个字节变量f0f0的地址作为整个数组的首地址首地址,数组名f f中也存放了数组的首地址。下面两个下面两个printf语句输出相同的结果。语句输出相同的结果。printf(“%f”,&f0);printf(“%f”,f);下标下标元素名元素名f1f2f3f0 1 2 3 0一维数组在内存中的存放一维数组在内存中的存放l每个元素占用的字每个元素占用的字节数,就是节数,就是基类型基类型的的字节数字节数l一个元素占一个元素占4 4个个字节字节一维数组:一维数组:floatfloat markmark100;100;mark0mark1mark

10、2mark3.mark9986.592.077.552.0.94.0低地址低地址 高地址高地址 C 语言中的数组结论语言中的数组结论Rate1.523.200.2945.393210 float Rate 4 数组名数组名下标下标标明了元素在标明了元素在数组中的数组中的位置位置 数组元素数组元素下标下标数组大小数组大小数组数组是可以在内存中连续存储连续存储多个元素的结构数组中的所有元素必须属于相同的数据类型相同的数据类型Bn给给全部元素全部元素赋初值赋初值 例例:int a8=0,1,2,3,4,5,6,7;定义数组时将各元素的初值顺序放在一对花括号一对花括号内,数据间用逗号分隔逗号分隔。a0

11、a1a2a3a4a5a6a701234567a0a1a2a3a4a5a6a701234000若初始数据个数若初始数据个数 数组长度数组长度,编译出错编译出错。n给给部分元素部分元素赋初值赋初值 例例:int a8=0,1,2,3,4;剩下的元素的剩下的元素的初值是初值是0n全部元素赋初值时可以可以不指定不指定数组的数组的长度长度 例例:int a =0,1,2,3,4,5,6,7;数组的长度就是初值表中数组的长度就是初值表中数值的个数数值的个数a0a1a2a3a4a5a6a701234567l注意注意:如果数组长度与初始数据个数不相等,在定义数组时不能省略不能省略数组长度。若想定义数组长度为长

12、度为10,而只有而只有5个数据个数据 写成:int x =1,2,3,4,5;10n当对当对全部数组元素初始化为全部数组元素初始化为 0 时时,可以写成可以写成:int x5=0,0,0,0,0;或或:int x5=0;8n初值表不能为空初值表不能为空inta5=;int a5=1,i;for(i=0;i5;i+)printf(“%d”,ai);int a5,i;for(i=0;i5;i+)printf(“%d”,ai);1 0 0 0 0 872 0 1492 4160 186不可预知不可预知,(乱码)(乱码)n没有初始化的数组没有初始化的数组,其元素的其元素的值不确定值不确定。数组初始化常

13、见错误数组初始化常见错误 数组初始化时初始值个数不能大于元素个数数组初始化时初始值个数不能大于元素个数 例如:int a3=1,2,3,4;系统报告错误如下:初始化的值太多。不能直接给数组名赋值,因为数组名是一个地址常量不能直接给数组名赋值,因为数组名是一个地址常量 例如:int b3;b=1,2,3;系统报告错误如下:赋值运算符的左边不能是常量 如果要给一个数组中的全部元素初始化为如果要给一个数组中的全部元素初始化为0,不可以,不可以 写成:写成:int a5=0*5;19“初值列表初值列表”的方式只限于数组的初始化,的方式只限于数组的初始化,不能不能出现在赋值语句中出现在赋值语句中 例如:

14、例如:int c4;c4=1,2,3,4;/错误错误 两个数组不能直接进行赋值运算,但数组元素可以两个数组不能直接进行赋值运算,但数组元素可以 例如:例如:int a4=5,6,7,8;int b4;b=a;/错误 如果希望将 a数组中的数据送给b数组,可以 使用如下代码:for(i=0;i4;i+)bi=ai;20B6.1.3 一维数组元素的引用一维数组元素的引用21 当当定定义义好好数数组组后后,数数组组中中的的每每个个元元素素的的名名称称分分别别是什么呢?是什么呢?uC语语言言规规定定:通过数数组组名名加元素下下标标的方式来使用数组元素。引用方式为:数组名数组名 下标下标 u下标下标:数

15、组元素在内存中排列顺序的编号编号。u下下标标取取值值:下标从0 0开始,直到“数数组组元元素素个个数数-1-1”为止。u数组元素相当于一个相应类型的变量。注注意意:下标是整型表达式,可以是变变量量或常常量量表表达达式式,但必须保证下标值在【0 0,数组元素个数,数组元素个数-1-1】范围内。数组元素的举例数组元素的举例22 例如例如:int a5;说明说明:a数组有5个元素:a0、a1、a2、a3、a4,下标分别为:0、1、2、3、4注意注意:a 数组没有名为数组没有名为 a5 这样的元素!这样的元素!数组a 有下图所示的逻辑结构。l 引用数组元素的一般形式如下:引用数组元素的一般形式如下:数

16、组名数组名 下标下标 例例6.1 定义一个一维数组,对数组元素依次赋值为定义一个一维数组,对数组元素依次赋值为0,1,2,3,4,5,6,7,8,9。在控制台分别以在控制台分别以正序、逆序正序、逆序输出数组的所有元素。输出数组的所有元素。n算法描述算法描述l由于数组元素值为整型,共10 个,所以定义一个长度为10 的一维整型数组,同时初始化数组元素。l由于值比较有规律,也可以使用for 循环给数组的每一个元素单独赋值。l输出数组元素可用循环结构循环结构,正序按下标09 的顺序输出,逆序按下标90 的顺序输出。程序代码:程序代码:#include int main()int i;int a10=

17、0,1,2,3,4,5,6,7,8,9;/数组初始化数组初始化 printf(正序输出数组元素n);for(i=0;i=0;i)/使用使用for 循环循环逆序逆序输出数组元素输出数组元素 printf(%d,ai);printf(n);/换行换行 return 0;对数组a 各元素赋值可用循环结构循环结构:int a10;/定义数组for(i=0;i=9;i+)/for 循环为数组元素赋值 ai=i;/对数组元素赋值访问数组元素访问数组元素数组定义好后,当需要给数组元素输入数据,则应数组定义好后,当需要给数组元素输入数据,则应当当逐个访问逐个访问各个元素。例如:各个元素。例如:25#inclu

18、de int main()float stud6;/数组定义scanf(“%f”,&stud0);scanf(“%f”,&stud1);scanf(“%f”,&stud2);scanf(“%f”,&stud3);scanf(“%f”,&stud4);scanf(“%f”,&stud5);return 0;#include int main()float stud6;/数组定义int i;for(i=0;i6;i+)scanf(“%f”,&studi);return 0;循环用于数组时可大大循环用于数组时可大大简化简化程序的编写程序的编写6.1.4 一维数组的应用一维数组的应用26 一般例子一般

19、例子1.查找查找:(1)顺序查找法顺序查找法 (2)折半查找法折半查找法2.排序:排序:数据数据排序排序(按特定的顺序来安排数据按特定的顺序来安排数据)是最重要的计算应用之一是最重要的计算应用之一。常用方法:常用方法:(1)冒泡排序法冒泡排序法 (2)选择排序法选择排序法 其它例子其它例子l一维数组应用非常广泛,通常用一维数组存储若干个一维数组应用非常广泛,通常用一维数组存储若干个有序的有序的数据数据(元素元素),然后对这些数据进行处理,得到,然后对这些数据进行处理,得到新的数据集新的数据集。l数据处理中,数据处理中,查找或排序查找或排序是最常用的数据处理操作,方法很是最常用的数据处理操作,方

20、法很多,我们仅介绍最常用的查找和排序方法。多,我们仅介绍最常用的查找和排序方法。【例例1】统计数组中大于统计数组中大于0、等于、等于0和小于和小于0的元素个数的元素个数l 设数组为设数组为x,元素个数为,元素个数为n个个。引入大于0、等于0和小于0的计数器变量 great、equal 和 less。l关键:遍历所有数组元素(循环循环)great=equal=less=0;/计数器变量置初值0 for(i=0;i 0)great+;else if(xi=0)equal+;else less+;【例例2】输入输入5个整数,编程求出其中个整数,编程求出其中最大最大和和最小最小的整数并输出。的整数并输

21、出。编程步骤编程步骤:1.定义有 5 个元素的数组iArr,用for循环输入输入5个整数 2.处理:(a)给变量max和min赋初值初值:max=min=iArr 0(b)依次用iArri(下标i依次取值为1、2、3、4)和max,min比较比较:若若maxiArri,令令min=iArri;3.输出输出:max和min 分析:分析:1.假设数组假设数组iArr 中的中的5个元素分别是:个元素分别是:467-1214599 2.给变量给变量max和和min赋初值,使赋初值,使max和和min 的初值同为的初值同为4;29l第次用元素iArr1 的值67 分别和max、min 比较,因为67ma

22、x,所以max 变为67,min不变;l 第次用元素iArr2 的值-12 分别和max、min 比较,因为-12min,所以min变为 12,而max不变;l 依次进行第次和第次比较,最后得出:max 的值为145,min 的值为-12。3.用输出函数用输出函数printf 输出输出:max和和min#include#define SIZE 5int main()int iArr SIZE,max,min;int i;printf(Enter 5 integers:n);for(i=0;iSIZE;i+)/输入输入 printf(%d:,i+1);scanf(%d,&iArri);max=i

23、Arr0;min=iArr0;for(i=1;iSIZE;i+)/求解求解 if(maxiArri)min=iArri;printf(Maximum value is:%dn,max);printf(Minimum value is:%dn,min);return 0;30【例例3】输入输入1010个整数存入一维数组中,找出其个整数存入一维数组中,找出其中的中的最大值最大值并指明是数组中的并指明是数组中的第几个元素第几个元素。#include int main()int a10,max,m,i;printf(input 10 numbers:n);for(i=0;i10;i+)/输入输入 sc

24、anf(%d,&ai);max=a0;m=0;for(i=1;imax)max=ai;m=i;printf(the max number:n);printf(max=%d,m=%d n,max,m+1);return 0;【例例4】用数组求用数组求Fibonacci数列前数列前20个数个数#include int main()int i;long f20=1,1;/初始值 for(i=2;i20;i+)fi=fi-2+fi-1;/生成数据 for(i=0;i20;i+)/输出数据 if(i%5=0)printf(n);printf(%12ld,fi);return 0;(1)顺序查找法33在数

25、组中查找值为在数组中查找值为key的元素,有多种解法。顺序查找法是的元素,有多种解法。顺序查找法是一种一种最原始的方法最原始的方法,它是逐个数据进行比较的穷举查找方,它是逐个数据进行比较的穷举查找方法。法。n 顺序查找:顺序查找:从第从第1个元素开始,顺序查找到数组末尾。个元素开始,顺序查找到数组末尾。for(i=0;i n;i+)if(key=ai)break;/找到终止循环找到终止循环/*如果找到,有如果找到,有in;如果数组中没有;如果数组中没有key,有有 i=n*/或:或:for(i=0;i n&key!=ai;i+);/*当当 i=n 或找到,结束循环或找到,结束循环*/顺序查找的

26、平均次数为:顺序查找的平均次数为:(n+1)/2(n+1)/2例例 6.2 有一组有一组19 个数的数列:个数的数列:3,6,9,12,15,17,19,20,23,26,28,29,31,34,37,42,45,48,50,使用顺序查找法查找某个数是否在数列中。,使用顺序查找法查找某个数是否在数列中。p算法描述算法描述l19 个数的数列都是整数,可以定义一个一维整型数组一维整型数组,数组长度为19。l使用数组存储这个有序数列,使每一个数组元素存储有序数列中的一个数值。l查找数据时,从控制台输入一个整数输入一个整数,使用循环结构循环结构逐个引用数组元素,依次判断数组元素是否与输入的整数相等,如

27、果找到相等数据,则给出成功提示信息并退出循环;否则给出错误提示信息。程序代码:程序代码:#include#include int main()int i,x;int a19=3,6,9,12,15,17,19,20,23,26,28,29,31,34,37,42,45,48,50;printf(请输入要找的元素:);scanf(%d,&x);for(i=0;i am 下一轮的查找区间为下一轮的查找区间为 m+1,j。key am 下一轮的查找区间为下一轮的查找区间为 i,m-1。直至直至ji 时,区间时,区间i,j变为一个空区间,即表变为一个空区间,即表示在数组示在数组a中没有值为中没有值为

28、key 的元素。的元素。u要求要求:数组:数组a已按一定次序(升序或降序)排列好。已按一定次序(升序或降序)排列好。u思想思想:每次取:每次取中间一个元素中间一个元素 m=(i+j)/2 与与 key 进行比较,进行比较,有三种可能结果,分别采取不同的对策:有三种可能结果,分别采取不同的对策:说明:说明:1.初始查找的区间为初始查找的区间为i=0,j=n-1。2.每轮查找后,查找范围缩小一半每轮查找后,查找范围缩小一半 int i=0,j=n-1;/*设定初始查找区间设定初始查找区间*/while(i am)i=m+1;else j=m-1;/*找到时,找到时,i j*/折半查找法折半查找法查

29、找部分程序查找部分程序例例 6.3 有一组有一组19 个数的有序数列:个数的有序数列:3,6,9,12,15,17,19,20,23,26,28,29,31,34,37,42,45,48,50,使用折半查找法查找某个数是否在数列中。,使用折半查找法查找某个数是否在数列中。n算法分析算法分析l数列用一维整型数组数列用一维整型数组a表示,数组长度为表示,数组长度为19。l使用折半查找法时先找出使用折半查找法时先找出中间数中间数,再比较。,再比较。l在数组中可以根据数组下标在数组中可以根据数组下标计算出中间数的计算出中间数的下标下标,然后根据下标读取数组元素的值。,然后根据下标读取数组元素的值。p算

30、法设计:算法设计:图图6.3 折半查找流程折半查找流程程序代码:程序代码:#include#include int main()int a19=3,6,9,12,15,17,19,20,23,26,28,29,31,34,37,42,45,48,50;int mid,top,bot,x;top=0;bot=18;printf(请输入要找的元素:);scanf(%d,&x);while(topamid)top=mid+1;else bot=mid1;printf(没有找到该元素!n);return 0;p程序分析:程序分析:lwhile 语句每循环一次,都执行一次折半查找,语句每循环一次,都执行

31、一次折半查找,通过与中间值比较大小,确定新的查找范围,使通过与中间值比较大小,确定新的查找范围,使查找范围减半,直到找到数据或者未找到数据。查找范围减半,直到找到数据或者未找到数据。l采用折半查找法采用折半查找法效率比较高效率比较高,但是需要提前将数,但是需要提前将数据按一定规律(升序或者降序)排列好存储在数据按一定规律(升序或者降序)排列好存储在数组中。如果数据没有提前排序,则需要使用相应组中。如果数据没有提前排序,则需要使用相应排序算法对数组中的数据进行排序,然后再查找排序算法对数组中的数据进行排序,然后再查找相应数据。相应数据。(1)冒泡排序法43 冒泡法冒泡法(也叫起泡法也叫起泡法)排

32、序的思路是排序的思路是:1)比较第一个数与第二个数,若为逆序比较第一个数与第二个数,若为逆序a0a1a0a1则交换;然则交换;然后比较第二个数与第三个数;依次类推,直至第后比较第二个数与第三个数;依次类推,直至第n-1n-1个数和个数和第第n n个数比较为止个数比较为止第一趟冒泡排序第一趟冒泡排序,结果,结果最大的数最大的数放到放到最后最后一个元素位置一个元素位置。2)对前对前n-1n-1个数进行个数进行第二趟冒泡排序第二趟冒泡排序,结果使,结果使次大的数被安次大的数被安置在第置在第n-1n-1个元素位置个元素位置3)重复上述过程,共经过重复上述过程,共经过n-1n-1趟冒泡排序趟冒泡排序后,

33、排序结束后,排序结束有有n n个数个数,要进行要进行(n-1)(n-1)轮比较轮比较,第第i i轮比较轮比较(n-i)(n-i)次次n 例例6.4 使用使用冒泡排序法冒泡排序法对对5个数据进行排序。个数据进行排序。n 算法描述:图算法描述:图6.4是对是对5个数据进行冒泡排序的过程个数据进行冒泡排序的过程图图6.4 冒泡排序过程冒泡排序过程 137697653849原数原数137697653849第一轮第一轮1376659738491376653897491376653849971376653849971365763849971365387649971365384976971365384976

34、97第二轮第二轮第三轮第三轮133849657697133865497697133849657697133849657697第四轮第四轮第五轮第五轮4938i小数小数大数大数j将相邻两个数进行比较将相邻两个数进行比较,使小数在前使小数在前,大数在后。大数在后。a aj jaaj+1j+1时时,保持保持原样原样;a aj ja aj+1j+1时时,进行进行交换交换,保证保证a aj j为较小的数为较小的数。N-1 趟趟编写程序编写程序:#include#define N 5/定义符号常量,代表数组长度int main()int aN=9,8,3,5,2;int i,j,t;for(j=0;j=N

35、-2;j+)/冒泡排序,比较的轮数轮数 for(i=0;iai+1)/比较,前大后小则交换 t=ai;ai=ai+1;ai+1=t;printf(排序结果:n);for(i=0;i=N-1;i+)printf(%3d,ai);printf(n);return 0;#include /n个数据的排序算法个数据的排序算法void main()int i,j,temp,n,a100;printf(input n=100:);scanf(%d,&n);for(i=0;in;i+)/输入数据 printf(input a%d=,i+1);scanf(%d,&ai);for(i=0;i n-1;i+)/*

36、趟数是从0开始编号的*/for(j=0;jaj+1)/*aj与aj+1 交换*/temp=aj;aj=aj+1;aj+1=temp;for(i=0;iai+1,每经过一轮比较和交换,都能,每经过一轮比较和交换,都能使一个较大的数据成为有序数列中的一个数据,数组中使一个较大的数据成为有序数列中的一个数据,数组中的数据最终将会是的数据最终将会是升序排列升序排列。l比较条件改为比较条件改为aiai+1,其它不变,每经过一轮比较,其它不变,每经过一轮比较和交换,都能使一个较小的数据成为有序数列中的一个和交换,都能使一个较小的数据成为有序数列中的一个数据,数组中的数据最终将会是数据,数组中的数据最终将会

37、是降序排列降序排列。(2)选择排序法49用选择排序,对用选择排序,对6 6个整数按由小到大进行排序个整数按由小到大进行排序选择排序的选择排序的思路思路:l第一次从数组的第一次从数组的6个元素中寻找个元素中寻找最大数及其下标最大数及其下标,然后将此数,然后将此数与下标为与下标为5的元素进行交换;如果求出的最大数正好是下标为的元素进行交换;如果求出的最大数正好是下标为5的元素,的元素,可以不进行交换可以不进行交换。l第二次在下标为第二次在下标为0、1、2、3、4 这五个元素中寻找最大的元素这五个元素中寻找最大的元素及其下标,并把此次找到的最大数和下标为及其下标,并把此次找到的最大数和下标为4 的元

38、素进行交换;的元素进行交换;l类似进行第三次、第四次和第五次查找和交换过程,最终实现类似进行第三次、第四次和第五次查找和交换过程,最终实现将将6 个整数按照由小到大进行排序。可以借鉴刚才求最大数的个整数按照由小到大进行排序。可以借鉴刚才求最大数的代码,来完成选择排序算法。代码,来完成选择排序算法。举例:举例:若有六个整数:49 38 65 97 2 13 算法过程如下:第一次,找出最大数97及其下标3,将此数与下标为5的元素13交换(排好序的元素放在小括号内);变化过程如下:第一次排序开始前:49 38 65 97 49 38 65 97 2 132 1350交换交换交换交换交换交换第二次第二

39、次,从剩下的剩下的5个数个数中找出最大数及其下标,将此数与下标为4的元素交换,变化过程如下:第二次排序开始前:第二次排序开始前:49 38 65 13 49 38 65 13 2 2 (9797)第一次排序结束后:49 38 65 13 49 38 65 13 2 2 (9797)第二次排序结束后第二次排序结束后:49 38 49 38 2 13 2 13 (65 9765 97)依次下去,直到只剩依次下去,直到只剩2 2个数时,将大数与其下标为个数时,将大数与其下标为1 1的元素的元素交换,即完成排序。交换,即完成排序。最后排序最后排序结结果果:(:(2 13 38 49 65 972 13

40、 38 49 65 97)显然,编程需要显然,编程需要两重循环两重循环来完成此算法,外部循环控制剩来完成此算法,外部循环控制剩下的数,内部循环实现从剩下的数中找出最大数及其下标下的数,内部循环实现从剩下的数中找出最大数及其下标5152#define NUMBER 6void main()int iArrNUMBER;int ind_Max;int i,j,temp;for(i=0;i=0;i-)/循环选择的次数循环选择的次数 ind_Max=i;/预设最大数的位置(下标)预设最大数的位置(下标)for(j=0;ji;j+)/找出最大数的下标找出最大数的下标 if(iMax iArrj)ind_

41、Max=j;if(ind_Max!=i)/条件成立则需要交换条件成立则需要交换 temp=iArri;iArri=iArrind_Max;iArrind_Max=temp;for(i=0;iap&pp;i-)ai=ai-1;ap=x;#include#defineN11voidmain()int aN=14,25,28,33,45,56,68,72,81,95;int i,x,p=0;printf(“pleaseinputx:”);scanf(“%d”,&x);while(xap&pp;i-)ai=ai-1;ap=x;for(i=0;iN;i+)printf(“%d ”,ai);printf(

42、“n”);“腾出位子腾出位子”,大数后移,大数后移找到插入点找到插入点插入数据插入数据【例例6】在一批数据中在一批数据中查找查找给定值的位置。给定值的位置。void main()int a10,i,num;for(i=0;i10;i+)/输入输入 scanf(%d,&ai);printf(“输入查找数字:n);scanf(%d,&num);for(i=0;i10;i+)/查找查找 if(ai=num)break;if(i=9)printf(“第%d个数n,i);else printf(no foundn);运行结果:运行结果:10 20 30 40 50 60 70 80 90 100输入查找

43、数字:80程序输出为:程序输出为:第7个数for(i=k+1;i n;i+)/ak开始至开始至an-1前移前移 ai-1=ai;n-;/数组的元素减小了一个数组的元素减小了一个【例例7】删除数组中一个元素删除数组中一个元素 a0 a1 ak ak+1 an-2 an-1n设数组设数组a a已有已有n n个元素,要求把个元素,要求把k k下标位置下标位置的元素从数组中的元素从数组中删去删去n为在为在k k下标位置删除元素,下标位置删除元素,必须将元素必须将元素ak+1ak+1至至an-1an-1分分别顺序前移一个位置。别顺序前移一个位置。最后,减少数组的元素个数。最后,减少数组的元素个数。数组的

44、基本概念总结 在语言中,数组类型是这样一种数据结构:在语言中,数组类型是这样一种数据结构:571.数数组组中中每每个个元元素素的的数数据据类类型型相相同同,每每个个元元素素对对应应一一个序号个序号(称为下标称为下标),元素按下标存取元素按下标存取2.数数组组元元素素的的存存储储顺顺序序与与其其下下标标对对应应,数数组组元元素素的的下下标标从从0开始顺序编号开始顺序编号。3.数数组组元元素素是是变变量量,其其值值是是可可以以变变化化的的。数组元素和相同类型的独立变量语法地位相同,只是变量名的格式不同。4.使使用用数数组组元元素素所所需需的的下下标标个个数数由由数数组组的的维维数数决决定定,数组有

45、一维数组、二维数组或多维数组之分。数组有一维数组、二维数组或多维数组之分。6.2 二维数组的定义与应用二维数组的定义与应用6.2.1 二维数组的定义二维数组的定义6.2.2 二维数组的初始化二维数组的初始化6.2.3 二维数组元素的引用二维数组元素的引用6.2.4 二维数组的应用二维数组的应用586.2.1 二维数组的定义二维数组的定义59l二维数组的定义方法与一维数组很相似,只是二维数二维数组的定义方法与一维数组很相似,只是二维数组有两个下标,定义二维数组的一般形式如下:组有两个下标,定义二维数组的一般形式如下:l二维数组可以被当作一个二维数组可以被当作一个特殊的一维数组特殊的一维数组 例如

46、例如int m23;可以看作有可以看作有2 2个数组元素个数组元素m0m0和和m1m1,它,它的每个元素都是一个大小为的每个元素都是一个大小为3 3的一维整型数组。的一维整型数组。类型说明符类型说明符 数组名数组名常量表达式常量表达式1 常量表达式常量表达式2例如:例如:int m23;注意:注意:不可将定义写为不可将定义写为 int a4,10。二维数组的元素看成为若干个特殊的一维数组。二维数组的元素看成为若干个特殊的一维数组。如如:int b3 4;可看成:可看成:有三个特殊的一维数组有三个特殊的一维数组b0,b1,b2,每一个又有四个元素每一个又有四个元素:b00,b01,b02,b03

47、,b10,b11,b12,b13,b20,b21,b22,b23,b0:b1:b2:二维数组的存放方式为二维数组的存放方式为:按行优先。按行优先。由此可推广至三维、由此可推广至三维、n n维数组的定义和存放。维数组的定义和存放。即即:最右边的下标变化最快。最右边的下标变化最快。u二维数组的元素是按二维数组的元素是按行顺行顺序序存放的存放的。如如:int a34;u二维数组的总字节数二维数组的总字节数:行数行数列数列数=元素个数元素个数u二维数组的总字节数二维数组的总字节数:行数行数列数列数类型字节数类型字节数总字节数总字节数a00a01a02a03a10a11a12a13a20a21a22a2

48、3数组数组a a行下标行下标列下标列下标1行行2行行3行行地址地址地址地址 值值值值 数组元素数组元素数组元素数组元素b00b00b01b01b02b02b10b10b11b11b12b12b20b20b21b21b22b223003000 0H H3003002 2H H3003004 4H H3003006 6H H3003008 8H H300300A AH H300300C CH H300300E EH H30301010H H例如:整型数组例如:整型数组 b33=1,2,3,4,5,6,7,8,9;1234567 78 89 91 1行行2 2行行3 3行行6.2.2 二维数组的初始

49、化二维数组的初始化初始化初始化:按按行行给二维数组赋初值给二维数组赋初值n 格式格式:类型符类型符 数组名数组名 表达式表达式1 1表达式表达式2 2=初值表初值表;n 三种方式三种方式:l 给给全部元素全部元素赋初值赋初值l 给给部分元素部分元素赋初值赋初值l 给给全部元素全部元素赋初值时赋初值时,不指定第一维不指定第一维的长度的长度,但要指定第二维的长度。但要指定第二维的长度。l给给全部元素全部元素赋初值赋初值(分行(分行/一起)一起)如如:int x24=1,2,3,4,6,7,8,9;或写成或写成:int x24=1,2,3,4,6,7,8,9;数组数组x中各元素的值为中各元素的值为:

50、用括号按行分组用括号按行分组x00 x01x02x031 234x10 x11x12x136789l给给部分元素部分元素赋初值赋初值(其它(其它0值)值)如如:int a34=1,2,3,4,5;123450 0 00 0 0 0l 可用分行赋值的方法对可用分行赋值的方法对某行中部分元素某行中部分元素赋初值赋初值如如:int a34=1,5,6;10 0 050 0 060 0 0没有明确初始化的元没有明确初始化的元素被自动初始化素被自动初始化0l 对对全部元素全部元素赋初值赋初值,可以不指定可以不指定第一维第一维的长度的长度,但要指定但要指定第第二维的长度。二维的长度。int a 3=10,

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

当前位置:首页 > 教育专区 > 教案示例

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com