




已阅读5页,还剩93页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章数组,5.1数组的概念5.2一维数组的定义和引用5.3二维数组的定义和引用5.4用数组名作函数参数5.5字符数组*5.6C+处理字符串的方法字符串类与字符串变量,构造数据类型之一数组:有序数据的集合,用数组名标识元素:属同一数据类型,用数组名和下标确定引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系。许多好的算法都与数组有关。熟练地利用数组,可以大大地提高编程和解题的效率,加强了程序的可读性。,5.1数组的概念,数组是有序的相同类型变量的集合。组成数组的变量称为该数组的元素。数组必须包含两个要素:数组名和下标。数组名和下标惟一地标识一个数组中的一个元素,如a1、a2等。一个数组在内存中占一片连续的存储单元。,shortinta10;假设数组的起始地址为2000,则该数组在内存中的存储情况如图所示。,数组名a为数组的起始地址:coutaendl;输出数组a的起始地址。,C+用方括号来表示数组的下标,如用s1,s2,s3分别代表s数组第1、2、3个元素的值。,couta+iendl;输出数组第i个元素ai的地址。,要输出数组第i个元素的值,必须用ai:coutain;intan;,constintn=5;intan*2;,inta10;intb2*5;,下列数组定义是否正确:,数组必须先定义,后使用。只能逐个引用数组元素,不能一次引用整个数组中的全部元素。如:a=1,2,3数组元素的表示形式:数组名下标下标可以是整型常量/变量或整型表达式。a0=a5+a7a2*3,5.2.2引用一维数组的元素,例5.1将数组元素的值逆序输出。,#includeusingnamespacestd;intmain()inti,a10;for(i=0;iai;for(i=9;i=0;i-)coutai;coutai;for(i=0;i=4;i+)temp=ai;ai=a9-i;a9-i=temp;for(i=0;i=9;i+)coutai;cout=3),求Fibonacci数列问题,#include#includeusingnamespacestd;intmain()inti;intf20=1,1;for(i=2;i20;i+)fi=fi-1+fi-2;/在i的值为2时,f2=f0+f1,依此类推for(i=0;i20;i+)/此循环的作用是输出20个数if(i%5=0)coutendl;/控制换行,每行输出5个数据coutsetw(8)fi;/每个数据输出时占8列宽度coutendl;/最后执行一次换行return0;,用数组处理:,第三章的例题,运行结果如下:(空一行)11235813213455891442333776109871597258441816765,#include#includeusingnamespacestd;intmain()longf1,f2;inti;f1=f2=1;for(i=1;i=10;i+)coutsetw(12)f1setw(12)f2;/设备输出字段宽度为12,每次输出两个数if(i%2=0)coutendl;/每输出完4个数后换行,使每行输出4个数f1=f1+f2;/左边的f1代表第3个数,是第1、2个数之和f2=f2+f1;/左边的f2代表第4个数,是第2、3个数之和return0;,不用数组处理:,用递归处理:,#includeusingnamespacestd;intmain()intfib(intn);for(inti=1;i=20;i+)coutfib(i)ai;coutai+1)/如果前面的数大于后面的数t=ai;ai=ai+1;ai+1=t;/交换两个数的位置,使小数上浮coutthesortednumbers:endl;for(i=1;i11;i+)/输出10个数coutai;coutendl;return0;,运行情况如下:input10numbers:35911336-9-76100123thesortednumbers:-76-935691133100123,有些数据要依赖于两个因素才能惟一地确定,例如有3个学生,每个学生有4门课的成绩。可用二维数组表示:intstu_score34;其中s23表示第3个学生第4门课的成绩。,5.3二维数组的定义和引用,定义二维数组的一般形式:类型标识符数组名常量表达式常量表达式例如:floata34;定义a为34(3行4列)的单精度数组,共12个元素。注意:floata3,4;,5.3.1定义二维数组,二维数组中元素存放的顺序是:按行存放,即在内存中先顺序存放第一行的元素,再存放第二行的元素。例如:inta34;数组存放的顺序。,该二维数组可以理解为定义了3个一维数组。a0,a1,a2作一维数组名。a01表示a0数组的第1个元素的值。,a为二维数组的首地址;a0,a1,a2分别为第0、1、2行元素的首地址。,floata234;定义a为float型三维数组,有234=24个元素。多维数组元素存放顺序:先变最后一维,再变前一维。,a000a001a002a003a010a011a012a013a020a021a022a023a100a101a102a103a110a111a112a113a120a121a122a123,二维数组元素的表示形式为:数组名下标下标如a23。下标可以是整数表达式,如a24-2。注意:a2,3,5.3.2二维数组的引用,使用数组元素时,应该注意下标值不要越界。inta34;/定义3行4列的数组a34=15;/引用a34元素定义a为34的数组,它可用的行下标值最大为2,列坐标值最大为3。最多可以用到a23,a34就超过了数组的范围。,可以用下面的方法对二维数组初始化:(1)分行给二维数组赋初值。如inta34=1,2,3,4,5,6,7,8,9,10,11,12;这种赋初值方法比较直观,把第1个花括号内的数据赋给第1行的元素,第2个花括号内的数据赋给第2行的元素即按行赋初值。,5.3.3二维数组的初始化,(2)将所有数据写在一个花括号内,按数组排列的顺序对各元素赋初值。如:inta34=1,2,3,4,5,6,7,8,9,10,11,12;用第2种方法如果数据多,写成一大片,容易遗漏,也不易检查。,(3)可以对部分元素赋初值。如inta34=1,5,9;它的作用是只对各行第1列的元素赋初值,其余元素值自动置为0。赋初值后数组各元素为100050009000也可以对各行中的某一元素赋初值:inta34=1,0,6,0,0,11;初始化后的数组元素如下:1000060000110,这种方法对非0元素少时比较方便,不必将所有的0都写出来,只需输入少量数据。也可以只对某几行元素赋初值:inta34=1,5,6;数组元素为100056000000第3行不赋初值。也可以对第2行不赋初值:inta34=1,9;(4)如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。如inta34=1,2,3,4,5,6,7,8,9,10,11,12;可以写成inta4=1,2,3,4,5,6,7,8,9,10,11,12;,行数=总个数/列数。,若定义时只对部分元素赋初值而省略第一维的长度,则必须分行赋初值。如:inta4=1,0,5,0,0,9;/数组共有3行。,inta3=1,2,3,4,5,6,7,8,9,10,11,12;,5.3.4二维数组程序举例,例5.4将一个二维数组行和列元素互换,存到另一个二维数组中。a=123b=144562536程序如下:#includeusingnamespacestd;intmain()inta23=1,2,3,4,5,6;intb32,i,j;,coutarraya:endl;for(i=0;i=1;i+)for(j=0;j=2;j+)coutaij;bji=aij;coutendl;coutarrayb:endl;for(i=0;i=2;i+)for(j=0;j=1;j+)coutbij;coutendl;return0;,运行结果如下:arraya:123456arrayb:142536,例5.5有一个34的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。开始时把a00的值赋给变量max,然后让下一个元素与它比较,将二者中值大者保存在max中,然后再让下一个元素与新的max比,直到最后一个元素比完为止。max最后的值就是数组所有元素中的最大值。程序如下:#includeusingnamespacestd;intmain()inti,j,row=0,colum=0,max;inta34=5,12,23,56,19,28,37,46,-12,-34,6,8;max=a00;/使max开始时取a00的值,for(i=0;imax)/如果某元素大于maxmax=aij;/max将取该元素的值row=i;/记下该元素的行号icolum=j;/记下该元素的列号jcoutmax=max,row=row,colum=columendl;return0;输出结果为max=56,row=0,colum=3,1.用数组元素作函数实参用数组元素作函数实参与用变量作实参一样,将数组元素的值传送给形参变量。形参是变量,而不是数组。,5.4用数组名作函数参数,#includeusingnamespacestd;intadd(intx,inty)x=2*x;y=2*y;returnx+y;intmain()inta2=3,4;intsum;sum=add(a0,a1);coutsumendl;couta0endl;couta1endl;return0;,程序运行结果:1434,2.用数组名作函数参数用数组名作函数参数,此时实参与形参都用数组名。实参与形参的数组为同一个数组。例5.7用选择法对数组中10个整数按由小到大排序。所谓选择法就是先将10个数中最小的数与a0对换;再将a1到a9中最小的数与a1对换每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。根据此思路编写程序如下:#includeusingnamespacestd;intmain()voidselect_sort(intarray,intn);/函数声明inta10,i;coutentertheoriginlarray:ai;coutendl;select_sort(a,10);/函数调用,数组名作实参coutthesortedarray:endl;for(i=0;i10;i+)/输出10个已排好序的数coutai;coutendl;return0;voidselect_sort(intarray,intn)/形参array是数组名inti,j,k,t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(arrayjarrayk)k=j;t=arrayk;arrayk=arrayi;arrayi=t;,说明:(1)如果函数实参是数组名,形参也应为数组名,形参不能声明为普通变量(如intarray;)。实参数组与形参数组类型应一致(如都为int型),如不一致,结果将出错。(2)数组名代表数组首元素的地址,并不代表数组中的全部元素。因此用数组名作函数实参时,不是把实参数组的值传递给形参,而只是将实参数组首元素的地址传递给形参。,形参可以是数组名,也可以是指针变量,它们用来接收实参传来的地址。如果形参是数组名,它代表的是形参数组首元素的地址。在调用函数时,将实参数组首元素的地址传递给形参数组名。这样,实参数组和形参数组就共占同一段内存单元。见图5.6。图5.6,函数首部的下面几种写法都合法,作用相同。voidselect_sort(intarray10,intn)/指定元素个数与实参数组相同voidselect_sort(intarray,intn)/不指定元素个数voidselect_sort(intarray5,intn)/指定元素个数与实参数组不同,3.用多维数组名作函数参数如果用二维数组名作为实参和形参,在对形参数组声明时,必须指定第二维(即列)的大小,且应与实参的第二维的大小相同。第一维的大小可以指定,也可以不指定。如intarray310;/形参数组的两个维都指定intarray10;/第一维大小省略下面的形参数组写法不合法:intarray;/不能确定数组的每一行有多少列元素intarray3;/不指定列数就无法确定数组的结构,在第二维大小相同的前提下,形参数组的第一维可以与实参数组不同。例如,实参数组定义为intscore510;形参数组可以声明为:intarray310;/列数与实参数组相同,行数不同intarray810;实参数组名score代表其首元素(即第一行)的起始地址,系统不检查第一维的大小。,如果是三维或更多维的数组,系统不检查第一维的大小,其它维的大小都要检查。,例5.8有一个的矩阵,求矩阵中所有元素中的最大值。要求用函数处理。解此题的算法已在例5.5中介绍。程序如下:#includeusingnamespacestd;intmain()intmax_value(intarray4);inta34=11,32,45,67,22,44,66,88,15,72,43,37;coutmaxvalueismax_value(a)ci;,5.5.4字符数组的输入输出,输入字符个数确定。有字符结束标志。,(2)将整个字符串一次输入或输出。charstr20;cinstr;/字符串输入到空格或换行为止coutstr;/输出字符串到结束符0为止在运行时输入一个字符串:China在内存中,在5个字符后自动加了一个结束符0。,字符数组名str代表字符数组的首地址,执行“coutstr;for(inti=0;stri!=0;i+)stri=stri+4;coutstrendl;return0;,例:将输入的一串字符(包含空格,以换行结束)简单译码后输出。,#includeusingnamespacestd;intmain()charstr101;cin.getline(str,500,n);intiLen;iLen=strlen(str);for(inti=0;iiLen;i+)stri=stri+4;coutstrstri;for(i=0;i5;i+)coutstriendl;return0;,C和C+提供了一些字符串函数,使得用户能很方便地对字符串进行处理。这些函数,在string、string.h和iostream头文件中都有定义。使用这些函数时,使用其中之一便可。,5.5.5字符串处理函数,1.字符串连接函数strcat其函数原型为strcat(char,constchar);该函数有两个字符数组的参数,作用是:将第二个字符数组中的字符串连接到前面字符数组的字符串的后面。连接后的字符串放在第一个字符数组中,函数调用后得到的函数值,就是第一个字符数组的地址。,例如:charstr116=Iama;charstr2=student;coutstrcat(str1,str2)endl;coutstr1;,str1,str2,str1,2.字符串复制函数strcpy其函数原型为strcpy(char,constchar);作用是将第二个字符数组中的字符串复制到第一个字符数组中去,将第一个字符数组中的相应字符覆盖,函数调用后得到的函数值,就是第一个字符数组的地址。,例如charstr110,str2=China;coutstrcpy(str1,str2);cout字符串2,函数返回值大于0。(3)如果字符串1str2)cout“ab”)cout0)cout“yes”;,4.字符串长度函数strlen函数原型为:strlen(constchar);函数返回值为字符串的实际长度,不包括0在内。如:charstr10=“China”;coutn;input_data(str,n);select_sort(str,n);for(i=0;in;i+)coutstristri;voidselect_sort(charstr11,intn)chartemp11;inti,j,iMin;for(i=0;in-1;i+)iMin=i;for(j=i+1;jstring1;coutstring1;for(inti=0;istring1.length();i+)string1i=string1i+4;coutstring1(大于)、=(大于或等于)、0;i-)for(j=0;jstrj+1)temp=strj;strj=strj+1;strj+1=temp;,例5.12一个班有n个学生,需要把每个学生的简单材料(姓名、学号和成绩)输入计算机保存。然后可以通过输入某一学生的姓名查找其有关资料。当输入一个姓名后,程序就查找该班中有无此学生,如果有,则输出他的姓名和学号,如果查不到,则输出“noperson”。,为解此问题,可以分别编写两个函数,函数input_data用来输入n个学生的姓名、学号和成绩,函数search用来查找要找的学生是否在本班。程序可编写如下:,例5.12一个班有n个学生,需要把每个学生的简单材料(姓名和学号)输入计算机保存。然后可以通过输入某一学生的姓名查找其有关资料。当输入一个姓名后,程序就查找该班中有无此学生,如果有,则输出他的姓名和学号,如果查不到,则输出“本班无此人”。为解此问题,可以分别编写两个函数,函数input_data用来输入n个学生的姓名和学号,函数search用来查找要找的学生是否在本班。程序可编写如下:#include#includeusingnamespacestd;stringname50,num50;/定义两个字符串数组,分别存放姓名和学号intn;/n是实际的学生数,intmain()voidinput_data();/函数声明voidsearch(stringfind_name);/函数声明stringfind
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淘宝客服务工合同范本
- 购房协议没写按揭合同
- 淘宝店合伙合同协议书
- 违法辞退赔偿协议合同
- 甲方支付税金合同范本
- 自家管道维修合同范本
- 线下买家交易合同范本
- 车辆合作经营合同范本
- 部门经理劳务合同范本
- 绝缘电缆出售合同协议
- 加快构建新发展格局研讨发言稿
- GB/T 9115-2010对焊钢制管法兰
- GB/T 6208-1995钎料型号表示方法
- 45G互操作及信令流程
- 酿酒系统安全培训课件
- 2018年全国成人高考专升本政治试题答案
- 灭火器每月定期检查及记录表
- 卡西欧PRO-TREK-PRW-6000使用手册-基础操作
- 小学英语外研版5A Unit2 They sell many different things Module 2部优课件
- 档案职称考试培训练习题汇总(带答案)
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
评论
0/150
提交评论