第七章数组7.1一维数组7.2二维数组7.3数组的应用7.4字符数组与字符串7.5数组作为函数的参数7.6程序举例上一页下一页教学目的和基本要求:要求学生理解数组下标,掌握初始化数组的方法,学会参数传递数组,并基本掌握二维数组及字符数组的使用。教学重点:一维数组使用,参数传递数组。上一页下一页1.数组的引入:回顾第五章时我们所讲过的一个程序:从键盘输入一百个学生的成绩,求总成绩。当时我们由此引入了循环结构。如果这个程序不是要求和,而是要把这一百个学生的成绩按从高到低的顺序排列,则必须要把这一百个学生的成绩都同时记录下来,也就是说,必须要设定一百个变量。在C语言中,提供了一种方便的同时设定多个变量的数据类型,这就是数组!前提是,这多个变量必须具有相同的数据类型,比如同为int、long、float、char等等。数组有一维数组、二维数组和多维数组。上一页下一页2.数组的概念数组:具有相同类型的数据组成的序列,是有序集合。数组中的每一个数据称数组元素数组分量下标变量数组元素由其所在的位置序号(称数组元素的下标)来区分。一个数组元素就是一个相对独立的变量注意:数组的有序性,是指数组元素存储的有序性,而不是指数组元素值有序。利用这种有序性,在后面的章节中,我们可以方便的用指针解决一些问题。上一页下一页7.1一维数组7.1.1一维数组的定义一维数组:只有一个下标的数组。定义格式:存储类别类型标识符数组名[元素个数];说明:1.存储类别:说明数组的存储属性,即数组的作用域与生成期,可以是静态型(static),自动型(auto)及外部型(extern)。当使用auto型时可以省略。我们现在所用都是auto型,故省略。2.类型标识符:数组元素的类型。Int、long、char、float、double等。3.数组名的命名规则:与标识符的命名规则相同。4.数组“元素个数”:即数组长度,只能是一个整型常量表达式。可以是符号常量。上一页下一页例:inta[5];定义了一个auto型整型数组:数组的元素为整型;数组名为a;元素个数为5,分别叫做:a[0]、a[1]、a[2]、a[3]、a[4];注意:没有a[5]这个数组元素。下面是合法的数组定义:①charstr[20];/*定义一个有20个元素的字符型数组str*/②floatscore[8];/*定义一个有8个元素的浮点型数组score*/③#defineN5longdata[N];/*定义一个有5个元素的长整型数组data*/shortz[4*N];/*定义了一个有20个元素的短整型数组z*/其中③的数组长度使用的是符号常量下面的定义是非法的:intn=10;charc[n];/*数组长度不能使用变量*/上一页下一页例:试判断下列数组定义是否合法:intstudent[35];charname[20];floatscore[35];#definestudent35floatn_student[student];intscore_student[student*3];intperson(10);intn=10,a[n];上一页下一页a[5]=80;a[2.5]=60;?定义了数组以后,就可使用它了。但不能利用数组名来整体引用一个数组,只能单个的使用数组元素。数组元素的描述:由数组名加方括号中的下标组成,即:数组名[下标]下标:数组元素在数组中的顺序号,使用整序型表达式。取值范围:从0到元素个数-1。C语言不对下标越界作语法检查。若有定义:inta[5];则数组a的元素分别为:a[0]、a[1]、a[2]、a[3]、a[4];但a[5]不是。每个元素都可作为一个整型变量来使用。如:a[0]=5;a[3]=a[1]+4;a[’D’-’B’]=3;scanf(“%d”,&a[4]);上一页下一页7.1.2数组元素的引用定义了数组以后,就可使用它了。但不能利用数组名来整体引用一个数组,只能单个的使用数组元素数组元素的描述:由数组名加方括号中的下标组成,即:数组名[下标]下标:数组元素在数组中的顺序号,使用整序型表达式。取值范围:从0到元素个数-1。C语言不对下标越界作语法检查。若有定义:inta[5];则数组a的元素分别为:a[0]、a[1]、a[2]、a[3]、a[4];但a[5]不是。每个元素都可作为一个整型变量来使用。如:a[0]=5;a[3]=a[1]+4;a[’D’-’B’]=3;scanf(“%d”,&a[4]);a[5]=80;a[2.5]=60;?上一页下一页#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]);}输入:123456789101112131415输出:151413121110987654321根据数组的有序性,往往使用循环语句来对数组进行处理,用循环控制变量作为数组下标,从而可以以统一的方式来访问数组元素。例7.1从键盘输入15个整数,再反序输出。问:不用数组能否完成,如何实现?假设是1000个数据呢?注意:1.循环控制变量的初值、终值及控制条件。2.不能整体输入/出数组如:printf(“%d”,a);学会如何对数组进行输入输出上一页下一页7.1.3一维数组的存储结构与初始化1.一维数组的存储结构数组变量在内存中分配一片连续的存储单元,数组元素按数组下标从小到大连续存放。a代表首地址(数组起始地址),每个元素字节数相同,因此,根据数组元素序号可以求得数组各元素在内存的地址,并可对数组元素进行随机存取。数组元素地址=数组首地址+元素下标*sizeof(数组类型)例inta[5];设a的首地址为1000,数组a存储示意图如右图所示1006a[0]a[1]a[2]a[3]a[4]内存1000a[3]的地址=1000+3×2=1006上一页下一页2.一维数组的初始化含义:在定义数组的同时,对数组各元素指定初值。初始化是编译阶段完成。注意:用赋值语句或输入语句也可给数组素指定初值,是在运行时完成。初始化数组格式:[static]类型标识符数组名[元素个数]={初值列表};或类型标识符数组名[元素个数]={初值列表};说明:①初值列表是用逗号分隔的数组元素的初始值(常量)。②初值列表中数值的类型必须与类型标识符一致。上一页下一页若不对auto数组进行初始化,则其初值是不可知的。若一个static或外部数组未进行初始化,则对数值型数组元素,初值为0,而对字符型数组元素,初值为空字符‘\0’.对数组初始化的几种方法:①在定义数组时,对全部数组元素赋予初值。例: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};a[0]a[1]a[2]a[3]a[4]01234初始化上一页下一页例7.2数组初始化与未初始化比较#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考虑:数组b的值的含义?上一页下一页#defineN5#includestdio.hmain(){inti,j,k,max,min;staticinta[5];for(i=0;i5;i++)scanf(%d,&a[i]);max=min=a[0];/*假定第一个元素既是最大的,也是最小的*/j=k=0;/*对分别记录最大,最小元素下标的变量j,k初始化*/for(i=0;i5;i++){if(maxa[i]){max=a[i];j=i;}/*把当前最大值送max,下标送j*/elseif(mina[i]){min=a[i];k=i;}}printf(max:a[%d]=%d,min:a[%d]=%d,j,max,k,min);}例7.3从键盘上输入5个数,输出最大、最小的元素以及它们的下标若输入:823120-10↙输出为:max:a[2]=312,min:a[4]=-10上一页下一页若一个一维数组,它的每一个元素亦是类型相同的一维数组时,便构成二维数组。数组的类型相同:是指数组大小、元素类型相同。数组的维数:是指数组的下标个数,一维数组元素只有一个下标,二维数组元素有两个下标。7.2.1二维数组的定义1.定义形式:存储类别类型标识符数组名[行数][列数];例:floatb[5][3];定义了一个5×3的数组b,即数组为5行3列,可存放15个实型数据。7.2二维数组上一页下一页例:inta[2][3];定义了一个2×3的数组a,即数组为2行3列,可存放6个整型数据。2.二维数组元素的表示形式:数组名[下标1][下标2]下标1称第一维下标,下标2称第二维下标。二维数组类似于数学中的矩阵,由行、列组成。把所有第一维下标相同的元素称为行,所有第二维下标相同的元素称为列。数组a的6个元素如下:a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]上一页下一页3.多维数组的定义•根据二维数组的定义,我们可以类推出多维数组的定义。staticintb[2][2][3];/*定义了一个3维的静态整型数组*/floatc[2][3][2][2];/*定义了一个4维浮点型数组*/•在数组定义时,多维数组的维从左到右第一个[]称第一维,第二个[]称第二维,依此类推。多维数组元素的顺序仍由下标决定。下标的变化是先变最右边的,再依次变化左边的下标。•三维数组b的12个元素是:b[0][0][0]b[0][0][1]b[0][0][2]b[0][1][0]b[0][1][1]b[0][1][2]b[1][0][0]b[1][0][1]b[1][0][2]b[1][1][0]b[1][1][1]b[1][1][2]上一页下一页1.二维数组元素的引用形式:数组名[下标1][下标2]下标1称第一维下标(或称行),下标2称第二维下标(或称列)。下标从0开始变化,其值分别小于数组定义中的常量表达式1与常量表达式2。7.2.2二维数组元素的引用在二维数组中,一个元素的位置由其下标决定。对floata[4][3];其12个元素是:第(0)行:a[0][0],a[0][1],a[0][2]第(1)行:a[1][0],a[1][1],a[1][2]第(2)行:a[2][0],a[2][1],a[2][2]第(3)行:a[3][0],a[3][1],a[3][2]二维数组的每一个元素都可以作一个变量来使用。如:printf(“%d”,a[0][0]);scanf(%d,&a[1][1]);a[1][0]+=a[0][0]+3*a[0][1];上一页下一页例7.4二维数组输入输出main{inta[2][3];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↙输出:Outp