第5课数组主要内容◆一维数组◆二维数组◆字符数组◆数组作为函数参数为什么需要数组输入10个成绩(int型),求总成绩、平均成绩、最好成绩、最差成绩。for(n=1;n=10;n++){scanf(“%d”,&cj);sum+=cj;if(cjmax)max=cj;elseif(cjmin)min=cj;}10个成绩并未保存起来,cj中只存放了最后一个输入的成绩。10个成绩分别放在a、b、c、…?如果这样,如何利用循环进行批量处理?sum=sum+cj;——循环不变式当需要多个类型相同的变量时使用数组概述数组是一个由若干个同类型数据组成的有序集合。这个有序集合中的每一个数据称为数组的元素,数组元素用共同的名字(数组名)和下标唯一标识,下标用方括号[]括起来。如:a[5]、a[8]、…每一个数组元素均可以作为一个独立变量使用。因此,引用这些数组元素时可用“同一名字,不同下标”来实现。如:sum+=cj[n];数组是由内存中连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素。数组可以是一维的,也可以是多维的。一维数组(变量)的说明数组说明:类型说明符数组名[长度]例:inta[10];//定义数组时,长度只能是常量表达式charch[20];元素a[0]a[1]a[2]a[3]…a[8]a[9]地址1000100210041006…10161018注意:C语言中的下标是从0开始的,而不是从1开始的!下图说明了数组a在内存中的存储情况,假设起始地址为1000.说明:数组所占字节大小可由下式计算:总字节数=sizeof(类型)*数组长度一维数组的引用引用形式:数组名[下标]注:下标的取值范围:0——数组长度-1【例】将数字0到9装入一个整型数组。voidmain(){intx[10];/*定义包含10个整型数的数组*/intn;for(n=0;n10;n++)x[n]=n;}注意:数组下标是否超出范围由程序设计者负责!越界使用可能会导致严重后果!!!数组的输入输出(有数组必有循环)for(i=0;i10;i++){scanf(“%d”,&a[i]);printf(“%d”,a[i]);}i=0;y=18;do{u=y/2;a[i]=y%2;i++;y=u;}while(y=1);for(j=i-1;j=0;j--){printf(“%d”,a[j]);}i=0y=18u=9a[0]=0i=1y=9u=4a[1]=1i=2y=4u=2a[2]=0i=3y=2u=1a[3]=0i=4y=1u=9a[4]=1i=5for(i=0;i10;i++){if(i%2==0)s2+=a[i];if(a[i]%2==0)s1+=a[i];}什么时候用数组(当有大量相同类型数据时)例题:让用户输入10个数,求和,求最大最小值#includestdio.hmain(){inta[10],sum=0,count=0;for(i=0;i10;i++){printf(“请输入第%d个数:”,i+1);scanf(“%d”,&a[i]);}max=min=a[0];for(i=0;i10;i++){sum+=a[i];if(maxa[i])max=a[i];if(mina[i])min=a[i];}}用户输入一个要查找的数,找到输出位置。#includestdio.hmain(){inta[10]={1,3,5,6,7,8,4,3,2,10},i,index=-1,find;printf(请输入要查找的数字:);scanf(%d,&find);for(i=0;i10;i++){if(find==a[i]){index=i;break;}}if(index=0){printf(你要查找的数字在在数组的第%d个位子,i+1);}elseprintf(没找到!);}倒置数组#includestdio.hmain(){inti,j,t;for(i=0,j=n-1;ij;i++,j--){t=a[i];a[i]=a[j];a[j]=t;}}删除元素#includestdio.hmain(){inta[10]={1,2,3,4,5,6,7,8,9,10},i,find;scanf(%d,&find);for(i=0;i10;i++)if(a[i]==find){for(j=i+1;j10;j++){a[j-1]=a[j];}}}在有序数组中插入元素#includestdio.hmain(){inta[10]={1,2,4,5,6,7,8,9,10},j,i,insert;scanf(%d,&insert);for(i=0;i9;i++){if(a[i]=insert){for(j=9;ji;j--){a[j]=a[j-1];}a[i]=insert;break;}}for(i=0;i10;i++){printf(%d,a[i]);}}排序#includestdio.hmain(){inta[10]={11,2,4,5,6,7,8,9,10},t,j,i,insert;for(i=0;i9;i++){for(j=i;j10;j++){if(a[i]a[j]){t=a[i];a[i]=a[j];a[j]=t;}}}for(i=0;i10;i++)printf(%d,a[i]);}(05年三级上机题)找出数组a中小于平均值的数放在数组b中#includestdio.hmain(){inta[10]={11,2,4,5,6,7,8,9,10},b[10],sum=0;intj=0,i;doubleave;for(i=0;i10;i++){sum+=a[i];}ave=sum/10.0;for(i=0;i10;i++){if(a[i]ave){b[j]=a[i];j++;}}for(i=0;ij;i++)printf(%d,b[i]);}for(i=0;i长度-1;i++)for(j=i+1;j长度;j++){if(a[i]a[j])….}选择法排序选择法排序(升序)的基本思想是:第i次排序:从a[i],a[i+1],…,a[N]中选择一个最小的元素,并将它与a[i]对调。对于N个元素构成的数据列表:a[1],a[2],…,a[N]第一遍扫视数据列表,从整个数据列表中选出第一个最小元素,并放到数据列表的第一个位置;第二遍扫视剩余的数据列表,从剩余的数据列表中选出第二个最小元素,并放到数据列表的第二个位置;......第N-1遍扫视剩余的数据列表,从剩余的数据列表中选出第N-1个最小的元素,并放到数表的第N-1个位置。至此,数据列表中的最大元素已放在第N个位置,排序完成。[算法]选择排序post=i;//找出最小元素的下标for(j=i+1;j=N;j++)if(a[j]a[post])post=j;if(post!=i){//实现对调t=a[i];a[i]=a[post];a[post]=t;}实现第i趟排序的程序如下:共有N-1趟排序!即i的取值分别为:1、2、…、N-1for(i=1;iN;i++){}第i次排序:从a[i],a[i+1],…,a[N]中选择一个最小的元素,并将它与a[i]对调。【例】在电视歌手大奖赛时,有10个评委评分。从键盘输入10个评委给某歌手的评分,要求找出10个评委中哪一个给了最低分、哪一个给了最高分。去掉一个最低分并去掉一个最高分后剩下的八个评分的平均值为该歌手的最后得分,求该歌手的最后得分。floatscore[N+1],sum=0,aver;inti,minno=1,maxno=1;for(i=1;iN;i++)//输入N个评分scanf(“%f”,&score[i]);for(i=2;i=N;i++){//找出最低评分、最高评分if(score[i]score[minno])minno=i;if(score[i]score[maxno])maxno=i;}for(i=1;i=N;i++)//求总评分sum+=score[i];sum-=score[minno]+score[maxno];aver=sum/(N-2);//求平均得分一维数组的初始化一般方法:1、赋值语句或输入函数2、在数组说明语句中赋值区别:静态初始化是在程序的编译阶段完成,而一般初始化是在程序的运行过程中完成的!【例】inta[10]={0,1,2,3,4,5,6,7,8,9};/*全部初始化*/inta[10]={0,1,2,3};/*部分赋值*/inta[10]={0};/*部分赋值*/inta[]={1,2,3,4,5};/*可省略数组长度*/staticinta[5]={1,2,3,4,5};/*静态初始化*/实例2:对于一个自然数,如果该数的所有因子之和等于该数,则该数称为完数。找出1000以内的所有完数,并输出它的所有因子。(如:6=1+2+3,6为完数!)for(n=1;n=1000;n++){}找出n的所有因子,并计算因子之和sum;if(sum==n)输出n的所有因子;sum=0;for(i=1;in;i++)if(n%i==0)sum+=i;for(i=1;in;i++)if(n%i==0)printf(“%d,”,i);printf(“\n”);二维数组1、二维数组的说明2、二维数组的引用3、二维数组的初始化二维数组说明数组说明:类型说明符数组名[长度1][长度2]占用字节数:行数×列数×类型字节数=总字节数例:floata[3][4];[例]将整数1到12装入一个3*4的二维数组。voidmain(){inti,j,num[3][4];for(i=0;i3;++i)for(j=0;j4;++j)num[i][j]=(i*4)+j+1;}数组0123012341567829101112例inta[3][4];20161720181920202120222320089201011201213201415200012002320045200067a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]每个构造元素a[i]是一个包含4个元素的一维数组二维数组a是由3个构造元素组成a[0]a[1]a[2]行名014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]二维数组的理解这对于理解指针是非常重要的!!!二维数组的引用形式:数组名[下标1][下标2]【例】voidmain(){intsum,i,j,a[4][5];for(i=0;i3;i++)for(j=0;j4;j++)scanf(%d,&a[i][j]);for(i=0;i3;i++){//控制行sum=0;for(j=0;j4;j++)//控制列sum=sum+a[i][j];a[i][4]=sum;printf(“Sumofrow%dis%d\n”,i,sum);}}for(j=0;j4;j++){//控制列sum=0;for(i=0;i3;i++)//控制行sum=sum+a[i][j];a[3][j]=sum;}012340□□□□◆1□□□□◆2□□□□◆3▲▲▲▲★二维数组的初始化例inta[2][3]={{1,2,3},{4,5,6}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]123456全部初始化按元素排列顺序初始化例inta[2][3]={{1,2},{4}};a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]120400部分初始化例inta[][3]={{1},{4,