您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > (C语言课件)第四章数组
第4章数组分类:一维数组多维数组字符数组在C程序中每个使用的变量都需要声明,以便编译系统为其开辟内存空间用于存储数据。有时程序中需要一批连续的存储单元,存放数据,这就需要声明一个数组。数组:C语言用同名的带下标的变量组成,数组是由固定数目的同类型的变量按一定顺序排列而构成的4.1.1一维数组的定义和初始化定义格式:元素类型名数组名[常量表达式]说明:(1)元素类型名指定该数组各元素的类型。(2)数组名的表示方法同变量名,应符合标识符命名规则。(3)用方括号[]括起来的常量表达式的值表示该数组含数组元素的个数,即数组长度。常量表达式中可包含常量和符号常量,不允许有变量。引用时,数组元素的下标从0开始编排。如:intm[20];表示整型数组m有20个元素:m[0],m[1]…,m[19]。floatx[10];表示实型数组x有10个元素:x[0],x[1],…x[9]。(1)可以在定义时对数组进行初始化,如:①对全部元素赋初值intm[10]={10,11,12,13,14,15,16,17,18,19}②可对部分元素赋初值intm[10]={0,1,2,3,4};前5个元素初值由初值列表确定,后5个元素为0。③如对数组元素赋同一初值,也必须一一列出:intm[10]={2,2,2,2,2,2,2,2,2,2};不可写成:intm[{10*2}];④若全部元素都赋初值,可省略方括号中的常量表达式,数组长度由初值个数确定。intm[]={0,1,2,3,4,5};花括号中有6个数,表示一维数组m的长度为6。4.1.2一维数组元素的引用C语言规定,数组名代表数组0号元素的地址(详见第7章)。数组元素的引用格式:数组名[下标]下标为整型表达式,它确定了引用元素的序号下标从0开始编号,最大等于定义的数组长度减1在程序中数组元素等价于一个同类型的变量。main(){intm[10]={1,2,3,4,5,6,7,8,9,0};m[9]=m[3]*6;/*正确,m[9]的值为24*/m[6]=m[10];/*不正确,m[10]下标越界*/Printf(%d%d%d%d\n,m[4],m[5],m[6],m[9]);}for(i=0;i10;i++)printf(“%4d”,m[i]);给数组元素读值、输出、处理的方法是用循环结构,循环控制变量作为数组下标,对数组元素逐个进行操作。例如:将数组m的十个元素输出for(i=0;i10;i++)printf(“%4d”,m[i]);将十个数据从键盘输入存入数组m中for(i=0;i10;i++)scanf(“%d”,&m[i]);注意:数组m的输入输出这样做是错误的scanf(“%d”,m);printf(“%d”,m);使用数组的常见错误是下标越界,对于这种错误C的编译系统不检测错误,也没有警告,但结果往往不正确。例1:从键盘输入五个数据,以输入顺序相反的顺序输出#includestdio.hvoidmain(){intx[5],i;for(i=0;i5;i++)scanf(“%d”,&x[i]);printf(i=4;i=0;i--)printf(“%6d”,x[i]);}例2从键盘输入10个学生的成绩求平均分并输出大于平均分的所有成绩。main(){inti;ints[10];floata=0.0;/*定义数组和变量*/printf(Input10student'sscores:\n);for(i=0;i10;i++)/*输入成绩*/scanf(%d,&s[i]);for(i=0;i10;i++)/*求总分*/a=a+s[i];a=a/10;/*求平均分*/printf(average=%2.1f\nscores(average):\n,a);for(i=0;i10;i++)/*输出大于平均分的成绩*/if(s[i]a)printf(%8d,s[i]);}例3:输入十个数据,由大到小排序后输出排序是非数值处理领域重要的算法,目前公布的排序方案有二十余种,选择排序是一种简单易理解的算法。基本思想:从一组数中选出最大的,使其与第一个数交换位置。从第2-n个数中选出最大的,使其与第二个数交换位置。从第3-n个数中选出最大的,使其与第三个数交换位置。……………这样的选择过程进行n-1次4.2二维数组每个元素都带两个下标,称此数组为二维数组。4.2.1二维数组的定义定义格式:元素类型名数组名[常量表达式1][常量表达式2]其中,常量表达式1的值表示数组行数,常量表达式2的值表示数组列数。它们均为常量二维数组的存放方式为:按行存放。可将二维数组看成由若干个特殊的一维数组(可称为分数组)组成。如:intb[3][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};则,有三个一维分数组b[0],b[1],b[2],每个一维分数组又有5个元素,如图4.3。b[0]有:b[0][0],b[0][1],b[0][2],b[0][3],b[0][4]b[1]有:b[1][0],b[1][1],b[1][2],b[1][3],b[1][4]b[2]有:b[2][0],b[2][1],b[2][2],b[2][3],b[2][4]初始化inta[3][4]={{1,2,3,4},{5,6,7,8,},{9,10,11,12}};inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[3][4]={{1,2},{3},{8}};1200300080004.2.2二维数组元素的引用引用格式:数组名[行下标][列下标]其中的行下标和列下标均为整型表达式,最小下标都是0,最大下标分别等于数组定义的行数减1和列数减1,引用时行下标和列下标都不得越界。与一维数组元素一样,二维数组元素相当于同类型的简单变量。大部分语句都只能逐个引用数组元素,不能单独用数组名引用整个数组,不能给数组整体赋值。而且必须在引用数组元素之前,先定义该数组。例4.5计算矩阵下三角阵(不包括对角线元素)各元素之和。main(){inta[3][3]={{3,4},{5,6},{7,8}};inti,j,t=0;for(i=1;i3;i++)for(j=0;ji;j++)t+=a[i][j];printf(t=%d\n,t);}3405607804.2.3程序举例例4.6输出10行扬辉三角形。算法分析:main(){inta[10][10];inti,j;for(i=0;i10;i++){a[i][0]=1;a[i][i]=1;}for(i=0;i10;i++){for(j=1;ji;j++)/*0,1两行不用计算,j循环不执行*/a[i][j]=a[i-1][j]+a[i-1][j-1];/*上一行的同列元素与前一列元素之和*/for(j=0;j=i;j++)printf(%5d,a[i][j]);printf(\n);}}例4.7将一个二维数组行和列元素互换,存到另一个二维数组中(转置矩阵)。如:14123a=b=2545636程序如下:main(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf(arraya:\n);for(i=0;i=1;i++){for(j=0;j=2;j++){printf(%5d,a[i][j]);b[j][i]=a[i][j];}printf(\n);}printf(arrayb:\n);for(i=0;i=2;i++){for(j=0;j=1;j++)printf(%5d,b[i][j]);printf(\n);}}4.3字符数组存放字符数据的数组,它的每个元素存放一个字符。字符串就可以用字符数组存放。4.3.1字符数组的定义和引用1.定义格式char数组名[常量表达式]字符数组的元素类型是字符,所以元素类型名是char如:charc[20];char是元素类型名,c是字符数组名,常量表达式20是元素个数即数组的长度。1.初始化(1)直接给出字符数组中的各字符chara[5]={'G','o','o','d'};(2)可以去掉定义时的长度设置,此时,字符数组的长度等于{}中的字符数。后面不会自动加字符串结束符'\0'。charx[]={'I','','a','m','','a','','s','t','u','d','e','n','t','.'};(3)还可以用字符串常量对字符数组初始化。如:charx[20]={Iamastudent.};数组x的长度为20,x[15]自动存放'\0'。可以省略{}直接写为:charx[20]=Iamastudent.;也可以去掉定义时的长度设置:charx[]=Iamastudent.;chars[10]=“ENGLISH”;ENGLISH\0字符‘\0’是ASCII码为0的字符,是系统自动加上的结束标志。1.字符数组的引用除了在输入输出和函数调用语句中可以用数组名引用字符数组外,在其它地方都不能整体引用字符数组,只能引用数组元素,引用一个元素相当于引用一个字符变量。不能给字符数组整体赋值。4.3.2字符数组的输入输出用scanf()和printf()输入/输出字符数组时,可以用如下两种格式符:%c–––逐个元素输入/输出字符(char)。%s–––整体一次输入/输出字符串(string)。1.用格式符%c逐个元素输入/输出字符将scanf()和printf()放在循环中,用%c指定格式,输入/输出项用数组元素,其下标在循环中不断变化。输入时数组元素前应加地址符&。字符数组用此法输入时系统不会自动加'\0'。#includestdio.hvoidmain(){chars[10]=“english”;inti;for(i=0;s[i]!=‘\0’;i++)putchar(s[i]);/*等效于printf(“%c”,s[i]));putchar(‘\n’);}1.用格式符%s整体输出字符数组在printf()中用格式串“%s”,输出项直接写数组名。如:charc[]={Iamastudent};printf(%s,c);注意:(1)若数组长度大于字符串长度,则遇到‘\0’即结束。如:charc[12]=student;printf(%s!,c);输出结果(注意student与!之间没有空格):student!(2)结束符‘\0’不显示。若数组中有多个'\0',输出时遇到第一个'\0'即结束。(3)如果数组中没有'\0',当用此格式整体输出数组时结果可能不对,最好改用%c格式输出各元素。如:charc[]={'G','o','o','d'};printf(%s,c);/*结果在Good之后可能还有其它内容*/(4)数值数组不能整体输入/输出,字符数组可以整体输入/输出。1.用格式符%s整体输入字符串在scanf()中用格式串“%s”,输入项直接用数组名。如:charc[20];scanf(%s,c);注意:(1)数组名本身就代表该数组的首地址(0号元素的地址),所以scanf()中数组名前不允许再加地址符&。(2)输入字符串时,系统自动加上'\0'。(3)输入多个字符串,可用空格隔开。如:chars1[10],s2[10],s3[10];scanf(%s%s%s,s1,s2,s3);若输入Youarehappy!回车则:s1:Yous2:ares3:happy!输入带空格的字符串时,只有第一个空格前的字符串有效。4.3.3字符串处理函数C语言程序库中提供了一些专门处理字符串的函数:包含string.h,stdio.h◆puts(字符串或数组);字符串输出到终端◆gets(字符数组名);输入一行字符序列到字符数组,返回字符数组的首地址◆strlwr(字符串);将字符串大写字母转换为小写,返回字符串的首地址◆strupr(字符串);将字符串小写字母转换为大写,返回字符串的首地址字符串连接函数strcat格式:s
本文标题:(C语言课件)第四章数组
链接地址:https://www.777doc.com/doc-3600851 .html