C语言教程第五章.ppt_第1页
C语言教程第五章.ppt_第2页
C语言教程第五章.ppt_第3页
C语言教程第五章.ppt_第4页
C语言教程第五章.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章数组,数组是一组有序数据的集合;数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一的确定数组中的元素。,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/46,5.1.1一维数组的定义,1、格式:,数据类型说明符数组名元素个数;,2、说明:,、数据类型说明符规定数组元素的类型;,、数组名即被说明数组的名字,由用户定义,命名规则与变量名相同;,、数组名后是用方括弧括起来的数组元素个数,不能使用圆括弧;,、元素个数通常用一个常量表达式,可以包含常量或符号常量表示,不能包含变量。也即是说数组的大小在程序运行前已确定好,不依赖于程序运行中变量值的变化而变化。,3、例:,inta10;,a0、a1、a2、a3.a9,charc20;,c0、c1、c2、c3.c19,floatscore5;,score0、score1、score2.score4,inta(5);,#defineM20intaM;,intn;scanf(%d,intn=5;intan;,3/46,5.1.2一维数组元素的引用,1、数组元素的表示形式:,数组名下标,2、说明:,、下标可以是整型常量或整型表达式。,a0a5a7,a2*3,aiaj,、下标从0开始,当数组长度为N时,如:intxN;则数组的下标值可以是0,1,2,N-1。如果用aN是错误的。,floatscore5;,score0、score1、score2、score3、score4,3、例:对于数组:inta10;,、数组赋值:for(i=0;i=0;i-)printf(%4d,ai);,4、注意:,、数组必须先定义后使用;每一个元素相当于一个变量;,、对数组的使用,只能逐个引用数组元素,不能对整个数组进行操作。,eg501.c、eg502.c,4/46,5.1.3一维数组的初始化,所谓数组的初始化是指在定义数组时对全部或部分元素赋以初值。,1、在定义数组时对全部数组元素赋以初值(最好将数组的存储类型定义为static或extern),staticinta10=0,1,2,3,4,5,6,7,8,9;,2、可以只给一部分数组元素赋初值,系统自动对其余元素赋一缺省值:,staticinta10=1,3,5,7,9;,等价于:staticinta10=1,3,5,7,9,0,0,0,0,0;,3、若对static数组不赋值,系统自动对所有元素赋一缺省值:,staticinta5;,等价于:staticinta5=0,0,0,0,0;,4、对全部数组元素赋初值时,可以不指定数组长度,其长度由初值个数自动确定;,staticinta=0,1,2,3,4;,等价于:staticinta5=0,1,2,3,4;,5/46,5、不允许数组指明的元素个数小于初值个数;,staticinta5=0,1,2,3,4,5;,编译时出错。,6、可以用赋值操作或格式输入函数:,for(i=0;i10;i+)ai=2*i+1;,for(i=0;i10;i+)scanf(%d,5.1.4一维数组程序举例,例1:用数组来处理求Fibonacci数列问题。,a1=a2=1;for(i=3;i20;i+)fi=fi-1+fi-2;,eg503.c,6/46,例2:用起泡法将6个整数由小到大排序。,起泡法的思路:将相邻两个数比较,将小的交换到前面。,943580,493580,439580,435980,435890,435809,345089,340589,304589,034589,结论:若有n个数,则要进行趟比较。,n-1,在第1趟比较中,要进行次两两比较;,n-1,在第i趟比较中,要进行次两两比较;,n-i,for(i=0;iaj+1)t=aj;aj=aj+1;aj+1=t;,eg504.c,n-1-i,7/46,5.1.5一维数组在内存中的存放,按照地址由低到高顺序存放第0号到第n-1号元素。,#defineuintunsignedintuinta5;,a0,a1,a2,a3,a4,64230,:1111101011100110B,11100110,11111010,floatscore2;,score0,score1,charstr5;,str0,str1,str2,str3,str4,EG504A,8/46,5.2二维数组,5.2.1二维数组的定义5.2.2二维数组元素的引用5.2.3二维数组的初始化5.2.4二维数组程序举例,9/46,4、注意:根据数组的定义方式,可以将二维数组看作是一种特殊的一维数组,它的每一个元素又是一个一维数组。,5.2.1二维数组的定义,1、二维数组定义的一般形式:,类型说明符数组名行数列数,2、例:intaa34;定义了一个3行4列的数组:,aa00aa01aa02aa03aa10aa11aa12aa13aa20aa21aa22aa23,3、存储方式:在内存中按行存放,即先顺序存放第一行的元素,再存放第二行的元素。,aa00aa01aa02aa03aa10aa11aa12aa13aa20aa21aa22aa23,2000,2002,2004,2006,20082010201220142016201820202022,aa0:aa1:aa2:,aa00、aa01、aa02、aa03,aa10、aa11、aa12、aa13,aa20、aa21、aa22、aa23,10/46,5.2.2二维数组元素的引用,1、二维数组元素的表示形式:,数组名行号列号,其中行号和列号可以是整型表达式也可以是整型常量,其值都是从0开始,不能超过数组定义的范围。,2、例:,a00a12a2-12*2-1aij,b12=a23/2;,3、注意:,在使用数组元素时,应注意下标值应在已定义的数组大小的范围内。,staticinta34;a34=23;,11/46,5.2.3二维数组的初始化,1、按行给二维数组赋初值:,staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;,则结果为:123456789101112,2、按数组存储顺序依次给各元素赋初值:,staticinta34=1,2,3,4,5,6,7,8,9,10,11,12;,结果与上例相同。,3、可以对部分元素赋初值:(其余元素赋缺省值),staticinta34=1,5,9;,则结果为:100050009000,4、只对数组各行中的某些元素赋初值:,staticinta34=1,0,5,0,0,9;,10000500则结果为:0090,12/46,5、只对数组中前面几行赋初值,后面各行的元素自动赋缺省值:,staticinta34=1,3,5;,则结果为:100035000000,6、当对全部数组元素赋初值时,第一维的长度可以不说明,但第二维长度不能省:,staticinta3=1,2,3,4,5,6,7,8,9;,7、按行对部分元素赋初值,也可以省略第一维的长度说明:,staticinta3=0,0,3,0,2,1;,则结果为:003020100,8、同一维数组一样,不允许所提供的初值个数多于数组的元素个数。,13/46,5.2.4二维数组程序举例,例1、将二维数组aMN中的元素行列互换,存到另一个数组bNM中。,eg505.c,for(i=0;iM;i+)for(j=0;jN;j+),bij=aji;,14/46,例2、有一个34的矩阵,求出其中最大的那个元素的值,以及其所在的行号和列号。,eg506.c,introw,colum,max;,max=a00;row=0;colum=0;,for(i=0;i3;i+)for(j=0;jmax),max=aij;row=i;colum=j;,15/46,5.3字符数组和字符串,5.3.1字符数组的定义5.3.2字符数组的初始化5.3.3字符串的输入输出5.3.4字符串处理函数,16/46,5.3.1字符数组的定义,用来存放字符型数据的数组叫字符数组,字符数组的每个下标变量中只能存放一个字符。,1、格式:,char数组名字符个数,2、例:charc5;,c0=C;c1=h;c2=i;c3=n;c4=a;,3、说明:,、在C语言中,对字符串的处理通过字符数组来实现,为了测定字符串是否结束,规定任何字符串都以一个特殊的字符0作为结束标志,一个一维的字符数组可以存放一个字符串,这个字符串的长度应小于字符数组的长度。,、在C语言中对字符串常量也自动加一个0作为结束标志。所以,若要使用字符数组存储字符串,则在说明字符数组时,应使数组长度大于它允许存储的最长字符串的长度。,China,charstr;,6,17/46,、字符0代表ASCII码为0的字符,它是一个不可显示字符,不产生任何附加操作,只起一个识别“字符串结束”的作用。,、由于C语言中字符型与整型在一定程度上是互相通用的,所以charstr20有时也可定义为intstr20。,5.3.2字符数组的初始化,1、逐个字符赋给数组中的元素:,staticcharc5=C,h,i,n,a;,、如果花括弧中的初值个数小于数组长度,按顺序赋值后,其余元素自动赋空字符0;,staticcharstr10=B,e,i,J,i,n,g;,则:str7=str8=str9=0;,、若初值个数大于数组长度,按语法错误处理;,18/46,、若提供的初值个数与预定的数组长度相同,在定义时可省略数组长度,系统会自动根据初值个数确定数组长度。,staticcharc=C,h,i,n,a;,2、用字符串常量来使字符数组初始化:,staticcharc=China;,或:staticcharc=China;,等价于:staticcharc6=China;,也等价于:staticcharc6=C,h,i,n,a,0;,问题:staticcharc5=C,h,i,n,a;是否合法?,说明:字符数组并不要求它的最后一个字符为0,甚至可以不包含0。但是字符串必须要包含一个0。,19/46,5.3.3字符串的输入输出,1、用%c格式控制符实现逐个字符的输入输出:,#includemain()charc20,ch;inti=0;while(ch=getchar()!=n)ci+=ch;ci=0;for(i=0;i字符串2,函数的返回值为一正整数,、若字符串1字符串2,函数的返回值为一负整数,例:,strcmp(A,B),strcmp(a,A),strcmp(computer,compare),strcmp(str,China),strcmp(35+78,4),strcmp(China,China),if(str1=str2)printf(equal);,if(strcmp(str1,str2)=0)printf(equal);,25/46,4、测试字符串长度函数strlen(),intstrlen(字符串),功能:测试字符串长度(函数的值为字符串的实际长度,不包括0在内),例:,staticcharstr20=China;printf(%dn,strlen(str);,也可以直接测字符串常量的长度。,strlen(China),26/46,5、字符串大小写转换函数strupr()和strlwr(),strupr(字符串)strlwr(字符串),功能:strupr()函数将字符串中的小写字母转换为大写字母,strlwr()函数将字符串中的大写字母转换为小写字母。,strupr(abC)=ABC,strlwr(abC)=abc,6、字符大小写转换函数tolower()和toupper(),inttolower(charch)inttoupper(charch),功能:tolower()函数将大写字母转换为小写字母toupper()函数将小写字母转换为大写字母,头文件:#include,tolower(H)=h,tolower(c)=c,tolower(7)=7,toupper(H)=H,toupper(c)=C,toupper(7)=7,eg511.c、eg512.c,27/46,5.3.5字符数组程序举例,例1:输入5个字符串,输出其中最大者。,charmax20,str520;,for(i=0;i5;i+),gets(stri);,strcpy(max,str0);,for(i=;i(s2:%s)n,s1,s2);,if(a=0)printf(s1:%s)=(s2:%s)n,s1,s2);,if(a0)printf(s1:%s)(s2:%s)n,s1,s2);,eg519.c,29/46,例3:编写一个程序,将两个字符串s1和s2连接起来。不要用strcat函数。,gets(s1);gets(s2);,while(),s1i!=0,i+;,inti=0,j=0;,while(),s2j!=0,s1i=s2j;i+;j+;,s1i=0;,printf(Newstring:%sn,s1);,s1i+=s2j+;,eg520.c,30/46,5.4本章要点小结,数组的概念。,数组的下标从0开始,注意下标变量不能越界!,数组的各下标变量在内存中“按行存放”,数组名表示该数组在内存中的首地址,即数组第一个下标变量的地址。,数组作为一个整体不能参与各种运算。参与运算的只能是数组的下标变量。,中使用字符数组对字符串进行处理。一个字符个数为的字符串在内存中要占用n+1个字节的存储空间。,31/46,5.5本章程序举例,例1:打印出以下的杨辉三角形(要求打印出10行)。,、各行第一个数及最后一个数都为1,、从第3行起,除第一个数及最后一个数外,其余各数是上一行同列和前一列两个数之和,aij=ai-1j+ai-1j-1,eg522.c,32/46,例2:用筛选法求100以内的所有素数。,for(i=1;i=100;i+)ai=i;,for(i=1;i=sqrt(100);i+),for(j=;j=100;j+),i+1,if(ai!=0,for(i=2;i=100;i+),if(ai!=0)printf(%5d,ai);,eg521.c,33/46,例3:有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。,假设指针low和high分别指示待查元素所在范围的下界和上界,指针mid指示区间的中间位置,即mid=(low+high)/2。,key=21,34/46,key=85,lowhigh,eg523.c,35/46,例4:已有一个排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。,381117202840586785,num=15,38111517202840586785,staticinta11=3,8,11,17,20,28,40,58,67,85;intnum;,i=9;while(num=0,i+1,eg524.c,36/46,5.6常见错误,1、数组下标越界。,如:,staticinta10=1,2,3,4,5,6,7,8,9,10;,for(i=1;i=10;i+)printf(%d,ai);,C语言规定定义时用a10,表示数组有10个元素,而不是可以用的最大下标值为10。数组只包括a0到a910个元素,因此用a10超出范围。,for(i=0;i=9;i+)printf(%d,ai);,37/46,2、数组整体赋值。,inta10;staticintb10=1,2,3,4,5,6;,a=b;,语言不允许对数组进行整体操作,如果把数组a赋值给数组b,需要用循环语句来实现。,for(i=0;i10;i+)ai=bi;,38/46,3、误以为数组名代表数组中全部元素。,main()staticinta4=1,2,3,4;printf(%d%d%d%dn,a);,企图用数组名代表全部元素。,语言中,数组名代表数组首地址,不能通过数组名输出4个整数。,printf(%d%d%d%dn,a0,a1,a2,a3);,或:,for(i=0;i=3;i+)printf(%d,ai);,39/46,4、对非静态、非外部的数组进行初始化。,floata5=1.1,2.2,3.3,4.4,5.5;,语言规定,如果要对数组进行初始化,需要将其定义为静态存储(static)的数组或外部存储(extern)的数组。,staticfloata5=1.1,2.2,3.3,4.4,5.5;,5、引用数组元素时使用圆括号。,printf(%dn,a(5);,40/46,6、输入字符串时用了地址运算符scanf(%s,数组名本身就代表地址,不应再加地址符。,scanf(%s,str);,7、向一个字符数组赋字符串。,charstr20;str=Iamaboy.;,这种错误和第二种错误为一种错误,即不支持对数组的整体操作。,strcpy(str,Iamabpy.);,41/46,8、构造字符串时忘记在末尾应加0。,i=0;while(ch=getchar()!=n)stri+=ch;printf(%sn,str);,由于构造的字符串没有加结束标志,当用printf

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论