您好,欢迎访问三七文档
第6章数组1第11讲数组的定义和使用教学目的与要求:掌握一维数组的定义和引用掌握二维数组的定义和引用教学内容提要:1.一维数组的定义和引用2.二维数组的定义和引用教学重点:一维数组的定义和引用教学难点:二维数组的定义和引用教学进度:P139~P151教学过程:第6章数组2数学中:a1,a2,a3,···,ai,···,anC程序中:a[0],a[1],a[2],···,a[i-1],···a[n-1]数组是数目固定,类型相同的若干变量的有序集合。数组中的每一个数称为数组元素,数组中的每一个元素都属于同一个数据类型。在内存中数组占有一段连续的存储空间。第6章数组3一、一维数组1、一维数组的定义定义的格式:类型说明符数组名[整常量表达式];说明:(1)类型说明符:表明该数组所属类型,即数组元素的类型。(2)数组名:即数组的名称,其命名方法同变量名遵循标识符定名规则。。例如:inta[10];它表示数组名为a,此数组有10个整型元素。第6章数组4(3)[]:下标运算符,可通过该运算符的个数反映出数组的维数。不能用圆括弧,下面用法不对:inta(10);(4)常量表达式:表示元素的个数,即数组长度。常量表达式中可以包括常量和符号常量,不能包含变量。也就是说,c不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。例如,下面这样定义数组是不行的:特点:数组元素的个数必须是确定的数组元素的类型必须一致第6章数组5下面是合法的数组定义:①charstr[20];/*定义一个有20个元素的字符型数组str*/②floatscore[8];/*定义一个有8个元素的浮点型数组score*/③#defineN5longdata[N];/*定义一个有5个元素的长整型数组data*/shortz[4*N];/*定义了一个有20个元素的短整型数组z*/其中③的数组长度使用的是符号常量下面的定义是非法的:intn=10;charc[n];/*数组长度不能使用变量*/charstr[];/*数组长度不确定*/第6章数组6例:试判断下列数组定义是否合法:intstudent[35];charname[20];floatscore[35];#definestudent35floatn_student[student];intscore_student[student*3];intperson(10);intn=10,a[n];第6章数组7一维数组在内存中的存放方式:数组定义以后,编译系统(计算机)将在内存中开辟一块连续的存储单元用于存放数组元素(数组元素按数组下标从小到大连续存放)。数组名表示存储单元的首地址,存储单元的大小由数组的类型和数组的大小决定。例如inta[5];inta[4]a[3]a[2]a[1]a[0]2字节2字节2字节2字节2字节第6章数组8a代表首地址(数组起始地址),每个元素字节数相同,因此,根据数组元素序号可以求得数组各元素在内存的地址,并可对数组元素进行随机存取。数组元素地址=数组名+下标即:数组元素地址=数组首地址+元素下标*sizeof(数组类型)设a的首地址为1000,数组a存储示意图如右图所示1006a[0]a[1]a[2]a[3]a[4]aa+1a+2a+3a+4内存1000a[3]的地址=a+3即:a[3]的地址=1000+3×2=1006第6章数组9引用方式:数组名[下标]2、一维数组元素的引用说明:下界≤下标≤上界;下界=0;上界=整常量表达式-1。下标为整型表达式;若有定义:inta[5];则数组a的元素分别为:a[0]、a[1]、a[2]、a[3]、a[4];但a[5]不是。第6章数组10一维数组元素引用的规定:•数组必须先定义后使用。•数组元素只能逐个被引用,不能一次引用整个数组。•对数组中所有元素逐个引用时,通常可使用循环结构。一个数组元素实质是一个变量,代表内存中的一个存储单元。引用后的数组变量也称下标变量。如:a[0]=5;a[3]=a[1]+4;a[’D’-’B’]=3;scanf(“%d”,&a[4]);第6章数组11例1:输入10个整数,分别按顺序和逆序输出。#includestdio.hvoidmain(){inti,a[10];printf(input10numbers:\n);for(i=0;i10;i++)scanf(%d,&a[i]);printf(\n);for(i=0;i=9;i++)printf(%d,a[i]);printf(\n);for(i=9;i=0;i--)printf(%d,a[i]);}程序的运行情况:input10numbers:12345678910↙1234567891010987654321注意:1.循环控制变量的初值、终值及控制条件。2.不能整体输入/出数组如:printf(“%d”,a);学会如何对数组进行输入输出第6章数组12数组初始化:指定义数组时对数组元素赋以初值。3、一维数组的初始化格式:类型符数组名[表达式]={初值表};说明:•给全部元素赋初值。inta[5]={0,1,2,3,4};•给部分元素赋初值。intb[5]={1,2,3};•给全部元素赋初值时可不指定数组的长度。inta[]={1,2,3};但若被定义的数组长度与提供初值的个数不相同,则数组长度不能省略。例如,想定义数组长度为10,就不能省略数组长度的定义,而必须写成inta[10]={1,2,3,4,5};只初始化前5个元素,后5个元素为默认值。第6章数组13例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的值的含义?14程序如下:main(){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]);}}运行结果如下:11235813213455891442333776109871597258441816765例1、用数组来处理求fibonacci数列问题。4、一维数组程序举例第6章数组15#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);}例2、从键盘上输入5个数,输出最大、最小的元素以及它们的下标若输入:823120-10↙输出为:max:a[2]=312,min:a[4]=-10第6章数组16例3、将10个人员的考试成绩进行分段统计,考试成绩放在a数组中,各分数段的人数存到b数组中:成绩为60到69的人数存到b[0]中,成绩为70到79的人数存到b[1],成绩为80到89的人数存到b[2],成绩为90到99的人数存到b[3],成绩为100的人数存到b[4],成绩为60分以下的人数存到b[5]中。第6章数组17voidmain(){inti,a[10];staticintb[6];printf(enterthescore:\n);for(i=0;i10;i++){scanf(“%d”,&a[i]);switch(a[i]/10){case6:b[0]++;break;case7:b[1]++;break;case8:b[2]++;break;case9:b[3]++;break;case10:b[4]++;break;default:b[5]++;}}printf(theresultis:);for(i=0;i6;i++)printf(%d\t,b[i]);}第6章数组18二、二维数组1、二维数组的定义和引用1)二维数组的定义格式:类型说明符数组名[整常量表达式1][整常量表达式2]例:floata[3][4],b[5][10];2)存储方式:二维数组可看作特殊的一维数组;在计算机中二维数组的元素按行顺序存放。例:inta[2][3];它在内存情况:第6章数组193)二维数组的引用格式:数组名[下标1][下标2]注意:0≤下标1≤常量表达式1-1;0≤下标2≤常量表达式2-1。例:a[1][2]a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]第6章数组20说明:•给全部元素赋初值。(1)分行初始化。如:staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};(2)按数组排列的顺序将所有数据写在一个花括号内,如:staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};2、二维数组的初始化二维数组初始化通常是按行进行的。格式:类型符数组名[表达式1][表达式2]={初值表};第6章数组21说明:•给部分元素赋初值。staticinta[3][4]={{,1},{0,6},{0,0,11}};0100060000110•给二维数组的全部元素赋初值,可以不指定第一维的长度,但第二维的长度不能省略。staticinta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};第6章数组22例1、用如下的3×3矩阵初始化数组a[3][3],求矩阵的转置矩阵。123147456258789369转置矩阵:是将原矩阵元素按行列互换形成的矩阵方法1:转置矩阵是将原矩阵元素按行列互换形成的。123147456258789369方法2:沿主对角线将对称位置元素互换即可。主对角线第6章数组23#includestdio.hmain(){intj,k;inta[3][3]={1,2,3,4,5,6,7,8,9},b[3][3];for(j=0;j3;j++)for(k=0;k3;k++)b[j][k]=a[k][j];for(j=0;j3;j++){for(k=0;k3;k++)printf(“%6d”,b[j][k]);printf(“\n”);}}第6章数组24例2:在N行M列的二维数组x中,找出数组的最大值以及此最大值所在的行、列下标。#defineN2#defineM3#includestdio.hvoidmain(){inti,j,x[N][M],max,line,col;printf(inputarraynumbers:\n);for(i=0;iN;i++)for(j=0;jM;j++)scanf(%d,&x[i][j]);max=x[0][0];line=col=0;for(i=0;iN;i++)for(j=0;jM;j++)if(maxx[i][j]){max=x[i][j];line=i;col=j;}printf(\nmax=%d\tline=%d\tcol=%d\n,max,line,col);}第6章数组25程序运行情况:inputarraynumbers:1234↙-56789↙101112↙nmax=89line=1col=2第6章数组26例3:有一个班共30个学生,
本文标题:c语言教案第11讲
链接地址:https://www.777doc.com/doc-3377422 .html