第6章 数组2019年5月(第13_14_15周).ppt
《第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 或找到,结束循环或找到,结束循环*/顺序查找的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第6章 数组2019年5月第13_14_15周 数组 2019 13 _14_15
限制150内