1第5章数组C语言程序设计第2页琼州学院2020年1月19日2第5章数组本章重点介绍:一维数组二维数组字符数组与字符串第3页琼州学院2020年1月19日35.1概述1.用案例说明为什么使用数组【例5-1】设计一个程序,将n个人某门课程的成绩输入计算机,求平均成绩和高于平均成绩的人数。如果不使用数组,以5个人的成绩为例,使用a1、a2、a3、a4、a5来存放5个成绩,程序代码如下:第4页琼州学院2020年1月19日4程序代码:#includestdio.hvoidmain(){intn=0;floats,ave,a1,a2,a3,a4,a5;scanf(%f%f%f%f%f,&a1,&a2,&a3,&a4,&a5);s=a1+a2+a3+a4+a5;ave=s/5;if(a1ave)n++;if(a2ave)n++;if(a3ave)n++;if(a4ave)n++;if(a5ave)n++;printf(%f%d\n,ave,n);}如果要统计10个人的成绩呢?第5页琼州学院2020年1月19日5#includestdio.hvoidmain(){intn=0,i;floats=0,ave,a[10];for(i=0;i10;i++){scanf(%f,&a[i]);s=s+a[i];}ave=s/10;for(i=0;i10;i++)if(a[i]ave)n++;printf(平均成绩为:%.1f\n高于平均成绩的人数为:%d\n,ave,n);}使用数组来存储10个人的数据,用循环结构实现!程序代码如下:第6页琼州学院2020年1月19日65.1概述(续)2.数组与数组元素的概念数组:是用一个名字表示的一组相同类型的数据的集合,这个名字就称为数组名。如定义:floata[10];a是数组名。下标变量(或数组元素):数组中的数据分别存储在用下标区分的变量中,这些变量称为下标变量或数组元素。如:a[0]、a[1]…a[i]。每个下标变量相当于一个简单变量,数组的类型也就是该数组的下标变量的数据类型。数组属于构造类型。构造类型的数据是由基本类型数据按一定规则构成的。第7页琼州学院2020年1月19日75.2一维数组例如:inta[10];floatscore[5];“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。5.2.1一维数组的定义数据类型数组名[常量表达式];第8页琼州学院2020年1月19日8以下数组定义是正确的:#defineN10……floatscore1[N],score2[N];intnum[10+N];charc[26];以下数组定义是不正确的:intarray(10);intn;floatscore[n];charstr[];5.2.1一维数组的定义(续)第9页琼州学院2020年1月19日9数组在内存的存放数组下标从0开始。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址,即score的值与score[0]的地址值(&score[0])相同。score[0]score[1]score[2]score[3]score[4]91.534.567.572.084.0低地址高地址score数组第10页琼州学院2020年1月19日105.2.2一维数组元素的引用1.一维数组元素的表示形式例如:输入学生成绩for(i=0;i5;i++)scanf(%f,&score[i]);例如:n=3;fib[n]=fib[n-1]+fib[n-2];其中:“下标表达式”:只能是整型常量或整型表达式。数组名[下标表达式]第11页琼州学院2020年1月19日115.2.2数组元素的引用(续)2.说明①下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:inta[10],i;scanf(%d,&a[10]);/*下标越界*/C编译系统不做越界检查。第12页琼州学院2020年1月19日125.2.2数组元素的引用(续)②[]是下标运算符如:x=score[2];(1)计算score[2]地址:2000+2*4=2008(2)取出2008的内容(67.5)赋给x2000H2004H2008H200CH2010Hscore[0]score[1]score[2]score[3]score[4]91.534.567.572.084.0如果引用的数组元素超出数组范围会破坏其他变量的值。第13页琼州学院2020年1月19日135.2.3一维数组的初始化初始化:在定义数组时给数组元素赋初值。1.在定义数组时,对全部数组元素赋初值例如:inta[5]={0,1,2,3,4};此时可以省略数组长度,例如:inta[]={0,1,2,3,4};2.在定义数组时,对部分数组元素赋初值例如:inta[5]={1,2,3};系统为其余元素赋0。3.当初值的个数多于数组元素的个数时,编译出错例如:inta[5]={0,1,2,3,4,5};第14页琼州学院2020年1月19日145.2.4一维数组应用举例【例5-2】设计一个程序,将n个人某门课程的成绩输入计算机后输出最高分和最低分。思路:首先将n个人的成绩输入到一个一维数组中。求若干个数的最大值或最小值常采用打擂台的方法:首先指定某数为最大值或最小值的擂主:如:max=a(0),min=a(0)将其他各数依次与擂主进行比较(循环嵌套分支),当所有的数都比较完之后,输出max和min的值。第15页琼州学院2020年1月19日15程序如下:#includestdio.h#defineN5voidmain(){inta[N],max,min,i;for(i=0;iN;i++)scanf(%d,&a[i]);min=max=a[0];for(i=1;iN;i++)if(a[i]min)min=a[i];/*min存放最小值*/elseif(a[i]max)max=a[i];/*max存放最大值*/printf(最高分:%d最低分:%d,max,min);printf(\n);}程序运行情况如下:7898658245最高分:98最低分:45第16页琼州学院2020年1月19日165.2.4一维数组应用举例(续)【例5-3】将5个数存放到一维数组中,再将这5个数按逆序存放在同一数组中并输出。交换n/2次a[0]a[1]a[2]a[3]a[4]1357997531交换前交换后a[i]与a[n-1-i]交换第17页琼州学院2020年1月19日17程序如下:#defineN5#includestdio.hvoidmain(){inti,t,a[N];for(i=0;iN;i++)scanf(%d,&a[i]);for(i=0;iN/2;i++){t=a[i];a[i]=a[N-1-i];a[N-1-i]=t;}…'输出数据}程序运行情况如下:1113151719逆序存放后的结果是:1917151311第18页琼州学院2020年1月19日185.2.4一维数组应用举例(续)【例5-4】用冒泡法(也称起泡法)对输入的一组成绩按从低分到高分的顺序排序并输出。例如将6个数:4、7、5、6、8、1按从小到大顺序用冒泡法排序,方法如下:第一趟排序情况如下:475681第一次4和7比较,不交换475681第二次7和5比较,交换457681第三次7和6比较,交换456781第四次7和8比较,不交换456781第五次8和1比较,交换456718在第一趟排序中,6个数比较了5次,把6个数中的最大数8排在最后。第19页琼州学院2020年1月19日19冒泡法排序(续)第二趟排序情况如下:456718第一次4和5比较,不交换456718第二次5和6比较,不交换456718第三次6和7比较,不交换456718第四次7和1比较,交换456178在第二趟排序中,最大数8不用参加比较,其余的5个数比较了4次,把其中的最大数7排在最后,排出78。以此类推:第三趟比较3次,排出678第四趟比较2次,排出5678第五趟比较1次,排出45678最后还剩下1个数1,不需再比较,得到排序结果:145678第20页琼州学院2020年1月19日20冒泡法排序(续)从上述过程可以看到:n个数要比较n-1趟,而在第j趟比较中,要进行n-j次两两比较。冒泡法排序for(i=0;iN;i++)输入a[i]for(j=1;jN;j++)for(i=0;iN-j;i++)a[i]a[i+1]TFa[i]与a[i+1]交换输出a[0]~a[N-1]第21页琼州学院2020年1月19日21程序如下:#defineN6#includestdio.hvoidmain(){inta[N];inti,j,t;printf(请输入%d个成绩,用空格隔开:\n,N);for(i=0;iN;i++)scanf(%d,&a[i]);冒泡法排序(续)第22页琼州学院2020年1月19日22for(j=1;j=N-1;j++)for(i=0;iN-j;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(成绩从低分到高分的顺序是:\n);for(i=0;iN;i++)printf(%d,a[i]);printf(\n);}程序运行情况如下:请输入6个成绩,用空格隔开:785696837288成绩从低分到高分的顺序是:567278838896冒泡法排序(续)第23页琼州学院2020年1月19日23以6个数:3、7、5、6、8、0为例,介绍选择法排序方法。思路:第一趟:将第一个数(擂主)依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数(擂主)依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;……。【例5-5】用选择法对输入的一组成绩按从低分到高分的顺序排序并输出。5.2.4一维数组应用举例(续)第24页琼州学院2020年1月19日24【例5-5】选择法排序(续)选择法排序for(i=0;iN;i++)输入a[i]for(j=0;jN-1;j++)for(i=j+1;iN;i++)a[j]a[i]TFa[j]与a[i]交换输出a[0]~a[N-1]第25页琼州学院2020年1月19日25【例5-5】选择法排序(续)程序如下:#defineN6#includestdio.hvoidmain(){inta[N];inti,j,t;printf(请输入%d个成绩,用空格隔开:\n,N);for(i=0;iN;i++)scanf(%d,&a[i]);第26页琼州学院2020年1月19日26for(j=0;jN-1;j++)for(i=j+1;iN;i++)if(a[j]a[i]){t=a[j];a[j]=a[i];a[i]=t;}printf(成绩从低分到高分的顺序是:\n);for(i=0;iN;i++)printf(%d,a[i]);printf(\n);}程序运行情况如下:请输入6个成绩,用空格隔开:785696837288成绩从低分到高分的顺序是:567278838896【例5-5】选择法排序(续)第27页琼州学院2020年1月19日275.2.5一维数组作函数参数数组名作函数的实参,传递的是数组的首地址,此时形参也应定义为数组形式,但形参数组的长度可以省略。例如,在主函数中调用sort函数,实现将整型数组a中的10个数据排序,调用语句如下:sort(a,10);sort函数定义如下:voidsort(intb[],intn){…}第28页琼州学院2020年1月19日28voidsort(intb[],intn);voidprintarr(intb[]);main(){inta[10]={11,22,6