您好,欢迎访问三七文档
第五章数组数组是一组有序数据的集合;数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一的确定数组中的元素。5.1一维数组5.2二维数组5.3字符数组和字符串5.4本章要点小结1/46§5.1一维数组5.1.1一维数组的定义5.1.2一维数组元素的引用5.1.3一维数组的初始化5.1.4一维数组程序举例2/465.1.1一维数组的定义1、格式:数据类型说明符数组名[元素个数];2、说明:①、数据类型说明符规定数组元素的类型;②、数组名即被说明数组的名字,由用户定义,命名规则与变量名相同;③、数组名后是用方括弧括起来的数组元素个数,不能使用圆括弧;④、元素个数通常用一个常量表达式,可以包含常量或符号常量表示,不能包含变量。也即是说数组的大小在程序运行前已确定好,不依赖于程序运行中变量值的变化而变化。3、例:inta[10];a[0]、a[1]、a[2]、a[3]......a[9]charc[20];c[0]、c[1]、c[2]、c[3]......c[19]floatscore[5];score[0]、score[1]、score[2]......score[4]inta(5);#defineM20inta[M];intn;scanf(%d,&n);inta[n];intn=5;inta[n];3/465.1.2一维数组元素的引用1、数组元素的表示形式:数组名[下标]2、说明:①、下标可以是整型常量或整型表达式。a[0]a[5]a[7]a[2*3]a[i]a[j]②、下标从0开始,当数组长度为N时,如:intx[N];则数组的下标值可以是0,1,2,……,N-1。如果用a[N]是错误的。floatscore[5];score[0]、score[1]、score[2]、score[3]、score[4]3、例:对于数组:inta[10];①、数组赋值:for(i=0;i=9;i++)a[i]=2*i-1;②、数组输出:for(i=9;i=0;i--)printf(%4d,a[i]);4、注意:①、数组必须先定义后使用;每一个元素相当于一个变量;②、对数组的使用,只能逐个引用数组元素,不能对整个数组进行操作。eg501.c、eg502.c4/465.1.3一维数组的初始化所谓数组的初始化是指在定义数组时对全部或部分元素赋以初值。1、在定义数组时对全部数组元素赋以初值(最好将数组的存储类型定义为static或extern)staticinta[10]={0,1,2,3,4,5,6,7,8,9};2、可以只给一部分数组元素赋初值,系统自动对其余元素赋一缺省值:staticinta[10]={1,3,5,7,9};等价于:staticinta[10]={1,3,5,7,9,0,0,0,0,0};3、若对static数组不赋值,系统自动对所有元素赋一缺省值:staticinta[5];等价于:staticinta[5]={0,0,0,0,0};4、对全部数组元素赋初值时,可以不指定数组长度,其长度由初值个数自动确定;staticinta[]={0,1,2,3,4};等价于:staticinta[5]={0,1,2,3,4};5/465、不允许数组指明的元素个数小于初值个数;staticinta[5]={0,1,2,3,4,5};编译时出错。6、可以用赋值操作或格式输入函数:for(i=0;i10;i++)a[i]=2*i+1;for(i=0;i10;i++)scanf(%d,&a[i]);5.1.4一维数组程序举例例1:用数组来处理求Fibonacci数列问题。a[1]=a[2]=1;for(i=3;i20;i++)f[i]=f[i-1]+f[i-2];eg503.c6/46例2:用起泡法将6个整数由小到大排序。起泡法的思路:将相邻两个数比较,将小的交换到前面。943580493580439580435980435890435809345089340589304589034589结论:若有n个数,则要进行趟比较。n-1在第1趟比较中,要进行次两两比较;n-1在第i趟比较中,要进行次两两比较;n-ifor(i=0;in-1;i++)for(j=0;j;j++)if(a[j]a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;}eg504.cn-1-i7/465.1.5一维数组在内存中的存放按照地址由低到高顺序存放第0号到第n-1号元素。#defineuintunsignedintuinta[5];2000200120022003200420052006200720082009a[0]a[1]a[2]a[3]a[4]64230:1111101011100110B1110011011111010floatscore[2];30003001300230033004300530063007score[0]score[1]charstr[5];40004001400240034004str[0]str[1]str[2]str[3]str[4]EG504A8/46§5.2二维数组5.2.1二维数组的定义5.2.2二维数组元素的引用5.2.3二维数组的初始化5.2.4二维数组程序举例9/464、注意:根据数组的定义方式,可以将二维数组看作是一种特殊的一维数组,它的每一个元素又是一个一维数组。5.2.1二维数组的定义1、二维数组定义的一般形式:类型说明符数组名[行数][列数]2、例:intaa[3][4];定义了一个3行4列的数组:aa[0][0]aa[0][1]aa[0][2]aa[0][3]aa[1][0]aa[1][1]aa[1][2]aa[1][3]aa[2][0]aa[2][1]aa[2][2]aa[2][3]3、存储方式:在内存中按行存放,即先顺序存放第一行的元素,再存放第二行的元素。aa[0][0]aa[0][1]aa[0][2]aa[0][3]aa[1][0]aa[1][1]aa[1][2]aa[1][3]aa[2][0]aa[2][1]aa[2][2]aa[2][3]200020022004200620082010201220142016201820202022aa[0]:aa[1]:aa[2]:aa[0][0]、aa[0][1]、aa[0][2]、aa[0][3]aa[1][0]、aa[1][1]、aa[1][2]、aa[1][3]aa[2][0]、aa[2][1]、aa[2][2]、aa[2][3]10/465.2.2二维数组元素的引用1、二维数组元素的表示形式:数组名[行号][列号]其中行号和列号可以是整型表达式也可以是整型常量,其值都是从0开始,不能超过数组定义的范围。2、例:a[0][0]a[1][2]a[2-1][2*2-1]a[i][j]b[1][2]=a[2][3]/2;3、注意:在使用数组元素时,应注意下标值应在已定义的数组大小的范围内。staticinta[3][4];……a[3][4]=23;11/465.2.3二维数组的初始化1、按行给二维数组赋初值:staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};则结果为:1234567891011122、按数组存储顺序依次给各元素赋初值:staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};结果与上例相同。3、可以对部分元素赋初值:(其余元素赋缺省值)staticinta[3][4]={{1},{5},{9}};则结果为:1000500090004、只对数组各行中的某些元素赋初值:staticinta[3][4]={{1},{0,5},{0,0,9}};10000500则结果为:009012/465、只对数组中前面几行赋初值,后面各行的元素自动赋缺省值:staticinta[3][4]={{1},{3,5}};则结果为:1000350000006、当对全部数组元素赋初值时,第一维的长度可以不说明,但第二维长度不能省:staticinta[][3]={1,2,3,4,5,6,7,8,9};则结果为:1234567897、按行对部分元素赋初值,也可以省略第一维的长度说明:staticinta[][3]={{0,0,3},{0,2},{1}};则结果为:0030201008、同一维数组一样,不允许所提供的初值个数多于数组的元素个数。13/465.2.4二维数组程序举例例1、将二维数组a[M][N]中的元素行列互换,存到另一个数组b[N][M]中。121110987654321a128411731062951beg505.cfor(i=0;iM;i++)for(j=0;jN;j++)b[i][j]=a[j][i];14/46例2、有一个3×4的矩阵,求出其中最大的那个元素的值,以及其所在的行号和列号。eg506.cintrow,colum,max;max=a[0][0];row=0;colum=0;for(i=0;i3;i++)for(j=0;j4;j++)if(a[i][j]max){max=a[i][j];row=i;colum=j;}15/46§5.3字符数组和字符串5.3.1字符数组的定义5.3.2字符数组的初始化5.3.3字符串的输入输出5.3.4字符串处理函数16/465.3.1字符数组的定义用来存放字符型数据的数组叫字符数组,字符数组的每个下标变量中只能存放一个字符。1、格式:char数组名[字符个数]2、例:charc[5];c[0]='C';c[1]='h';c[2]='i';c[3]='n';c[4]='a';3、说明:①、在C语言中,对字符串的处理通过字符数组来实现,为了测定字符串是否结束,规定任何字符串都以一个特殊的字符'\0'作为结束标志,一个一维的字符数组可以存放一个字符串,这个字符串的长度应小于字符数组的长度。②、在C语言中对字符串常量也自动加一个'\0'作为结束标志。所以,若要使用字符数组存储字符串,则在说明字符数组时,应使数组长度大于它允许存储的最长字符串的长度。Chinacharstr[];617/46③、字符'\0'代表ASCII码为0的字符,它是一个不可显示字符,不产生任何附加操作,只起一个识别“字符串结束”的作用。④、由于C语言中字符型与整型在一定程度上是互相通用的,所以charstr[20]有时也可定义为intstr[20]。5.3.2字符数组的初始化1、逐个字符赋给数组中的元素:staticcharc[5]={'C','h','i','n','a'};①、如果花括弧中的初值个数小于数组长度,按顺序赋值后,其余元素自动赋空字符'\0';staticcharstr[10]={'B','e','i','J','i','n','g'};则:str[7]=str[8]=str[9]='\0';②、若初值个数大于数组长度,按语法错误处理;18/46③、若提供的初值个数与预定的数组长度相同,在定义时可省略数组长度,系统会自动根据初值个数确定数组长度。staticcharc[]={'C','h','i','n','a'};2、用字符串常量来使字符数组初始化:staticcharc[]={China};或:staticcharc[]=China;等价于:staticcharc[6]=China;也等价于:staticcharc[6]={'C','h','i','n','a','\0'};问题:staticcharc[5]={'C','h','i','n','a'};是否合法?说明:字符数组并不要求它的最后一个字符为'\0',甚至可以不包含'\0'。但是字符串必须要包含一个'\0'。19/465.3.3字符串的输入输出1、用%c格式控制符实现逐个字符的输入输出:#includestdio.hmain(){charc[20],ch;int
本文标题:C语言教程第五章
链接地址:https://www.777doc.com/doc-2908001 .html