第7章数组7.1一维数组7.2二维数组7.3数组的应用7.4字符数组与字符串7.5数组作为函数的参数7.6程序举例main(){floata,s;scanf(“%f”,&a);while(a=0){s=s+a;scanf(“%f”,&a);}printf(“s=%f”,s);}用数组啊!还记得这个问题吗?计算全班成绩和在第五章如果是希望将全班成绩排序呢?怎么办?#includestdio.hmain(){intn,a[15];for(n=0;n15;n++)scanf(%d,&a[n]);printf(\n);for(n=14;n=0;n--)printf(%4d,a[n]);}例7.1从键盘输入15个整数,再反序输出输入:123456789101112131415输出:151413121110987654321a[0],a[1],a[2],…a[14]爽啊7.1一维数组7.1.1一维数组的定义(只有一个下标的数组)存储类别类型标识符数组名[元素个数];说明:1.存储类别:说明数组的存储属性,即数组的作用域与生存期,可以是静态型(static),自动型(auto)及外部型(extern)。当使用auto型时可以省略。2.类型标识符:数组元素的类型。int、long、char、float、double等。格式:说明:1.存储类别:与标识符的命名规则相同。2.类型标识符:即数组长度,只能是一个整型常量表达式。可以是符号常量。强调说明:1.声明数组长度时,不能使用变量。2.不能整体输入输出数组,而只能使用数组的元素参与表达式计算或输入输出。例:inta[5];定义了一个auto型整型数组:数组的元素为整型;数组名为a;元素个数为5,元素:a[0]、a[1]、a[2]、a[3]、a[4];没有a[5]这个数组元素。下面的定义是非法的:intn=10;charc[n];/*数组长度不能使用变量*/下面是合法的数组定义:①charstr[20];/*定义一个有20个元素的字符型数组str*/②floatscore[8];/*定义一个有8个元素的浮点型数组score*/③#defineN5longdata[N];/*定义一个有5个元素的长整型数组data*/④shortz[4*N];/*定义了一个有20个元素的短整型数组z*/例:试判断下列数组定义是否合法intstudent[35];charname[20];floatscore[35];#definestudent35floatn_student[student];intscore_student[student*3];intperson(10);intn=10,a[n];√√√√×√×7.1.2数组元素的引用要小心了!与变量相似,数组也是先定义,后使用只能使用数组元素,不可以整体引用数组数组名加方括号中的下标,表示数组元素下标可以是整序型表达式,不可以是变量C语言不对下标越界作语法检查inta[3],b;20102008%^32006b2004a[2]2002a[1]2000a[0]1998^@$#a[3]7.1.3一维数组的存储结构与初始化1.一维数组的存储结构inta[3]数组变量在内存中分配一片连续的存储单元,数组元素按数组下标从小到大连续存放。a代表首地址(数组起始地址),每个元素字节数相同,因此,根据数组元素序号可以求得数组各元素在内存的地址,并可对数组元素进行随机存取。20102008%^32006b2004a[2]2002a[1]2000a[0]1998^@$#数组元素地址=数组首地址+元素下标*sizeof(数组类型)返回7.42.一维数组的初始化先看几个初始化实例:①inta[5]={0,1,2,3,4};在定义数组时,对全部数组元素赋予初值。②inta[5]={1,2};在定义数组时,对部分数组元素赋予初值。等价于a[0]=1,a[1]=2;其它赋0③inta[]={0,1,2,3,4};对全部数组元素赋初值时,可省数组长度,系统自动确定。等价于inta[5]={0,1,2,3,4};[static]类型标识符数组名[元素个数]={初值列表};含义:在定义数组的同时,对数组各元素指定初值。初始化是编译阶段完成。注意:用赋值语句或输入语句也可给数组元素指定初值,是在运行时完成。格式:说明:①初值列表是用逗号分隔的数组元素的初始值(常量)。②初值列表中数值的类型必须与类型标识符一致。2.一维数组的初始化若不对auto数组进行初始化,则其初值是不可知的。若一个static或外部数组未进行初始化,则对数值型数组元素,初值为0,而对字符型数组元素,初值为空字符‘\0’.注意啦!差不多了,看几个实例#includestdio.hmain(){inti,a[5]={3,4,5},b[5];printf(\narrayais:);for(i=0;i5;i++)printf(%6d,a[i]);printf(\narraybis:);for(i=0;i5;i++)printf(%6d,b[i]);}运行结果:arrayais:34500arraybis:-321398401170454例7.2数组初始化与未初始化比较例7.3从键盘上输入5个数,输出最大、最小的元素以及它们的下标j=k=0;for(i=1;i5;i++){if(maxa[i]){max=a[i];j=i;}elseif(mina[i]){min=a[i];k=i;}}printf(max:a[%d]=%d,min:a[%d]=%d,j,max,k,min);}a[0]a[1]a[2]a[3]a[4]max8j823120-10min8k#defineN5#includestdio.hmain(){inti,j,k,max,min;staticinta[5];for(i=0;i5;i++)scanf(%d,&a[i]);max=min=a[0];8312312312222-100402227.2二维数组7.2.1二维数组的定义1定义形式:存储类别类型标识符数组名[行数][列数];例:inta[2][3];定义了一个2×3的数组b,即数组为2行3列,可存放6个整型数据a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]2012201020082006200420022000a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]元素返回7.4理解说明若一个一维数组,它的每一个元素亦是类型相同的一维数组时,便构成二维数组。数组的类型相同是指数组大小、元素类型相同。数组的维数是指数组的下标个数,一维数组元素只有一个下标,二维数组元素有两个下标。例7.4二维数组输入输出main{inta[2][3],j,k;printf(”\nInputarraya:”);for(j=0;j2;j++)for(k=0;k3;k++)scanf(“%d”,&a[j][k]);/*输入数据到二维数组中*/printf(”\nOutputarraya:\n”);for(j=0;j2;j++){for(k=0;k3;k++)/*循环三次,输出一行共三个元素*/printf(“%4d”,a[j][k]);printf(“\n”);/*输出一行后换行,再输出下一行*/}}Inputarraya:123456↙Outputarraya:123456对二维数组的输入输出多使用二层循环结构来实现。外层循环处理各行,循环控制变量j作为数组元素的第一维下标;内层循环处理一行的各列元素,循环控制变量k作为元素的第二维下标。④inta[][3]={1,2,3,4,5,6};inta[][3]={{0},{0,5}};给全部元素赋初值或分行初始化时,可不指定第一维大小,其大小系统可根据初值数目与列数(第二维)自动确定;但必须指定第二维的大小。7.2.4、二维数组的初始化①inta[2][3]={{1,2,3},{2,3,4}};/*分行给二维数组赋初值,每个花括号内的数据对应一行元素。②inta[2][3]={1,2,3,2,3,4};/*将所有初值写在一个花括号内,顺序给各元素赋值。③inta[2][3]={{1,2},{4}};/*只对部分元素赋值,没有初值对应的元素赋0值或空字符(字符数组)。7.3数组的应用1.利用数组处理批量数据分析:例7.8:从键盘上输入若干学生的成绩(不超过100人),计算平均成绩,并输出高于平均分的人数及成绩。输入成绩为负时结束。1、floatscore[100],ave,sum=0,x;2、为score数组元素分别赋值,同时计算sum值,并统计实际个数n;3、将数组中的成绩值逐个与平均值比较,输出高于平均分的成绩,同时统计个数count。#includestdio.hmain(){floatscore[100],ave,sum=0,x;inti,n=0,count;printf(Inputscore:);scanf(%f,&x);while(x=0&&n100){sum+=x;score[n++]=x;scanf(%f,&x);}ave=sum/n;printf(average=%f\n,ave);for(count=0,i=0;in;i++)if(score[i]ave){printf(%f\t,score[i]);count++;if(count%5==0)printf(\n);}printf(count=%d\n,count);}2.利用数组排序原理分析:例7.9:从键盘上输入10个整数,用选择法将其按由小到大的顺序排列并输出。1、设有n个元素要排序,首先选择最大的元素与第一个元素交换,然后再对剩余的n-1个元素进行类似的处理,这样重复n-1次后即可将n个数按由大到小的顺序排序。2、若要由小到大排序只须每次选择最小的元素。#includestdio.hmain(){inti,j,t,a[10];for(i=0;i10;i++)scanf(%d,&a[i]);for(i=0;i9;i++)for(j=i+1;j10;j++)if(a[i]a[j]){t=a[i];a[i]=a[j];a[j]=t;}printf(\n);for(i=0;i10;i++)printf(%6d,a[i]);}内循环:在(i,10)内选择最小数事实上,只要记住较小元素的位置,即下标,在内循结束后做一次交换即可,自学值得注意的是以上程序执行时,元素的交换并不都是必须的。事实上,只要记住比较时大元素的位置,即序号,在内循环结束后做一次交换即可,从而提高程序执行的效率。#includestdio.hmain(){inti,j,k,a[10],t;for(i=0;i10;i++)scanf(%d,&a[i]);for(i=0;i9;i++){k=i;for(j=i+1;j10;j++)if(a[k]a[j])k=j;if(k!=i){t=a[i];a[i]=a[k];a[k]=t;}}printf(\n);for(i=0;i10;i++)printf(%6d,a[i]);}K是最小元素之下标输入:12434565534567933234输出:459123334672345345657.4字符数组与字符串1.字符数组的定义7.4.1字符数组的定义与初始化其元素类型为字符类型的数组,其定义与前面介绍的数组定义相同。例如:charstr[40];定义一个有40个元素的字符数组,每个元素相当于一个字符变量。回顾一维二维2.字符数组的初始化①在定义字符数组时进行初始化charch[7]={’s’,’t’,’u’,’d’,’e’,’n’,’t’};②在对全部元素指定初值时,可省略数组长度。charch[]={’s’,’t’,’u’,’d’,’e’,’n’,’t’};7.4.2字符串的概念及存储1.字