版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第六章数组指针与字符串信息学院陈晋音C++语言程序设计1第六章数组指针与字符串信息学院陈晋音C++语言程序本章主要内容数组指针动态存储分配指针与数组指针与函数字符串2本章主要内容数组2数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。数组属于构造类型。3数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,一维数组的声明与引用一维数组的声明类型说明符数组名[常量表达式];
例如:inta[10];
表示a为整型数组,有10个元素:a[0]...a[9]引用必须先声明,后使用。只能逐个引用数组元素,而不能一次引用整个数组
例如:a[0]=a[5]+a[7]-a[2*3]数组名的构成方法与一般变量名相同。4一维数组的声明与引用一维数组的声明引用数组名的构成方法与一般例6.1一维数组的声明与引用#include<iostream>usingnamespacestd;intmain(){ intA[10],B[10]; inti; for(i=0;i<10;i++) {
A[i]=i*2-1;
B[10-i-1]=A[i]; }for(i=0;i<10;i++){ cout<<"A["<<i<<"]="<<A[i]; cout<<"B["<<i<<"]="<<B[i]<<endl; }}5例6.1一维数组的声明与引用#include<iostr一维数组的存储顺序数组元素在内存中顺次存放,它们的地址是连续的。例如:具有10个元素的数组a,在内存中的存放次序如下:数组名字是数组首元素的内存地址。数组名是一个常量,不能被赋值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a6一维数组的存储顺序数组元素在内存中顺次存放,它们的地址是连续一维数组的初始化可以在编译阶段使数组得到初值:在声明数组时对数组元素赋以初值。
例如:inta[10]={0,1,2,3,4,5,6,7,8,9};可以只给一部分元素赋初值。
例如:inta[10]={0,1,2,3,4};在对全部数组元素赋初值时,可以不指定数组长度。
例如:inta[]={1,2,3,4,5};7一维数组的初始化可以在编译阶段使数组得到初值:7#include<iostream>usingnamespacestd;intmain(){ inti; staticintf[20]={1,1};//初始化第0、1个数 for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];//求第2~19个数 for(i=0;i<20;i++)//输出,每行5个数// { if(i%5==0)cout<<endl;
out.width(12);//设置输出宽度为12 cout<<f[i]; }}例:用数组来处理求Fibonacci数列问题8#include<iostream>例:用数组来处理求Fib二维数组的声明及引用数据类型标识符[常量表达式1][常量表达式2]…;例:inta[5][3];表示a为整型二维数组,其中第一维有5个下标(0~4),第二维有3个下标(0~2)9二维数组的声明及引用数据类型标识符[常量表达式1][常量存储顺序按行存放,上例中数组a的存储顺序为:
二维数组的声明类型说明符数组名[常量表达式][常量表达式]例如:floata[3][4];a00a01a02a03a10a11a12a13a20a21a22a23a[0]——a00a01a02a03a[1]——a10a11a12a13
a[2]——a20a21a22a23a可以理解为:引用例如:b[1][2]=a[2][3]/2
下标不要越界二维数组的声明及引用10存储顺序二维数组的声明a00a01a02a03a1将所有数据写在一个{}内,按顺序赋值例如: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},{0,6},{0,0,11}};二维数组的初始化11将所有数据写在一个{}内,按顺序赋值二维数组的初始化11数组作为函数参数数组元素作实参,与单个变量一样。数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。12数组作为函数参数数组元素作实参,与单个变量一样。12例6-2使用数组名作为函数参数主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。13例6-2使用数组名作为函数参数主函数中初始化一个矩阵并将每#include<iostream>usingnamespacestd;voidRowSum(intA[][4],intnrow){ intsum; for(inti=0;i<nrow;i++) { sum=0;
for(intj=0;j<4;j++)
sum+=A[i][j]; cout<<"Sumofrow"<<i
<<"is"<<sum<<endl;A[i][0]=sum; }}1414#include<iostream>1414intmain(){ intTable[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}}; for(inti=0;i<3;i++) { for(intj=0;j<4;j++) cout<<Table[i][j]<<""; cout<<endl; } RowSum(Table,3);
for(inti=0;i<3;i++)
cout<<Table[i][0]}1515intmain()1515运行结果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is181014181616运行结果:1616例6-5指针的声明、赋值与使用#include<iostream>usingnamespacestd;intmain(){ int*i_pointer; //声明int型指针i_pointer inti; //声明int型数i i_pointer=&i; //取i的地址赋给i_pointer i=10; //int型数赋初值 cout<<"Outputinti="<<i<<endl; //输出int型数的值 cout<<"Outputintpointeri="<<*i_pointer<<endl; //输出int型指针所指地址的内容}程序运行的结果是:Outputinti=10Outputintpointeri=1017例6-5指针的声明、赋值与使用#include<iost指向数组元素的指针声明与赋值例:inta[10],*pa;pa=&a[0];或pa=a;通过指针引用数组元素经过上述声明及赋值后:*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i),pa[i]都是等效的。a++;18指向数组元素的指针声明与赋值a++;18例6-7(P174)设有一个int型数组a,有10个元素。用三种方法输出各元素:使用数组名和下标使用数组名和指针运算使用指针变量19例6-7(P174)设有一个int型数组a,有10个元素。intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<a[i];}使用数组名和下标2020使用数组名和下标2020intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<*(a+i);}使用数组名指针运算21使用数组名指针运算21使用指针变量intmain(){inta[10];int*p,i;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(p=a;p<(a+10);p++)cout<<*p;}22使用指针变量22指针数组数组的元素是指针型例:Point*pa[2];//存放指针的数组
由pa[0],pa[1]两个指针组成23指针数组数组的元素是指针型23例6-8利用指针数组存放单位矩阵(P176)#include<iostream>usingnamespacestd;intmain(){ intline1[]={1,0,0};//声明数组,矩阵的第一行 intline2[]={0,1,0};//声明数组,矩阵的第二行 intline3[]={0,0,1};//声明数组,矩阵的第三行 int*p_line[3]; //声明整型指针数组 p_line[0]=line1; //初始化指针数组元素 p_line[1]=line2; p_line[2]=line3;24例6-8利用指针数组存放单位矩阵(P176)#inclu //输出单位矩阵cout<<"Matrixtest:"<<endl; for(inti=0;i<3;i++) //对指针数组元素循环 { for(intj=0;j<3;j++) //对矩阵每一行循环 {cout<<p_line[i][j]<<"";} cout<<endl; }}输出结果为:Matrixtest:1,0,00,1,00,0,12525 //输出单位矩阵输出结果为:2525例6-9二维数组举例#include<iostream>usingnamespacestd;intmain(){ intarray2[2][3]={{11,12,13},{21,22,23}};for(inti=0;i<2;i++){cout<<*(array2+i)<<endl; for(intj=0;j<3;j++){cout<<*(*(array2+i)+j)<<"";//或者cout<<array2[i][j]<<"";} cout<<endl; }}0X0065FDE011,12,130X0065FDEC21,22,2326例6-9二维数组举例#include<iostream以指针作为函数参数以地址方式传递数据,可以用来返回函数处理结果。实参是数组名时形参可以是指针。27以指针作为函数参数以地址方式传递数据,可以用来返回函数处理结例6.10(P178)题目:读入三个浮点数,将整数部分和小数部分分别输出#include<iostream>usingnamespacestd;voidsplitfloat(floatx,int*intpart,float*fracpart){//形参intpart、fracpart是指针
*intpart=int(x);
//取x的整数部分
*fracpart=x-*intpart;
//取x的小数部分}28例6.10(P178)题目:读入三个浮点数,将整数部分和小intmain(){ inti,n; floatx,f;
cout<<"Enterthree(3)floatingpointnumbers"<<endl; for(i=0;i<3;i++) { cin>>x; splitfloat(x,&n,&f);//变量地址做实参 cout<<"IntegerPartis"<<n
<<"FractionPartis"<<
f<<endl; }}2929intmain()2929运行结果:Enterthree(3)floatingpointnumbers4.7IntegerPartis4FractionPartis0.78.913IntegerPartis8FractionPartis0.913-4.7518IntegerPartis-4FractionPartis-0.75183030运行结果:3030例:输出数组元素的内容和地址#include<iostream>#include<iomanip>usingnamespacestd;voidArray_Ptr(long*P,intn){ inti; cout<<"Infunc,addressofarrayis"
<<unsignedlong(P)<<endl; cout<<"Accessingarrayinthefunctionusingpointers"
<<endl; for(i=0;i<n;i++) { cout<<"Addressforindex"<<i<<"is"
<<unsignedlong(P+i); cout<<"Valueis"<<*(P+i)<<endl; }}31例:输出数组元素的内容和地址#include<iostrintmain(){ longlist[5]={50,60,70,80,90};
cout<<"Inmain,addressofarrayis"<<unsignedlong(list)<<endl; cout<<endl;
Array_Ptr(list,5);}32intmain()32运行结果:Inmain,addressofarrayis6684132Infunc,addressofarrayis6684132AccessingarrayinthefunctionusingpointersAddressforindex0is6684132Valueis50Addressforindex1is6684136Valueis60Addressforindex2is6684140Valueis70Addressforindex3is6684144Valueis80Addressforindex4is6684148Valueis903333运行结果:3333指向常量的指针做形参#include<iostream>usingnamespacestd;constintN=6;voidprint(constint*p,intn);intmain(){intarray[N];for(inti=0;i<N;i++)cin>>array[i];print(array,N);}34指向常量的指针做形参#include<iostream>34voidprint(constint*p,intn){cout<<"{"<<*p;for(inti=1;i<n;i++)cout<<"."<<*(p+i);cout<<"}"<<endl;}3535voidprint(constint*p,intn指针型函数当函数的返回值是地址时,该函数就是指针形函数。声明形式存储类型数据类型*函数名()36指针型函数当函数的返回值是地址时,该函数就是指针形函数。36声明形式存储类型数据类型(*函数指针名)();
含义:数据指针指向数据存储区,而函数指针指向的是程序代码存储区。指向函数的指针37声明形式指向函数的指针37例6-11函数指针#include<iostream>usingnamespacestd;voidprint_stuff(floatdata_to_ignore);voidprint_message(floatlist_this_data);voidprint_float(floatdata_to_print);void(*function_pointer)(float); intmain() { floatpi=(float)3.14159; floattwo_pi=(float)2.0*pi;38例6-11函数指针#include<iostream>38print_stuff(pi);
function_pointer=print_stuff;function_pointer(pi);function_pointer=print_message;function_pointer(two_pi);function_pointer(13.0);function_pointer=print_float;function_pointer(pi);print_float(pi);}3939print_stuff(pi);3939voidprint_stuff(floatdata_to_ignore){ cout<<"Thisistheprintstufffunction.\n";}voidprint_message(floatlist_this_data){ cout<<"Thedatatobelistedis"<<list_this_data<<endl;}voidprint_float(floatdata_to_print){ cout<<"Thedatatobeprintedis"<<data_to_print<<endl;}4040voidprint_stuff(floatdata_to运行结果:Thisistheprintstufffunction.Thisistheprintstufffunction.Thedatatobelistedis6.283180Thedatatobelistedis13.000000Thedatatobeprintedis3.141590Thedatatobeprintedis3.1415904141运行结果:4141对象数组(P163)声明:类名数组名[元素个数];Personp[4];访问方法:通过下标访问数组名[下标].成员名
p[0].GetName();42对象数组(P163)声明:42对象数组初始化数组中每一个元素对象被创建时,系统都会调用类构造函数初始化该对象。通过初始化列表赋值。例:
PointA[2]={Point(1,2),Point(3,4)};如果没有为数组元素指定显式初始值,数组元素便使用默认值初始化(调用默认构造函数)。43对象数组初始化数组中每一个元素对象被创建时,系统都会调用类构数组元素所属类的构造函数不声明构造函数,则采用默认构造函数。各元素对象的初值要求为相同的值时,可以声明具有默认形参值的构造函数。各元素对象的初值要求为不同的值时,需要声明带形参的构造函数。当数组中每一个对象被删除时,系统都要调用一次析构函数。44数组元素所属类的构造函数不声明构造函数,则采用默认构造函数。例6-3对象数组应用举例//Point.h#if!defined(_POINT_H)#define_POINT_Hclass
Point{public:
Point();Point(intxx,intyy);~Point();voidMove(intx,inty);intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};#endif45例6-3对象数组应用举例//Point.h45//6-2.cpp#include<iostream>usingnamespacestd;#include"Point.h"Point::Point(){X=Y=0;cout<<"DefaultConstructorcalled."<<endl;}Point::Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled."<<endl;}Point::~Point(){cout<<"Destructorcalled."<<endl;}voidPoint::Move(intx,inty){X=x;Y=y;}4646//6-2.cpp4646#include<iostream>#include"Point.h"usingnamespacestd;intmain(){cout<<"Enteringmain..."<<endl;
PointA[2];for(inti=0;i<2;i++)
A[i].Move(i+10,i+20);cout<<"Exitingmain..."<<endl;
return0;}47Enteringmain...DefaultConstructorcalled.DefaultConstructorcalled.Exitingmain...Destructorcalled.Destructorcalled.47#include<iostream>47Enteringm对象指针的一般概念(P181)声明形式类名*对象指针名;例PointA(5,10);Piont*ptr;ptr=&A;通过指针访问对象成员对象指针名->成员名ptr->getx()相当于(*ptr).getx();48对象指针的一般概念(P181)声明形式48对象指针应用举例intmain(){PointA(5,10);
Point*ptr;ptr=&A; intx; x=ptr->GetX(); cout<<x<<endl;return0;}49对象指针应用举例intmain()49this指针隐含于每一个类的成员函数中的特殊指针。明确地指出了成员函数当前所操作的数据所属的对象。当通过一个对象调用成员函数时,系统先将该对象的地址赋给this指针,然后调用成员函数,成员函数对对象的数据成员进行操作时,就隐含使用了this指针。50this指针隐含于每一个类的成员函数中的特殊指针。50this指针例如:Point类的构造函数体中的语句:X=xx;Y=yy;相当于:this->X=xx;this->Y=yy;51this指针例如:Point类的构造函数体中的语句:51指向类的非静态成员的指针通过指向成员的指针只能访问公有成员声明指向成员的指针声明指向公有数据成员的指针类型说明符类名::*指针名; 声明指向公有函数成员的指针类型说明符(类名::*指针名)(参数表);52指向类的非静态成员的指针通过指向成员的指针只能访问公有成员5指向类的非静态成员的指针指向数据成员的指针说明指针应该指向哪个成员指针名=&类名::数据成员名;通过对象名(或对象指针)与成员指针结合来访问数据成员对象名.*类成员指针名或:对象指针名—>*类成员指针名53指向类的非静态成员的指针指向数据成员的指针53指向类的非静态成员的指针指向函数成员的指针初始化指针名=类名::函数成员名;通过对象名(或对象指针)与成员指针结合来访问函数成员(对象名.*类成员指针名)(参数表)或:(对象指针名—>*类成员指针名)(参数表)54指向类的非静态成员的指针指向函数成员的指针54指向类的非静态成员的指针例6-13访问对象的公有成员函数的不同方式intmain() //主函数{ PointA(4,5); //声明对象A Point*p1=&A; //声明对象指针并初始化
int(Point::*p_GetX)()=Point::GetX;//声明成员函数指针并初始化
cout<<(A.*p_GetX)()<<endl;//(1)使用成员函数指针访问成员函数 cout<<(p1->GetX)()<<endl;//(2)使用对象指针访问成员函数
cout<<A.GetX()<<endl;//(3)使用对象名访问成员函数}55指向类的非静态成员的指针例6-13访问对象的公有成员函数指向类的静态成员的指针对类的静态成员的访问不依赖于对象可以用普通的指针来指向和访问静态成员例6-14通过指针访问类的静态数据成员例6-15通过指针访问类的静态函数成员56指向类的静态成员的指针对类的静态成员的访问不依赖于对象56例6-14通过指针访问类的静态数据成员#include<iostream>usingnamespacestd;classPoint //Point类声明{public: //外部接口 Point(intxx=0,intyy=0){X=xx;Y=yy;countP++;}//构造函数 Point(Point&p); //拷贝构造函数 intGetX(){returnX;} intGetY(){returnY;}
staticintcountP; //静态数据成员引用性说明private: //私有数据成员 intX,Y;};Point::Point(Point&p){ X=p.X;Y=p.Y;countP++;}intPoint::countP=0; //静态数据成员定义性说明57例6-14通过指针访问类的静态数据成员#include<iintmain() //主函数{//声明一个int型指针,指向类的静态成员 int*count=&Point::countP; PointA(4,5); //声明对象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY();
//直接通过指针访问静态数据成员 cout<<"Objectid="<<*count<<endl; PointB(A); //声明对象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY();//直接通过指针访问静态数据成员 cout<<"Objectid="<<*count<<endl; }5858intmain() //主函数5858例6-15通过指针访问类的静态函数成员#include<iostream>usingnamespacestd;classPoint //Point类声明{public: //外部接口 //其它函数略 staticvoidGetC()//静态函数成员{cout<<"Objectid="<<countP<<endl;}private: //私有数据成员 intX,Y; staticintcountP; //静态数据成员引用性说明};//函数实现略intPoint::countP=0; //静态数据成员定义性说明59例6-15通过指针访问类的静态函数成员#include<iintmain() //主函数{//指向函数的指针,指向类的静态成员函数 void(*gc)()=Point::GetC; PointA(4,5); //声明对象A cout<<"PointA,"<<A.GetX()<<","<<A.GetY(); gc();//输出对象序号,通过指针访问静态函数成员 PointB(A); //声明对象B cout<<"PointB,"<<B.GetX()<<","<<B.GetY(); gc();//输出对象序号,通过指针访问静态函数成员}6060intmain() //主函数6060动态申请内存操作符newnew类型名T(初值列表)功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。结果值:成功:T类型的指针,指向新分配的内存。失败:0(NULL)61动态申请内存操作符newnew类型名T(初值列表)61释放内存操作符deletedelete指针P功能:释放指针P所指向的内存。P必须是new操作的返回值。62释放内存操作符deletedelete指针P62例6-16动态创建对象举例#include<iostream>usingnamespacestd;classPoint{public:Point(){X=Y=0;cout<<"DefaultConstructorcalled.\n";}Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled.\n";}~Point(){cout<<"Destructorcalled.\n";}intGetX(){returnX;}intGetY(){returnY;} voidMove(intx,inty) {X=x;Y=y;}private:intX,Y;};63例6-16动态创建对象举例#include<iostreaintmain(){cout<<"StepOne:"<<endl;Point*Ptr1=newPoint;deletePtr1;cout<<"StepTwo:"<<endl;Ptr1=newPoint(1,2);deletePtr1;return0;}运行结果:StepOne:DefaultConstructorcalled.Destructorcalled.StepTwo:Constructorcalled.Destructorcalled.6464intmain()运行结果:6464例6-17动态创建对象数组举例#include<iostream>usingnamespacestd;classPoint{//类的声明同例6-16,略};intmain(){Point*Ptr=newPoint[2];//创建对象数组Ptr[0].Move(5,10);//通过指针访问数组元素的成员Ptr[1].Move(15,20);//通过指针访问数组元素的成员cout<<"Deleting..."<<endl;delete[]Ptr;//删除整个对象数组return0;}65例6-17动态创建对象数组举例#include<iostre运行结果:DefaultConstructorcalled.DefaultConstructorcalled.Deleting...Destructorcalled.Destructorcalled.6666运行结果:6666例6-18动态数组类#include<iostream>usingnamespacestd;classPoint{//类的声明同例6-16…};classArrayOfPoints{public:ArrayOfPoints(intn){numberOfPoints=n;points=newPoint[n];}~ArrayOfPoints(){cout<<"Deleting..."<<endl;numberOfPoints=0;delete[]points;}Point&Element(intn){returnpoints[n];}private:Point*points;intnumberOfPoints;};6767例6-18动态数组类#include<iostream>67intmain(){ intnumber; cout<<"Pleaseenterthenumberofpoints:"; cin>>number;//创建对象数组ArrayOfPointspoints(number);//通过指针访问数组元素的成员points.Element(0).Move(5,10);//通过指针访问数组元素的成员points.Element(1).Move(15,20);}6868intmain()6868运行结果如下:Pleaseenterthenumberofpoints:2DefaultConstructorcalled.DefaultConstructorcalled.Deleting...Destructorcalled.Destructorcalled.6969运行结果如下:6969动态创建多维数组new类型名T[下标表达式1][下标表达式2]…;如果内存申请成功,new运算返回一个指向新分配内存首地址的指针,是一个T类型的数组,数组元素的个数为除最左边一维外各维下标表达式的乘积。例如:char(*fp)[3];fp=newchar[2][3];70动态创建多维数组new类型名T[下标表达式1][下标表达char(*fp)[3];fpfp+1fp[0][0]fp[0][1]fp[0][2]fp[1][0]fp[1][1]fp[1][2]7171char(*fp)[3];fpfp+1fp[0][0]fp例6-18动态创建多维数组#include<iostream>usingnamespacestd;intmain(){ float(*cp)[9][8]; inti,j,k; cp=newfloat[8][9][8]; for(i=0;i<8;i++) for(j=0;j<9;j++) for(k=0;k<9;k++) *(*(*(cp+i)+j)+k)=i*100+j*10+k;//通过指针访问数组元素72例6-18动态创建多维数组#include<iostreamfor(i=0;i<8;i++) { for(j=0;j<9;j++) {for(k=0;k<8;k++) //将指针cp作为数组名使用,//通过数组名和下标访问数组元素cout<<cp[i][j][k]<<""; cout<<endl; } cout<<endl; }}7373for(i=0;i<8;i++)7373用字符数组存储和处理字符串字符数组的声明和引用例:staticcharstr[8]={112,114,111,103,114,97,109,0};
staticcharstr[8]={'p','r','o','g','r','a','m','\0'};
staticcharstr[8]="program";
staticcharstr[]="program";字符串字符串常量,例如:"china"没有字符串变量,用字符数组来存放字符串字符串以'\0'为结束标志字符数组的初始化74用字符数组存储和处理字符串字符数组的声明和引用例:stati例6-22输出一个字符串#include<iostream>usingnamespacestd;intmain(){staticcharc[10]={'I','','a','m','','a','','b','o','y'};inti;for(i=0;i<10;i++) cout<<c[i];cout<<endl;}运行结果:Iamaboy75例6-22输出一个字符串#include<iostream例6-23输出一个钻石图形#include<iostream>usingnamespacestd;intmain(){staticchardiamond[][5]={{'','','*'},{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}}; inti,j; for(i=0;i<5;i++) {for(j=0;j<5&&diamond[i][j]!=0;j++) cout<<diamond[i][j]; cout<<endl; }}运行结果:
********
76例6-23输出一个钻石图形#include<iostrea字符串的输入/输出方法逐个字符输入输出将整个字符串一次输入或输出
例:charc[]="China";
cout<<c;注意输出字符不包括'\0'输出字符串时,输出项是字符数组名,输出时遇到'\0'结束。输入多个字符串时,以空格分隔;输入单个字符串时其中不能有空格。77字符串的输入/输出方法77例如:程序中有下列语句:staticcharstr1[5],str2[5],str3[5];cin>>str1>>str2>>str3;运行时输入数据:Howareyou?内存中变量状态如下:str1:How\0str2:are\0str3:you?\07878例如:内存中变量状态如下:7878若改为:staticcharstr[13];cin>>str;运行时输入数据:Howareyou?内存中变量str内容如下:str:How\07979若改为:内存中变量str内容如下:7979用字符数组存储和处理字符串注意!若有如下声明:chara[4],*p1,*p2;错误的:
a="abc";
cin>>p1;正确的:
p1="abc";
p2=a;cin>>p2;80用字符数组存储和处理字符串注意!若有如下声明:80整行输入字符串cin.getline(字符数组名St,字符个数N,结束符);功能:一次连续读入多个字符(可以包括空格),直到读满N个,或遇到指定的结束符(默认为'\n')。读入的字符串存放于字符数组St中。读取但不存储结束符。cin.get(字符数组名St,字符个数N,结束符);功能:一次连续读入多个字符(可以包括空格),直到读满N个,或遇到指定的结束符(默认为'\n')。读入的字符串存放于字符数组St中。
既不读取也不存储结束符。81整行输入字符串cin.getline(字符数组名St,字符整行输入字符串举例#include<iostream>usingnamespacestd;voidmain(void){ charcity[80];
charstate[80]; inti; for(i=0;i<2;i++) {cin.getline(city,80,','); cin.getline(state,80,'\n'); cout<<"City:"<<city<<"State:"
<<state<<endl; }}82整行输入字符串举例#include<iostream>82运行结果Beijing,ChinaCity:BeijingCountry:ChinaShanghai,ChinaCity:ShanghaiCountry:China83运行结果Beijing,China83字符串处理函数strcat(连接),strcpy(复制),
strcmp(比较),strlen(求长度),
strlwr(转换为小写),
strupr(转换为大写)头文件<cstring>84字符串处理函数strcat(连接),strcpy(复制),
例6.21string类应用举例#include<string>#include<iostream>usingnamespacestd;voidtrueFalse(intx){cout<<(x?"True":"False")<<endl;}85例6.21string类应用举例#include<strintmain(){stringS1="DEF",S2="123";charCP1[]="ABC";charCP2[]="DEF";cout<<"S1is"<<S1<<endl;cout<<"S2is"<<S2<<endl;cout<<"lengthofS2:"<<S2.length()<<endl;cout<<"CP1is"<<CP1<<endl;cout<<"CP2is"<<CP2<<endl;cout<<"S1<=CP1returned";
trueFalse(S1<=CP1);
cout<<"CP2<=S1returned";
trueFalse(CP2<=S1);
S2+=S1;cout<<"S2=S2+S1:"<<S2<<endl;cout<<"lengthofS2:"<<S2.length()<<endl;}8686intmain()8686本讲完!8787第六章数组指针与字符串信息学院陈晋音C++语言程序设计88第六章数组指针与字符串信息学院陈晋音C++语言程序本章主要内容数组指针动态存储分配指针与数组指针与函数字符串89本章主要内容数组2数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。数组属于构造类型。90数组的概念数组是具有一定顺序关系的若干相同类型变量的集合体,一维数组的声明与引用一维数组的声明类型说明符数组名[常量表达式];
例如:inta[10];
表示a为整型数组,有10个元素:a[0]...a[9]引用必须先声明,后使用。只能逐个引用数组元素,而不能一次引用整个数组
例如:a[0]=a[5]+a[7]-a[2*3]数组名的构成方法与一般变量名相同。91一维数组的声明与引用一维数组的声明引用数组名的构成方法与一般例6.1一维数组的声明与引用#include<iostream>usingnamespacestd;intmain(){ intA[10],B[10]; inti; for(i=0;i<10;i++) {
A[i]=i*2-1;
B[10-i-1]=A[i]; }for(i=0;i<10;i++){ cout<<"A["<<i<<"]="<<A[i]; cout<<"B["<<i<<"]="<<B[i]<<endl; }}92例6.1一维数组的声明与引用#include<iostr一维数组的存储顺序数组元素在内存中顺次存放,它们的地址是连续的。例如:具有10个元素的数组a,在内存中的存放次序如下:数组名字是数组首元素的内存地址。数组名是一个常量,不能被赋值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a93一维数组的存储顺序数组元素在内存中顺次存放,它们的地址是连续一维数组的初始化可以在编译阶段使数组得到初值:在声明数组时对数组元素赋以初值。
例如:inta[10]={0,1,2,3,4,5,6,7,8,9};可以只给一部分元素赋初值。
例如:inta[10]={0,1,2,3,4};在对全部数组元素赋初值时,可以不指定数组长度。
例如:inta[]={1,2,3,4,5};94一维数组的初始化可以在编译阶段使数组得到初值:7#include<iostream>usingnamespacestd;intmain(){ inti; staticintf[20]={1,1};//初始化第0、1个数 for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];//求第2~19个数 for(i=0;i<20;i++)//输出,每行5个数// { if(i%5==0)cout<<endl;
out.width(12);//设置输出宽度为12 cout<<f[i]; }}例:用数组来处理求Fibonacci数列问题95#include<iostream>例:用数组来处理求Fib二维数组的声明及引用数据类型标识符[常量表达式1][常量表达式2]…;例:inta[5][3];表示a为整型二维数组,其中第一维有5个下标(0~4),第二维有3个下标(0~2)96二维数组的声明及引用数据类型标识符[常量表达式1][常量存储顺序按行存放,上例中数组a的存储顺序为:
二维数组的声明类型说明符数组名[常量表达式][常量表达式]例如:floata[3][4];a00a01a02a03a10a11a12a13a20a21a22a23a[0]——a00a01a02a03a[1]——a10a11a12a13
a[2]——a20a21a22a23a可以理解为:引用例如:b[1][2]=a[2][3]/2
下标不要越界二维数组的声明及引用97存储顺序二维数组的声明a00a01a02a03a1将所有数据写在一个{}内,按顺序赋值例如: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},{0,6},{0,0,11}};二维数组的初始化98将所有数据写在一个{}内,按顺序赋值二维数组的初始化11数组作为函数参数数组元素作实参,与单个变量一样。数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。对形参数组的改变会直接影响到实参数组。99数组作为函数参数数组元素作实参,与单个变量一样。12例6-2使用数组名作为函数参数主函数中初始化一个矩阵并将每个元素都输出,然后调用子函数,分别计算每一行的元素之和,将和直接存放在每行的第一个元素中,返回主函数之后输出各行元素的和。100例6-2使用数组名作为函数参数主函数中初始化一个矩阵并将每#include<iostream>usingnamespacestd;voidRowSum(intA[][4],intnrow){ intsum; for(inti=0;i<nrow;i++) { sum=0;
for(intj=0;j<4;j++)
sum+=A[i][j]; cout<<"Sumofrow"<<i
<<"is"<<sum<<endl;A[i][0]=sum; }}101101#include<iostream>1414intmain(){ intTable[3][4]={{1,2,3,4},{2,3,4,5},{3,4,5,6}}; for(inti=0;i<3;i++) { for(intj=0;j<4;j++) cout<<Table[i][j]<<""; cout<<endl; } RowSum(Table,3);
for(inti=0;i<3;i++)
cout<<Table[i][0]}102102intmain()1515运行结果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is18101418103103运行结果:1616例6-5指针的声明、赋值与使用#include<iostream>usingnamespacestd;intmain(){ int*i_pointer; //声明int型指针i_pointer inti; //声明int型数i i_pointer=&i; //取i的地址赋给i_pointer i=10; //int型数赋初值 cout<<"Outputinti="<<i<<endl; //输出int型数的值 cout<<"Outputintpointeri="<<*i_pointer<<endl; //输出int型指针所指地址的内容}程序运行的结果是:Outputinti=10Outputintpointeri=10104例6-5指针的声明、赋值与使用#include<iost指向数组元素的指针声明与赋值例:inta[10],*pa;pa=&a[0];或pa=a;通过指针引用数组元素经过上述声明及赋值后:*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i),pa[i]都是等效的。a++;105指向数组元素的指针声明与赋值a++;18例6-7(P174)设有一个int型数组a,有10个元素。用三种方法输出各元素:使用数组名和下标使用数组名和指针运算使用指针变量106例6-7(P174)设有一个int型数组a,有10个元素。intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<a[i];}使用数组名和下标107107使用数组名和下标2020intmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<*(a+i);}使用数组名指针运算108使用数组名指针运算21使用指针变量intmain(){inta[10];int*p,i;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(p=a;p<(a+10);p++)cout<<*p;}109使用指针变量22指针数组数组的元素是指针型例:Point*pa[2];//存放指针的数组
由pa[0],pa[1]两个指针组成110指针数组数组的元素是指针型23例6-8利用指针数组存放单位矩阵(P176)#include<iostream>usingnamespacestd;intmain(){ intline1[]={1,0,0};//声明数组,矩阵的第一行 intline2[]={0,1,0};//声明数组,矩阵的第二行 intline3[]={0,0,1};//声明数组,矩阵的第三行 int*p_line[3]; //声明整型指针数组 p_line[0]=line1; //初始化指针数组元素 p_line[1]=line2; p_line[2]=line3;111例6-8利用指针数组存放单位矩阵(P176)#inclu //输出单位矩阵cout<<"Matrixtest:"<<endl; for(inti=0;i<3;i++) //对指针数组元素循环 { for(intj=0;j<3;j++) //对矩阵每一行循环 {cout<<p_line[i][j]<<"";} cout<<endl; }}输出结果为:Matrixtest:1,0,00,1,00,0,1112112 //输出单位矩阵输出结果为:2525例6-9二维数组举例#include<iostream>usingnamespacestd;intmain(){ intarray2[2][3]={{11,12,13},{21,22,23}};for(inti=0;i<2;i++){cout<<*(array2+i)<<endl; for(intj=0;j<3;j++){cout<<*(*(array2+i)+j)<<"";//或者cout<<array2[i][j]<<"";} cout<<endl; }}0X0065FDE011,12,130X0065FDEC21,22,23113例6-9二维数组举例#include<iostream以指针作为函数参数以地址方式传递数据,可以用来返回函数处理结果。实参是数组名时形参可以是指针。114以指针作为函数参数以地址方式传递数据,可以用来返回函数处理结例6.10(P178)题目:读入三个浮点数,将整数部分和小数部分分别输出#include<iostream>usingnamespacestd;voidsplitfloat(floatx,int*intpart,float*fracpart){//形参intpart、fracpart是指针
*intpart=int(x);
//取x的整数部分
*fracpart=x-*intpart;
//取x的小数部分}115例6.10(P178)题目:读入三个浮点数,将整数部分和小intmain(){ inti,n; floatx,f;
cout<<"Enterthree(3)floatingpointnumbers"<<endl; for(i=0;i<3;i++) { cin>>x; splitfloat(x,&n,&f);//变量地址做实参 cout<<"IntegerPartis"<<n
<<"FractionPartis"<<
f<<endl; }}116116intmain()2929运行结果:Enterthree(3)floatingpointnumbers4.7IntegerPartis4FractionPartis0.78.913IntegerPartis8FractionPartis0.913-4.7518IntegerPartis-4FractionPartis-0.7518117117运行结果:3030例:输出数组元素的内容和地址#include<iostream>#include<iomanip>usingnamespacestd;voidArray_Ptr(long*P,intn){ inti; cout<<"Infunc,addressofarrayis"
<<unsignedlong(P)<<endl; cout<<"Accessingarrayinthefunctionusingpointers"
<<endl; for(i=0;i<n;i++) { cout<<"Addressforindex"<<i<<"is"
<<unsignedlong(P+i); cout<<"Valueis"<<*(P+i)<<endl; }}118例:输出数组元素的内容和地址#include<iostrintmain(){ longlist[5]={50,60,70,80,90};
cout<<"Inmain,addressofarrayis"<<unsignedlong(list)<<endl; cout<<endl;
Array_Pt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年全球及中国来曲唑片行业头部企业市场占有率及排名调研报告
- 2025-2030全球医用水刀行业调研及趋势分析报告
- 2024年度河南省国家保安员资格考试题库附答案(典型题)
- 小数除以整数竞赛测试题大全附答案
- 23-24年项目部治理人员安全培训考试题及答案【典优】
- 23年-24年企业主要负责人安全培训考试题答案精练
- 2023年-2024年新员工入职前安全教育培训试题附参考答案【轻巧夺冠】
- 2023年-2024年安全管理人员安全教育培训试题含答案(达标题)
- 超市改造追加项目协议
- 粉煤灰制塑料填料供应协议
- 2023年管理学原理考试题库附答案
- 【可行性报告】2023年电动自行车相关项目可行性研究报告
- 欧洲食品与饮料行业数据与趋势
- 放疗科室规章制度(二篇)
- 中高职贯通培养三二分段(中职阶段)新能源汽车检测与维修专业课程体系
- 浙江省安全员C证考试题库及答案(推荐)
- 目视讲义.的知识
- 洗衣机事业部精益降本总结及规划 -美的集团制造年会
- 房地产公司流动资产管理制度
- 2015-2022年湖南高速铁路职业技术学院高职单招语文/数学/英语笔试参考题库含答案解析
- 铝合金门窗设计说明
评论
0/150
提交评论