•第7章数组•7.1一维数组的定义和引用••7.2二维数组的定义和引用••7.3字符数组7.1一维数组的定义和引用•7.1.1定义:•类型说明符数组名[常量表达式]•如:inta[10],b[100];•说明:(1)数组名定义同变量名.•(2)用[],而不能用().•(3)常量表达式表示元素的个数:a[10]中有10个元素,从a[0]—a[9],下标从0开始,不能使用数组元素a[10].•(4)常量表达式中不能包含变量.intn;scanf(“%d”,&n);inta[n];7.1.2一维数组元素的引用•先定义,后使用。不能一次引用整个数组。•表示形式:数组名[下标]•下标可以是整型常量或表达式。例如:•a[0]=a[5]+a[7]-a[2*3]•EG:main(){•inti,a[10];•for(i=0;i=9;i++)/*循环结束后i=10*/•a[i]=i;•for(i=9;i=0;i––)•printf(“%d”,a[i]);•}•运行结果:•9876543210•1.定义数组时对数组元素赋初值.staticinta[10]={0,1,2,3,4,5,6,7,8,9};•2.只将一部分元素赋值.staticinta[10]={0,1,2,3,4};只提供前五个元素的初值.•3.对全部数组元素赋初值时,可以不指定数组的长度.staticinta[]={1,2,3,4,5};staticinta[10]={1,2,3,4,5};注意:的区别中只有5个元素,而中有10个元素,其中后5个元素初值为0.•4.使数组元素全部为0inta[10]={0,0,0,0,0,0,0,0,0,0};但不能:inta[10]={0*10};7.1.3一维数组的初始化7.1.4一维数组程序举例•例7.2Fibonacci数列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]);}}例7.3用起泡法将10个数从小到大排序起泡法排序思想:将相邻两个数比较,将小的调到前头.算法:main(){inta[11],i,j,t;printf(“input10numbers:\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(“%d”,a[i]);}9888888555589555558444559444448224449222228022229000008000009输入n个数给a[1]到a[n]Forj=1ton-1Fori=1ton-jYNa[i]a[i+1]a[i]=a[I+1]•输出a[1]到a[n]•Voidsound(unsignedfrequency)•voidnosound()•voiddelay(unsignedmilliseconds);唱名1234567频率131147165175196220247唱名1234567频率2622943303493924404941=C4/41231|1231|345--|345--|565431|565431|251--|251--|#includedos.hmain(){unsignedintsing[]={262,250,294,250,330,262,250,262,250,294,250,330,250,262,250,330,250,349,250,392,500,330,250,349,250,392,500,392,125,440,125,392,125,349,125,330,250,262,250,392,125,440,125,392,125,349,125,330,250,262,250,294,250,196,250,262,500,294,250,196,250,262,500,0,0};•unsignedint*p;p=sing;while(*p){sound(*p++);delay(*p++);nosound();}}33313130232321201312111003020100aaaaaaaaaaaaaaaa§7.2二维数组的定义和引用•7.2.1二维数组的定义与引用类型说明符数组名[常量表达式][常量表达式]说明:元素的排列顺序是按行存放的,这在数组初始化和指针表示时方便易行.C语言允许使用多维数组如:intf[3][4][5];7.2.2二维数组的引用•表示形式:数组名[下标][下标]注意:下标值应在已定义的数组大小的范围内,不要越界.•b[1][2]=a[2][3]/2;•区分:定义数组a[2][2]和引用元素a[2][2]前者是定义数组的维数和各维的大小,后者是下标值,不要混淆.•1.分行赋值:staticinta[2][2]={{1,2},{3,4}};•2.将所有数据写入一个花括号中:staticinta[2][2]={1,2,3,4};•3.对部分元素赋值:若定义为静态的,其余为0.inta[3][4]={{1},{5},{9}};7.2.3二维数组的初始化:0110000600001000900050001inta[3][4]={{1},{0,6},{0,0,11}};4.若对全部元素赋值,第一维的长度可省略,但第二维的长度不可省.staticinta[2][2]={1,2,3,4};等同于staticinta[][2]={1,2,3,4};•例如000000650001•inta[3[4]={{1},{},{6}};000600000001可以对某几行元素赋值inta[3[4]={{1},{5,6}};7.2.4程序举例•例7.53X4矩阵,求最大值及其所在的行号和列号。•Max=a[0][0]Fori=0to2Forj=0to3a[i][j]maxYNMax=a[I][j]row=icolum=j输出:max和row,colimmain(){inti,j,row=0,col=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;col=j;}printf(“max=%d,row=%d,col=%d”,max,row,col);}输出结果:max=10,row=2,col=1§7.3字符数组•7.3.1字符数组的定义charc[10];(占一个字节)c[0]='I';c[1]='';c[2]='a';c[3]='m';c[4]='';c[5]='h';c[6]='a';c[7]='p';c[p]='';c[9]='y';Iamhappy•也可用intc[10];(占两个字节)7.3.2一维数组的初始化:•1)逐一赋值。•Charc[10]={'I','','a','m','','h','a','p','p','y'};•2)初值个数同预定的长度相同时,可忽略数组长度。•Charc[]={'I','','a','m','','h','a','p','p','y'};应用:•main()•{staticcharc[5]={‘a’,‘b’,‘c’,‘d’,‘e’};•inti;•for(i=0;i5;i++)•printf(“%c”,c[i]);•printf(“\n”);•}•运行结果:•abcde7.3.3字符数组的引用例7.6输出一个字符串main(){charc[10]={'I','','a','m','','a','','b','o','y'};inti;for(i=0;i10;i++)printf(%c,c[i]);printf(\n);}Iamaboy例7.7输出一个钻石图形main(){chardiamond[][5]={{'','','*',},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*',};inti,j;for(i=0;i5;i++){for(j=0;j5;j++)printf(%c,diamond[i][j]);printf(\n);}}********7.3.4字符串和字符串结束标志‘\0’•注意:staticcharc[]={‘c’,‘h’,‘i’,‘n’,‘a’};staticcharc[]={“china”}前者的长度为5,不包含结束标志‘\0’,而后者的长度为6,包含结束标志‘\0’,第六个元素为‘\0’。•有了字符串结束标志数组的长度就不重要了。•Charc[]={Iamhappy};•Charc[]=Iamhappy;•staticcharc[]={‘c’,‘h’,‘i’,‘n’,‘a’,'\0'};•staticcharc[]={“china”}staticcharc[10]={“china”}China\0\0\0\0\07.3.5字符数组的输入输出•(1)逐个输入输出,用“%c”.•(2)整个字符串输入输出,用“%s”.Staticcharc[]=“china”;printf(“%s”,c);输出结果:china•注意:(1)遇到结束标志‘\0’就结束,但不输出.•(2)用“%s”输出时,输出是字符数组名,不是数组元素名.•charc[]=“china”;printf(“%s”,c[0]);•(3)若字符数组中包含一个以上‘\0’,则遇第一个‘\0’时输出就结束.•(4)用“%s”格式时,输入项为字符数组名,不要加地址符&.•Charstr[20];•scanf(“%s”,&str);(×)•应为scanf(“%s”,str);•实际上数组名就是•数组的首地址。hina\0C•2000•2001•2002•2003•2004•20057.3.6字符串处理函数•注意:功能、参数、返回值•调用字符串处理函数时应包含string.h,stdio.h•(1)puts(字符数组)输出的字符串可包含转义字符.Staticcharstr[]={“Iam\nastudent”};puts(str);•输出:Iamastudent•intputs(char*str)2)gets(字符数组)•得到的返回值是字符数组的起始地址,字符数组不能用字符常量代替,•charstr[20];gets(str);•且只能输入或输出一个字符串.gets(str1,str2)(错)•puts(str1,str2)(错)输入:computer3)strcat(字符数组1,字符数组2)•将字符串2接到1后面,返回的函数值为字符数组1的地址.•Staticcharc1[30]={“howare”};staticcharc2[]={“you”};printf(“%s”,strcat(c1,c2));输出:howareyou注意:1)字符数组1的长度必须足够大•2)只在新串的最后保留一个‘\0’.•返回值是第一个字符数组的首地址(4)strcpy(字符数组1,字符串2)•将字符串2拷贝到字符数组1中charstr1[10],str2[]=China;strcpy(str1,str2);•说明:1)字符数组1的长度应足够大.2)字符数组1必须是数组名。字符串2可以是字符数组名,也可以是字符串常量.比如:strcpy(str1,China);••3)在复制时连同‘\0’一起复制到字符数组中。•4)在字符数组中,不能