




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章数组5.1数组的概念5.2一维数组的定义和引用5.3二维数组的定义和引用5.4用数组名作函数参数5.5字符数组5.6字符串类5.1数组的概念数组是一种顺序容器,是由单一类型元素组成的一个有序集合。一个数组在内存中占一片连续的存储单元。引入数组就不需要在程序中定义大量的变量,大大减少程序中变量的数量,使程序精炼,而且数组含义清楚,使用方便,明确地反映了数据间的联系。许多好的算法都与数组有关。熟练地利用数组,可以大大地提高编程和解题的效率,加强了程序的可读性。5.2一维数组的定义和引用描述数组必须给出元素类型,元素个数,元素个数必须在编程时确定,任何变量都不允许,C++不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程中变量的值。定义一维数组的一般格式为
类型标识符数组名[常量表达式];inta[‘a’];//表示inta[97];intn=100;inta[n];//错:元素个数必须预知constintn=100;inta[n];//okinta[];//错:无元素个数inta[]={1,2,3,4,5};//ok:通过初始化确定元素个数数组初始化可选,但须遵循语法。无初始化的数组按规定取默认值。intarray1[5]={1,2,3,4,5,6};//错:初始值个数超元素个数intarray2[5]={1,,2,3,4};//错:不能以逗号方式省略intarray3[5]={1,2,3,};//错:同上intarray4[5]={};//错:初始值不能为空intarray5[5]={1,2,3};//ok:后面元素取0intarray6[5]={0};//ok:元素全为0intarray7[5];//ok:元素值不确定inta[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};数组元素的访问:对数组元素的访问是通过下标操作符,按元素在数组中的位置进行访问,称为索引访问或下标访问。数组元素的表示形式为
数组名[下标]注意:①数组是一种组合类型,它是不能作为一个整体进行访问和处理的,只能按元素进行个别的访问和处理。②C++数组中的第1个元素的下标为0,且下标表达方式是固定的。③数组元素在内存中是从低地址开始顺序排列的,各元素的存储单元大小相同,各元素的存储单元之间没有空隙,可以从数组第1个元素的存储单元的起始地址计算出任意一个元素的存储单元的起始地址。④C++不对数组的边界进行检测。数组使用过程中是否出界完全是由程序员来控制的。例:#include<iostream>usingnamespacestd;intmain(){inta[5]={1,2,3,4,5};for(inti=0;i<sizeof(a)/sizeof(a[0]);i++)cout<<a[i]<<"";cout<<endl;return0;}操作符sizeof()返回某数据类型的字节长度。数组的默认值对于实施了初始化的数组,如果初始值的个数小于数组元素的个数,则后面的元素个数全为0。对于没有初始化的数组,分两种情况:一种是全局数组和静态数组,即在函数外部定义的,或加上static修饰的数组定义,其元素总是全被清0。另一种是局部数组,即在函数内部定义的数组,其值不确定。#include<iostream>usingnamespacestd;intarray1[5]={1,2,3};//有初始化intarray2[5];//无初始化
intmain(){intarray3[5]={2};//有初始化
intarray4[5];//无初始化
cout<<"array1:";for(inti=0;i<5;++i)cout<<array1[i]<<"";cout<<"\narray2:";for(inti=0;i<5;++i)cout<<array2[i]<<"";cout<<"\narray3:";for(inti=0;i<5;++i)cout<<array3[i]<<"";cout<<"\narray4:";for(inti=0;i<5;++i)cout<<array4[i]<<"";cout<<"\n";}结果:array1:12300array2:00000array3:20000array4:200905620622935288229372820090953165.3二维数组的定义和引用C++中的数组可以有多个下标,需要两个下标才能标识某个元素的数组称为二维数组。⑴二维数组的定义inta[3][4];二维数组可以存储二维表或矩阵。intb[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};要访问二维数组中某个元素,必须指定两个下标。c=b[2][3];⑵二维数组的初始化inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};inta[][4]={{1,2},{4,5,6},{9,10,11,12}};
注意:只能省略最高维。⑶二维数组的遍历#include<iostream>usingnamespacestd;intmain(){inta[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};cout<<sizeof(a)<<endl;//数组总的字节数
cout<<sizeof(a[0])<<endl;//一行的字节数
cout<<sizeof(a[0][0])<<endl;//一个元素的字节数
intm=sizeof(a)/sizeof(a[0]);//行数
intn=sizeof(a[0])/sizeof(a[0][0]);//列数
for(inti=0;i<m;i++)for(intj=0;j<n;j++)cout<<a[i][j]<<"";return0;}⑷二维数组的存储二维数组在内存中转化为一维方式存储。
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};123456789101112第一行第二行第三行二维数组程序举例例:将一个二维数组行和列元素互换,存到另一个二维数组中。如a= 1 2 3b= 1 4 4 5 6 2 5 3 6思路:找规律——b[j][i]=a[i][j]遍历数组a,将元素a[i][j]赋给b[j][i]。#include<iostream>usingnamespacestd;intmain(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2];cout<<"arraya:"<<endl;for(inti=0;i<=1;i++){for(intj=0;j<=2;j++){cout<<a[i][j]<<"";b[j][i]=a[i][j];}cout<<endl;}cout<<"arrayb:"<<endl;for(inti=0;i<=2;i++){for(intj=0;j<=1;j++)cout<<b[i][j]<<"";cout<<endl;}return0;}arraya:123456arrayb:142536例:17个人围成圈,编号为1~17,从第1号开始报数,报到3的倍数的离开,一直数下去,直到最后只剩下一个人,求此人的编号。思路:将17人的编号写入数组,如某人离开,则将相应元素的值赋为0;定义一个变量n来记报数的数;循环遍历数组,如元素的值不为0,则n++(报数),如此时n的值为3的倍数,则将元素的值赋为0(离开)。待解决的问题:如何循环遍历数组?如何知道只剩下1人?1234567891011121314151617#include<iostream>usingnamespacestd;intmain(){constintm=17;intn=0,leave=0;//n为报数计数,leave为离开的人数计数
inta[m];for(intk=0;k<m;k++)//将17人的编号写入数组aa[k]=k+1;for(inti=0;;i++){i=i%m;//从数组尾部跳至数组头部
if(a[i]!=0)//不为0,则表示此人没离开,应报数
{n++; //报数
if(n%3==0)//报到3的倍数
{a[i]=0;//离开
leave++;//离开的人数加1if(leave==(m-1))//如果已离开16人,退出循环
break;}}}for(intj=0;j<m;j++)//输出最最后1人的编号
{if(a[j]!=0)cout<<a[j];}return0;}5.4用数组名作函数参数常量和变量可以用作函数实参,同样数组元素也可以作函数实参,其用法与变量相同。数组名也可以作实参和形参,传递的是数组的起始地址。1.用数组元素作函数实参由于实参可以是表达式,而数组元素可以是表达式的组成部分,因此数组元素当然可以作为函数的实参,与用变量作实参一样,将数组元素的值传送给形参变量。例:有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。思路:开始时把a[0][0]的值赋给变量max,然后让下一个元素与它比较,将二者中值大者保存在max中,然后再让下一个元素与新的max比,直到最后一个元素比完为止。max最后的值就是数组所有元素中的最大值。#include<iostream>usingnamespacestd;intmax_value(intx,intmax);//函数声明intmain(){inti,j,row=0,colum=0,max;inta[3][4]={{5,12,23,56},{19,28,37,46},{-12,-34,6,8}};//数组初始化
max=a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++){max=max_value(a[i][j],max);//调用max_value函数
if(max==a[i][j])//如果函数返回的是a[i][j]的值
{row=i;//记下该元素行号icolum=j;//记下该元素列号j}}cout<<"max="<<max<<",row="<<row<<",colum="<<colum<<endl;}intmax_value(intx,intmax)//定义max_value函数{if(x>max)returnx;//如果x>max,函数返回值为xelsereturnmax;//如果x≤max,函数返回值为max}2.用数组名作函数参数可以用数组名作函数参数,此时实参与形参都用数组名(也可以用指针变量,见第6章)。格式: 函数声明
voidselect_sort(intarray[],intn);
函数调用
select_sort(a,10);例:用选择法对数组中10个整数按由小到大排序。所谓选择法就是先将10个数中最小的数与a[0]对换,再将a[1]到a[9]中最小的数与a[1]对换……每比较一轮,找出一个未经排序的数中最小的一个。共比较9轮。#include<iostream>usingnamespacestd;voidselect_sort(intarray[],intn);//函数声明intmain(){inta[10];cout<<"输入10个整数:"<<endl;for(inti=0;i<10;i++)//输入10个数
cin>>a[i];cout<<endl;select_sort(a,10);//函数调用,数组名作实参
cout<<"已排序的数组:"<<endl;for(inti=0;i<10;i++)//输出10个已排好序的数
cout<<a[i]<<"";cout<<endl;return0;}voidselect_sort(intarray[
],
intn)//形参array是数组名{intk,t;for(inti=0;i<n-1;i++){
k=i;for(intj=i+1;j<n;j++)//找没排序的元素中最小者的下标if(array[j]<array[k])k=j;
t=array[k];array[k]=array[i];array[i]=t;}}注意:数组名代表数组首元素的地址,并不代表数组中的全部元素。因此用数组名作函数实参时,不是把实参数组的值传递给形参,而只是将实参数组首元素的地址传递给形参。a[0]a[1]a[2]a[0][1]a[0][4]a[0][4]a[0][4]a声明形参数组并不意味着真正建立一个包含若干元素的数组,在调用函数时也不对它分配存储单元,只是用array[]这样的形式表示array是一维数组名,以接收实参传来的地址。因此array[]中方括号内的数值并无实际作用,编译系统对一维数组方括号内的内容不予处理。形参一维数组的声明中可以写元素个数,也可以不写。因此,传递数组时,一般还需传递数组元素的个数。函数首部的下面几种写法都合法,作用相同。voidselect_sort(intarray[10],intn)//指定元素个数与实参数组相同voidselect_sort(intarray[],intn)//不指定元素个数voidselect_sort(intarray[5],intn)//指定元素个数与实参数组不同3.用多维数组名作函数参数如果用二维数组名作为实参和形参,在对形参数组声明时,必须指定第二维(即列)的大小,且应与实参的第二维的大小相同。第一维的大小可以指定,也可以不指定。如intarray[3][10]//形参数组的两个维都指定或
intarray[][10]//第一维大小省略二者都合法而且等价。但是不能把第二维的大小省略。例:编写程序①初始化一个矩阵A(5×5),元素值取自随机函数,并输出;②将其传递给函数,实现矩阵转置;③在主函数中输出结果。标准库<cstdlib>提供两个帮助生成伪随机数的函数。函数一:intrand(void); 返回一个在零到RAND_MAX
之间的伪随机整数。
j=(int)(n*rand()/(RAND_MAX+1.0)) //产生一个0到n之间的随机数函数二:voidsrand(unsignedseed);
rand函数实际上生成的是伪随机数,程序每次执行时产生的序列都是重复的。可使用srand函数来初始化随机数生成器。
voidsrand(unsignedintseed);#include<iostream>#include<cstdlib>#include<iomanip>usingnamespacestd;voidtranspose(intA[][5],intm,intn);voidprintA(intA[][5],intm,intn);intmain(){intA[5][5];unsignedseed;cout<<"Enterseed:";cin>>seed;srand(seed);for(inti=0;i<5;i++){for(intj=0;j<5;j++)A[i][j]=rand();}printA(A,5,5);transpose(A,5,5);cout<<"\n转置之后:\n";printA(A,5,5);}voidtranspose(intA[][5],intm,intn){inttemp;for(inti=0;i<m;i++)for(intj=0;j<n;j++){if(i>j){temp=A[i][j];A[i][j]=A[j][i];A[j][i]=temp;}}}voidprintA(intA[][5],intm,intn){for(inti=0;i<5;i++){for(intj=0;j<5;j++)cout<<setw(7)<<A[i][j];cout<<endl;}}5.5字符数组用来存放字符数据的数组是字符数组,字符数组中的一个元素存放一个字符。字符数组具有数组的共同属性。一般的字符数组的操作和前面介绍的类似,本节主要讲解用字符数组存放C串。1.C串的结构一个C串是一个字符序列,用来表示各种名字或者文字说明。每个字符占据1个字节,字符序列的最后总是添加有一个结束标志“\0”。'H''e''l''l''o''!''\0'2.C串的初始化与赋值
charcolor[]="blue";或
charcolor[]={'b','l','u','e','\0'};也可从键盘接收字符串,如:
chars[20];
cin.getline(s,19,'\n'); cout<<s<<endl;cin.getline带三个参数,一个存储该文本的字符数组、一个长度和一个定界字符。第三个参数的默认值是'\n',因此也可省略。写成
cin.getline(s,19);3.C串的访问#include<iostream>#include<iomanip>usingnamespacestd;intmain(){chara[]="new";a[1]='o';cout<<a<<endl;}4.C串的操作C串不能直接比较!#include<iostream>#include<cstring>usingnamespacestd;intmain(){chars1[6]="Hello";chars2[6]="Hello";cout<<(s1==s2?"":"not")<<"equal\n";if(!strcmp(s1,s2))cout<<"equal"<<endl;return0;}输出是什么?专门操作C-串的库函数:函数原型函数说明size_tstrlen(constchar*s)确定字符串的长度(终止符之前的字符个数)char*strcpy(char*s1,constchar*s2)将s2复制到字符数组s1中char*strcat(char*s1,constchar*s2)将s2追加到s1中intstrcmp(constchar*s1,constchar*s2)比较s1和s2,在s1等于、小于或大于s2时,分别返回0、小于0的值、大于0的值char*strrev(constchar*s)将s倒置char*strset(char*s,intch)将s全置为ch,ch为要设置的字符char*strstr(constchar*s1,constchar*s2)查找s1中第一次出s2的位置,如找到,返回指向匹配串的指针,否则返回NULL5.6字符串类用字符数组来存放字符串并不是最理想和最安全的方法。C++提供了一种新的数据类型——字符串类型(string类型),在使用方法上,它和char、int类型一样,可以用来定义变量,这就是字符串变量——用一个名字代表一个字符序列。实际上,string并不是C++语言本身具有的基本类型,它是在C++标准库中声明的一个字符串类,用这种类可以定义对象。每一个字符串变量都是string类的一个对象。字符串类string提供了复制、查找等典型串操作,并能自动分配存储空间。string类包含在头文件<string>中。⑴string的构造stringstr1;//建立空串str1="ok";//用字符串常量给str1赋值stringstr2="ok";//定义str2同时对其初始化charch[]="yes";stringstr3("ok");//用字符串常量初始化stringstr4(ch);//用C串初始化stringstr5(str1);//用str1初始化⑵string字符元素的访问str[i] //返回str中索引i处字符的引用,不检查是否出界str.at(i) //返回str中索引i处字符的引用,检查是否出界⑶string的运算符str1=str2; //str1成为str2的副本str1+=str2; //str2的字符数据连接到str1的尾部str1+str2; //返回一个字符串,它将str2的字符数据连接到str1的尾部str1==str2;str1!=str2; str1<str2;str1>str2;str1<=str2;str1>=str2; //字符串的比较,返回布尔值⑷string的输入输出cin>>string1; //从键盘输入一个字符串给字符串变量string1cout<<string2; //将字符串string2输出stringstr;
getline(cin,str);//不能用cin.getline(str,20)!
cout<<str<<endl;⑸string的成员函数str.substr(pos,length1)//返回str的一个子串,从pos位置起,长为length1个字符str.empty()//检查是否为空串str.insert(pos,str2)//将str2插入str的pos处str.remove(pos,length1)//从str的位置pos处,删除长度为length1的子串str.find(str1)//返回str1首次在str中出现的索引str.length()//返回串的长度例:#include<iostream>#include<string>usingnamespacestd;intmain(){strings1("abc");strings2="bsdf";strings3;s3=s1+s2;cout<<s3<<end
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023二年级数学上册 七 分一分与除法第2课时 分苹果配套教学设计 北师大版
- 公司对外投资协议合同样本
- 高校思想政治工作创新路径与实践探索
- 兄弟分房合同标准文本
- 低空经济产业园发展规划
- 仪器检测技术合同样本
- 产业园区污水管网升级改造方案初步设计
- 代理代办业务合同样本
- 买车个人分期付款合同样本
- 公司体检合同标准文本
- 2025年03月“蓉漂人才荟”都江堰市事业单位赴外引进高层次人才(4人)笔试历年典型考题(历年真题考点)解题思路附带答案详解
- 2025山东电工电气集团社会招聘177人笔试参考题库附带答案详解
- 新增值税法的变化要点与实务要领
- 2025年山东省青岛市高考地理一模试卷
- 育婴师综合素质试题及答案展示
- 医院培训课件:《医疗安全(不良)事件报告制度》
- 物理-重庆市南开中学高2025届高三第七次质量检测暨3月月考试题和答案
- 2025年湖北省部分高中高三语文3月一模联考试卷附答案解析
- 2025届高考地理二轮复习高考非选择题专练专练八以世界典型区域为背景的综合题含解析
- 2025年单位节日集体福利慰问品采购合同8篇
- 2025年三一物理面试题及答案
评论
0/150
提交评论