1第8章数组C语言程序设计2020/1/292第8章数组本章重点介绍:8.1一维数组8.2二维数组8.3字符数组2020/1/293输入30个数,然后将它们升序输出。思考:输入30个数,求其中的最大值。scanf(“%d”,&x);i=1;while(i30){if(maxx)max=x;scanf(“%d”,&x);i++;}x=?max=?2020/1/294输入30个数,然后将它们升序输出。2020/1/295第8章数组构造数据类型之一数组:相同数据的有序集合,用数组名标识,在内存中连续存放。数组元素:属同一数据类型,用数组名和下标唯一确定2020/1/296第8章数组2020/1/2978.1一维数组例如:inta[10];floatscore[5];“数据类型”:是数组元素的数据类型。“数组名”:遵循C语言标识符规则。“常量表达式”:表示数组中有多少个元素,即数组的长度。它可以是整型常量、整型常量表达式或符号常量。8.1.1一维数组的定义数据类型数组名[常量表达式];2020/1/298以下数组定义是正确的:#defineN10……floatscore1[N],score2[N];intnum[10+N];charc[26];以下数组定义是不正确的:intarray(10);intn;floatscore[n];doubleb['a'..'d'];charstr[];8.1.1一维数组的定义(续)2020/1/299数组在内存的存放数组下标从0开始。一维数组的数组元素在内存里按顺序存放。数组名代表数组的首地址,即score的值与score[0]的地址值相同。score[0]score[1]score[2]score[3]score[4]91.534.568.582.084.0低地址高地址score数组2020/1/29108.1.2数组元素的引用格式:例如:输入学生成绩for(i=0;i5;i++)scanf(%f,&score[i]);例如:fib[n]=fib[n-1]+fib[n-2];下标表达式的值必须是整型表达式。数组名[下标表达式]2020/1/29118.1.2数组元素的引用(续)说明:①下标从0开始(下界为0),数组的最大下标(上界)是数组长度减1。例如:inta[10];scanf(%d,&a[10]);/*下标越界*/C编译系统不做越界检查,如果引用的数组元素超出数组范围会破坏其他变量的值。2020/1/29128.1.2数组元素的引用(续)②[]是下标运算符,引用数组元素时,根据数组的首地址和下标数,计算出该元素的实际地址,取出该地址的内容进行操作。如引用score[2]:(1)计算2000+2*4=2008(2)取出2008的内容2000H2004H2008H200CH2010Hscore[0]score[1]score[2]score[3]score[4]91.534.568.582.084.02020/1/29138.1.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};2020/1/29148.1.4一维数组应用举例【例8.1】将10个人的成绩输入计算机后按逆序显示。#defineN10main(){inti;floatscore[N];for(i=0;iN;i++)scanf(%f,&score[i]);for(i=N-1;i=0;i--)printf(%6.1f,score[i]);}运行情况如下:6884899234688395838888.083.095.083.068.034.092.089.084.068.02020/1/2915【例8.2】用数组求Fibonacci数列前20个数f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...11f[19]01452319235#includestdio.hmain(){inti;intf[20]={1,1};for(i=2;i20;i++)f[i]=f[i-2]+f[i-1];for(i=0;i20;i++){if(i%5==0)printf(\n);printf(%12d,f[i]);}})3()2(12)1(1121+=====--nFFFnFnFnnn2020/1/2916例3,判断数字5是否存在于数字序列中,如果存在,输出是第几个数据,不是则输出没有找到。main(){inta[5],i;for(i=0;i5;i++)scanf(%d,&a[i]);i=0;for(i=0;i5;i++){if(5==a[i]){printf(%d,i+1);break;}}if(i==5)printf(notfound!);}2020/1/2917求最小值演示:min.c#includestdio.hmain(){inta[10]={111,51,34,123,2,344,89,99,11,14},i,min;intindex;min=a[0];for(i=1;i10;i++)if(mina[i]){min=a[i];index=i;}printf(thesmallistnumberis:%d,theindexis:%d,min,index);}2020/1/2918求最小值(用下标的形式)演示:min1.c#includestdio.hmain(){inta[10]={111,51,34,123,2,344,89,99,11,14},i,min;intindex;index=0;for(i=1;i10;i++)if(a[i]a[index])index=i;printf(thesmallistnumberis:%d,theindexis:%d,a[index],index);}2020/1/2919【例8.4】冒泡法排序(从小到大)。以6个数:3、8、5、6、8、0为例。第一趟排序情况如下:385680第一次3和8比较,不交换385680第二次8和5比较,交换358680第三次8和6比较,交换356880第四次8和8比较,不交换356880第五次8和0比较,交换356808在第一趟排序中,6个数比较了5次,把6个数中的最大数8排在最后。2020/1/2920冒泡法排序(续)第二趟排序情况如下:356808第一次3和5比较,不交换356808第二次5和6比较,不交换356808第三次6和8比较,不交换356808第四次8和0比较,交换356088在第二趟排序中,最大数8不用参加比较,其余的5个数比较了4次,把其中的最大数8排在最后,排出88。以此类推:第三趟比较3次,排出688第四趟比较2次,排出5688第五趟比较1次,排出35688最后还剩下1个数0,不需再比较,得到排序结果:0356882020/1/2921冒泡法排序(续)从上述过程可以看到: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]2020/1/2922#defineN6main(){inta[N];inti,j,t;for(i=0;iN;i++)scanf(%d,&a[i]);for(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(Thesortednumbers:\n);……}程序运行情况如下:3856800356882020/1/2923#includestdio.hmain(){inta[11],i,j,t;printf(Input10numbers:\n);for(i=1;i11;i++)scanf(%d,&a[i]);printf(\n);for(j=1;j=9;j++)for(i=1;i=10-j;i++)if(a[i]a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}printf(Thesortednumbers:\n);for(i=1;i11;i++)printf(%d,a[i]);}2020/1/2924以6个数:3、8、5、6、8、0为例。思路:第一趟:将第一个数依次和后面的数比较,如果后面的某数小于第一个数,则两个数交换,比较结束后,第一个数则是最小的数。第二趟:将第二个数依次和后面的数比较,如果后面的某数小于第二个数,则两个数交换,比较结束后,第二个数则是次小的数;……。【例8.5】选择法排序(从小到大)。2020/1/2925for(j=0;jN-1;j++)/*外循环:控制比较趟数*/for(i=N-1;ij;i--)/*内循环:进行每趟比较*/if(a[i]a[i-1])/*如果a[j]大于a[j-1],交换位置*/{temp=a[i];a[i]=a[i-1];a[i-1]=temp;}/*输出排序后的数据*/printf(\ntheresultofsort:\n);for(i=0;iN;i++)printf(%d,a[i]);2020/1/2926【例8.5】选择法排序(续)图8.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]2020/1/2927#defineN5main(){inta[N];inti,j,t;for(i=0;iN;i++)scanf(%d,&a[i]);printf(\n);for(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(Thesortednumbers:\n);…}程序运行情况如下:9688658640Thesortednumbers:40658886962020/1/29298.2二维数组数据类型数组名[常量表达式1][常量表达式2];例如:floatx[2][3];8.2.1二维数组的定义X[0][0]X[0][1]X[0][2]X[1][0]X[1][1]X[1][2]inta[3,4],b(3,4),c[][],d(3)(4);2020/1/2930x[0][0]x[0][1]x[0][2]x[1][0]x[1][1]x[1][2]2000H2004H2008H200cH2010H2014H地址值数组元素二维数组元素在内存中的排列顺序:按行存放2020/1/2931x[0]是数组名,是元素x[0][0]的地址x[1]是数组名,是元素x[1][0]的地址二维数组可看作是一种特殊的一维数组x[0]----x[0][0],x[0][1],x[0][2]x[1]----x[1][0],x[1][1],x[1][2]例如,可以把x[2][3]数组看作是包含二个元素的一维数组,每个元素又是一个含有三个元素一维数组。2020/1/2932a[3][4]=3;/*下标越界*/a[1,2]=1;/*应写成a[1][2]=1;*/8.2.2二维数组元素的引用例:inta[3][4];a[0][0]=3;a[0][1]=a[0][0]+10;数组名[行下标表达式][列下标表达式]数组元素的表示形式:2020