第六章数组本章目标1.了解数组的数据结构2.理解一维和多维数组的定义和关系3.了解数组元素在内存的存放规则4.了解数组元素和数组名的作用5.掌握数组的使用方法6.掌握基本的排序算法一、数组具有的特征数组名数组元素的个数数组元素的类型。§6.1引言二、数组的作用数组元素的作用相当于简单变量数组名代表的是数组在内存中的首地址同一个数组中的元素在内存中是按顺序连续存放的§6.2一维数组一、一维数组的定义形式:类型说明符数组名[常量表达式];例:inta[20];floatx[100];代表数组元素的个数其中a和x都是数组名。1.数组名的确定方法同变量名。2.C语言用方括号[]表示数组元数个数。对于inta[5];表示有5个元素,元素的下标从0开始.数组a的元素分别为:a[0],a[1],a[2],a[3],a[4]数组a在内存中的存放顺序:a[0]的值a[1]的值a[2]的值a[3]的值a[4]的值:注意:在没有给数组元素赋值以前,没有确定的值。二、一维数组的引用2.引用数组元素的方式:数组名[下标]1.必须象使用变量那样,先定义,后使用则a[0]5+a[1]6为正确的算术表达式例:inta[5];a[0]=1;a[1]=2;:例:一维数组的输入与输出。main(){inti,a[10];for(i=0;i10;i++)a[i]=i;for(i=0;i=9;i++)printf(“%4d”,a[i]);}问题?将输入数据按逆序输出.例:一维数组的输入与输出。main(){inti,a[10];for(i=0;i10;i++)a[i]=i;for(i=0;i=9;i++)printf(“%4d”,a[i]);}将输入数据按逆序输出.for(i=9;i0;i--)printf(“%d”,a[i]);三、数组元素赋初值对全部元素赋初值。如:inta[10]={10,11,12,13,14,15,16,17,18,19}表示数组元素的值为:a[0]=10;a[1]=11;:a[9]=19;对部分元素赋初值(前面的连续元素)。如:在此,只有前5个元素初值确定。intb[10]={0,1,2,3,4};表示数组元素的值为:b[0]=0;b[1]=1;b[2]=2;b[3]=3;b[4]=4;注意:不能只对不连续部分元素或后面的连续元素赋初值。语句:inta[10]={,,,,,1,2,3,4,5};inta[10]={1,,3,,5,,7,,9,,};是错误的。如对数组元素赋同一初值,必须一一写出:staticinta[10]={2,2,2,2,2,2,2,2,2,2};不可写成任何其他形式。若赋全部元素的初值,可省略常量表达式inta[]={0,1,2,3};表示a[4],即只有4个元素。一、采用循环方式对数组元素赋初值§6.3数组应用实例二、内存与数组的关系前面已讲过:数组元素在内存中是按顺序连续存放的;重要特性:系统对超出数组元素的使用不查错。例:#includestdio.hmain(){inta[5]={0,1,2,3,4},i;charch[5]={'a','b','c','d','e'};for(i=0;i10;i++)printf(a[%d]=%d,ch[%d]=%c\n,i,a[i],i,ch[i]);printf(%s,ch);}a[0]=0,ch[0]=aa[1]=1,ch[1]=ba[2]=2,ch[2]=ca[3]=3,ch[3]=da[4]=4,ch[4]=ea[5]=25185,ch[5]=]a[6]=25699,ch[6]=a[7]=23909,ch[7]=a[8]=22,ch[8]=a[9]=285,ch[9]=Abcde]三、一维数组的应用求Fibonacci数列的前20项。定义数组,并赋初值staticintf[20]={1,1};/*定义数组的前两个元素*/注:c规定只有静态数组static和外部存储数组extern才能进行初始化!(对于构造数据类型如数组、结构体进行初始化通常定义为静态存储类别)fi=fi-1+fi-2,且f1=f2=1。用循环for求数列的后18项:注意:下标越界问题:i=2且i20for(i=2;i20;i++)f[i]=f[i–1]+f[i–2];#includestdio.hmain(){inti;staticintf[20]={1,1};for(i=2;i20;i++)f[i]=f[i–1]+f[i–2];for(i=0;i20;i++){if(i%5==0)printf(\n);printf(%12d,f[i]);}}程序如下:18899875556106765运行结果如下:113144159722113315843343774181例:歌手比赛,10位评委打分,去掉最高分,最低分,得成绩。main(){intscore[10],i,max=-1,min=101,sum=0;floatmark;for(i=0;i10;i++){printf(“pleaseenterthescore%d:”,i+1);scanf(“%d\n”,&score[i]);sum=sum+score[i];}for(i=0;i10;i++){if(score[i]max)max=score[i];if(score[i]min)min=score[i];}mark=(sum-max-min)/8.0;printf(“Themarkofthissingeris%f\n”,mark);}排序过程:(1)比较第一个数与第二个数,若为逆序a[0]a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束例用冒泡法对10个数排序985420例:用冒泡法对10个数进行排序(冒泡排序法)算法:(从小到大)将两个相邻的数进行比较,将小的数调换到前头.895420859420854920854290854209第一趟结果第5次第4次第3次第2次第1次5842054820542805420885420第二趟结果第4次第3次第2次第1次main(){inta[11],i,j,t;printf(“input10number:\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(“%4d”,a[i]);}将n个数送入a[1]~a[n]for(j=1ton-1)for(i=1ton-j)a[i]a[i+1]fta[i]a[i+1]输出a[1]~a[n]排序过程:(1)首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序(3)重复上述过程,共经过n-1趟排序后,排序结束例用简单选择法对10个数排序例:用选择法对10个数进行排序。(记录下标)main(){inta[10],i,j,t,k;for(i=0;i10;i++)scanf(“%d”,&a[i]);printf(“\n”);for(i=0;i9;i++){k=i;/*min=k*/for(j=i+1;j10;j++)if(a[j]a[k])k=j;t=a[k];a[k]=a[i];a[i]=t;}printf(“thesortednumbers:\n”);for(i=0;i10;i++)printf(“%4d”,a[i]);printf(“\n”);}§6.4二维数组一、二维数组的定义形式:例:inta[4][10];floatx[8][20];类型说明符数组名[常量表达式1][常量表达式2]2.可将二维数组的元素看成为若干个特殊的一维数组。可看成:有三个特殊的一维数组b[0],b[1],b[2],每一个又有四个元素:1.不可将定义写为inta[4,10]。注意:b[0][0],b[0][1],b[0][2],b[0][3],b[1][0],b[1][1],b[1][2],b[1][3],b[2][0],b[2][1],b[2][2],b[2][3],如:intb[3][4];3.二维数组的存放方式为:按行优先。由此可推广至三维、n维数组的定义和存放。4.初始化:即:最右边的下标变化最快。按行给二维数组赋初值:staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};或:staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};可以对部分元素赋初值,但需表达清楚。则相当于若:staticinta[3][4]={1,2,3,8}则相当于000000008321000800030021如:staticinta[3][4]={{1,2},{3},{8}}。可通过赋初值决定数组大小。如为二维,则只可省略第一维的大小。staticinta[][4]={1,2,3,…,12};二、二维数组元素的引用形式:其中的下标为整型表达式,但不得越界。与一维数组元素一样,二维数组元素相当于同类型的简单变量。注意下标值应在已定义的数组大小范围内;如:inta[2][3];则a[2][3]=3的引用是不合法的。请区分定义数组a[2][3]和引用元素a[2][3]的不同。数组名[下标1][下标2]三、程序举例a=123456b=142536例:将一个二维数组行和列元素互换,存到另一个二维数组中。例如:例:将一个二维数组的行列互换存放到另一个数组中.即:123456main(){staticinta[2][3]={{1,2,3},{4,5,6}};staticintb[3][2],i,j;printf(“arraya:\n”);for(i=0;i=1;i++){for(j=0;j=2;j++){printf(“%5d”,a[i][j]);b[j][i]=a[i][j];}printf(“\n”);}printf(“arrayb:\n”);for(i=0;i=2;i++){for(j=0;j=1;j++)printf(“%5d”,b[i][j]);printf(“\n”);}}a=142536b=例:有一个34的矩阵,求出其中值为最大的元素的值以及它在矩阵中的位置.max=a[0][0]for(i=0to2)for(j=0to3)a[i][j]maxftmax=a[i][j]row=icolum=j输出max,row,colum#includestdio.hmain(){inti,j,row=0,colum=0,max;staticinta[3][4]={{1,2,3,4},{9,8,7,6},{-10,-10,-5,2}};max=a[0][0];for(i=0;i=2;i++)for(j=0;j=3;j++)if(a[i][j]max){max=a[i][j];row=i;colum=j;}printf(“max=%d,row=%d,colum=%d\n”,max,row,colum);}注意:数组元素数据的输入必须以循环方式进行或者定义时置初值。二维数组一般用二重循环对每个元素赋值。二维数组与一维数组的对应关系:6A[0][0]A[0][1]A[0]