第六講數(shù)組、指針、字符串_第1頁
第六講數(shù)組、指針、字符串_第2頁
第六講數(shù)組、指針、字符串_第3頁
第六講數(shù)組、指針、字符串_第4頁
第六講數(shù)組、指針、字符串_第5頁
已閱讀5頁,還剩97頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第六講數(shù)組指針與字符串西安理工大學(xué)理學(xué)院冉占軍C++語言程序設(shè)計(jì)1本講主要內(nèi)容數(shù)組指針動(dòng)態(tài)存儲(chǔ)分配指針與數(shù)組指針與函數(shù)字符串2數(shù)組的概念數(shù)組是具有一定順序關(guān)系的若干相同類型變量的集合體,組成數(shù)組的變量稱為該數(shù)組的元素。數(shù)組屬于構(gòu)造類型。數(shù)組3一維數(shù)組的聲明與引用一維數(shù)組的聲明類型說明符數(shù)組名[常量表達(dá)式];

例如:inta[10];

表示a為整型數(shù)組,有10個(gè)元素:a[0]...a[9]引用必須先聲明,后使用。只能逐個(gè)引用數(shù)組元素,而不能一次引用整個(gè)數(shù)組

例如:a[0]=a[5]+a[7]-a[2*3]數(shù)組名的構(gòu)成方法與一般變量名相同。數(shù)組4例一維數(shù)組的聲明與引用#include<iostream.h>voidmain(){ intA[10],B[10]; inti; for(i=0;i<10;i++) {

A[i]=i*2-1;

B[10-i-1]=A[i]; }數(shù)組for(i=0;i<10;i++) { cout<<"A["<<i<<"]="<<A[i]; cout<<"B["<<i<<"]="<<B[i]<<endl; }}5一維數(shù)組的存儲(chǔ)順序數(shù)組元素在內(nèi)存中順次存放,它們的地址是連續(xù)的。例如:具有10個(gè)元素的數(shù)組a,在內(nèi)存中的存放次序如下:數(shù)組名字是數(shù)組首元素的內(nèi)存地址。數(shù)組名是一個(gè)常量,不能被賦值。a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a數(shù)組6一維數(shù)組的初始化可以在編譯階段使數(shù)組得到初值:在聲明數(shù)組時(shí)對(duì)數(shù)組元素賦以初值。

例如:staticinta[10]={0,1,2,3,4,5,6,7,8,9};可以只給一部分元素賦初值。

例如:staticinta[10]={0,1,2,3,4};//局部靜態(tài)或全局staticintb[10]={0};intb[10]={3};intb[10];在對(duì)全部數(shù)組元素賦初值時(shí),可以不指定數(shù)組長度。

例如:staticinta[]={1,2,3,4,5}數(shù)組7一維數(shù)組應(yīng)用舉例本例循環(huán)從鍵盤讀入若干組選擇題答案,計(jì)算并輸出每組答案的正確率,直到輸入ctrl+z為止。每組連續(xù)輸入5個(gè)答案,每個(gè)答案可以是'a'..'d'。數(shù)組8#include<iostream.h>voidmain(void){ charkey[]={‘a(chǎn)’,‘c’,‘b’,‘a(chǎn)’,‘d’};//正確答案 charc; int ques=0,numques=5,numcorrect=0;

//提示輸入5個(gè)問題的答案

cout<<“Enterthe”<<numques<<“questiontests:”<<endl;

9while(cin.get(c)){if(c!='\n') if(c==key[ques]) {numcorrect++; cout<<""; } elsecout<<"*";else{cout<<"Score"<<float(numcorrect)/numques*100<<"%"; ques=0; //復(fù)位變量 numcorrect=0; cout<<endl; continue;} ques++; }}10運(yùn)行結(jié)果:acbba**Score60%acbadScore100%abbda***Score40%bdcba*****Score0%11二維數(shù)組的聲明及引用數(shù)據(jù)類型標(biāo)識(shí)符[常量表達(dá)式1][常量表達(dá)式2]…;例:inta[5][3];表示a為整型二維數(shù)組,其中第一維有5個(gè)下標(biāo)(0~4),第二維有3個(gè)下標(biāo)(0~2),數(shù)組的元素個(gè)數(shù)為15,可以用于存放5行3列的整型數(shù)據(jù)表格。數(shù)組12存儲(chǔ)順序按行存放,上例中數(shù)組a的存儲(chǔ)順序?yàn)椋?/p>

二維數(shù)組的聲明類型說明符數(shù)組名[常量表達(dá)式][常量表達(dá)式]例如:floata[3][4];a00a01a02a03a10a11a12a13a20a21a22a23a[0]——a00a01a02a03a[1]——a10a11a12a13

a[2]——a20a21a22a23a可以理解為:引用例如:b[1][2]=a[2][3]/2

下標(biāo)不要越界二維數(shù)組的聲明及引用數(shù)組分行給二維數(shù)組賦初值例如:staticinta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};將所有數(shù)據(jù)寫在一個(gè){}內(nèi),按順序賦值例如:staticinta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};可以對(duì)部分元素賦初值例如:staticinta[3][4]={{1},{0,6},{0,0,11}};二維數(shù)組的初始化數(shù)組數(shù)組作為函數(shù)參數(shù)數(shù)組元素作實(shí)參,與單個(gè)變量一樣。數(shù)組名作參數(shù),形、實(shí)參數(shù)都應(yīng)是數(shù)組名,類型要一樣,傳送的是數(shù)組首地址。例:建立一個(gè)二維數(shù)組,按矩陣形式輸出,然后對(duì)每一行求和。數(shù)組15#include<iostream.h>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; }}16voidmain(void){ 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);}17運(yùn)行結(jié)果:123423453456Sumofrow0is10Sumofrow1is14Sumofrow2is1818對(duì)象數(shù)組定義:類名數(shù)組名[元素個(gè)數(shù)];訪問方法:通過下標(biāo)訪問數(shù)組名[下標(biāo)].成員名數(shù)組19對(duì)象數(shù)組初始化數(shù)組中每一個(gè)元素對(duì)象被創(chuàng)建時(shí),系統(tǒng)都會(huì)調(diào)用構(gòu)造函數(shù)類初始化該對(duì)象。通過初始化列表賦值。例:

PointA[2]={Point(1,2),Point(3,4)};如果沒有為數(shù)組元素指定顯式初始值,數(shù)組元素使用缺省值初始化

(調(diào)用缺省構(gòu)造函數(shù))。數(shù)組20數(shù)組元素所屬類的構(gòu)造函數(shù)不定義構(gòu)造函數(shù),則采用缺省構(gòu)造函數(shù)。各元素對(duì)象的初值要求為相同的值時(shí),可以定義出具有缺省形參值的構(gòu)造函數(shù)。各元素對(duì)象的初值要求為不同的值時(shí),需要定義帶形參(無缺省值)的構(gòu)造函數(shù)。當(dāng)數(shù)組中每一個(gè)對(duì)象被刪除時(shí),系統(tǒng)都要調(diào)用一次析構(gòu)函數(shù)。數(shù)組21對(duì)象數(shù)組應(yīng)用舉例//Point.h#if!defined(_Point_H)#define_Point_HclassPoint{public:

Point();Point(intxx,intyy);~Point();voidMove(intx,inty);intGetX(){returnX;}intGetY(){returnY;}private:intX,Y;};#endif22#include<iostream.h>#include“Point.h"Point::Point(){X=Y=0;cout<<"DefaultConstructorcalled."<<endl;}Point::Point(intxx,intyy){X=xx;Y=yy;cout<<"Constructorcalled."<<endl;}23Point::~Point(){cout<<"Destructorcalled."<<endl;}voidPoint::Move(intx,inty){X=x;Y=y;}24intmain(){cout<<"Enteringmain..."<<endl;

Point

A[2];for(inti=0;i<2;i++)

A[i].Move(i+10,i+20);cout<<"Exitingmain..."<<endl;

return0;}25運(yùn)行結(jié)果:Enteringmain...DefaultConstructorcalled.DefaultConstructorcalled.Exitingmain...Destructorcalled.Destructorcalled.26取地址運(yùn)算地址運(yùn)算符:&例:intvar;則&var表示變量var在內(nèi)存中的起始地址27聲明例:staticinti;staticint*i_pointer=&i;

指向整型變量的指針指針變量的概念概念指針:另一個(gè)變量的地址,

用于間接訪問變量指針變量:

用于存放地址的變量20003i_pointer*i_pointeri2000內(nèi)存用戶數(shù)據(jù)區(qū)變量i變量j變量

i_pointer362000200020023010引用例1:i=3;例2:*i_pointer=3;指針28指針變量的初始化語法形式

存儲(chǔ)類型數(shù)據(jù)類型*指針名=初始地址;例:int*pa=&a;注意事項(xiàng)用變量地址作為初值時(shí),該變量必須在指針初始化之前已說明過,且變量類型應(yīng)與指針類型一致??梢杂靡粋€(gè)已賦初值的指針去初始化另一個(gè)指針變量。指針29指針變量的算術(shù)運(yùn)算指針與整數(shù)的加減運(yùn)算指針p加上或減去n,其意義是指針當(dāng)前指向位置的前方或后方第n個(gè)數(shù)據(jù)的地址。這種運(yùn)算的結(jié)果值取決于指針指向的數(shù)據(jù)類型。指針加一,減一運(yùn)算指向下一個(gè)或前一個(gè)數(shù)據(jù)。例如:y=*px++相當(dāng)于y=*(px++)

(*和++優(yōu)先級(jí)相同,自右向左運(yùn)算)指針30papa-2pa-1pa+1pa+2pa+3*(pa-2)*pa*(pa+1)*(pa+2)*(pa+3)*(pa-1)short*pa31pb-1pbpb+1pb+2*(pb-1)*pb*(pb+1)*(pb+2)long*pb32關(guān)系運(yùn)算指向相同類型數(shù)據(jù)的指針之間可以進(jìn)行各種關(guān)系運(yùn)算。指向不同數(shù)據(jù)類型的指針,以及指針與一般整數(shù)變量之間的關(guān)系運(yùn)算是無意義的。指針可以和零之間進(jìn)行等于或不等于的關(guān)系運(yùn)算。例如:p==0或p!=0指針變量的關(guān)系運(yùn)算指針33指針變量的賦值運(yùn)算指針名=地址“地址”中存放的數(shù)據(jù)類型與指針類型必須相符。向指針變量賦的值必須是地址常量或變量,不能是普通整數(shù)。但可以賦值為整數(shù)0,表示空指針。指針的類型是它所指向變量的類型,而不是指針本身數(shù)據(jù)值的類型,任何一個(gè)指針本身的數(shù)據(jù)值都是unsignedlongint型。允許定義指向void類型的指針。該指針可以被賦予任何類型對(duì)象的地址。例:void*general;指針34指向數(shù)組元素的指針定義與賦值例:inta[10],*pa;pa=&a[0];或pa=a;通過指針引用數(shù)組元素經(jīng)過上述定義及賦值后:*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].a[i],*(pa+i),*(a+i)都是等效的。不能寫a++,因?yàn)閍是數(shù)組首地址是常量。指針35例:設(shè)一個(gè)a數(shù)組,整型,有10個(gè)元素。用三種方法輸出各元素:[使用數(shù)組下標(biāo)]main(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<a[i];}36例:設(shè)一個(gè)a數(shù)組,整型,有10個(gè)元素。用三種方法輸出各元素:[使用數(shù)組名]main(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<<endl;for(i=0;i<10;i++)cout<<*(a+i);}37例:設(shè)一個(gè)a數(shù)組,整型,有10個(gè)元素。用三種方法輸出各元素:[使用指針變量]main(){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;}38指針數(shù)組數(shù)組的元素是指針型例:Point*pa[2];

由pa[0],pa[1]兩個(gè)指針組成指針39指針與常量指向常量的指針不能通過指針來改變所指對(duì)象的值,但指針本身可以改變,可以指向另外的對(duì)象。例:constchar*name1="John";

若定義指針常量,則指針本身的值不能被改變。例:char*constname2="John";

指針40指針應(yīng)用舉例#include<iostream.h>intmain(){int*pt_int;float*pt_float;intpig=7,dog=27;floatx=1.2345,y=32.14;void*general;指針41

pt_int=&pig;

*pt_int+=dog;cout<<"Pignowhasthevalueof"<<*pt_int<<"\n";

general=pt_int;//指向int型的指針賦值給void型指針

pt_float=&x;y+=5*(*pt_float);cout<<"ynowhasthevalueof"<<y<<"\n";

general=pt_float;//指向float型的指針賦值給void型指針42

constchar*name1="John";

//指向常量的指針,所指對(duì)象之值不能改變

char*constname2="John";

//常量指針,指針本身不能被改變r(jià)eturn0;}運(yùn)行結(jié)果:Pignowhasthevalueof34ynowhasthevalueof38.312543指向常量的指針做形參#include<iostream.h>constintN=6;voidprint(constint

*p,intn);voidmain(){intarray[N];for(inti=0;i<N;i++)cin>>array[i];print(array,N);}指針44voidprint(constint*p,intn){cout<<"{"<<*p;for(inti=1;i<n;i++)cout<<"."<<*(p+i);cout<<"}"<<endl;}45指向類類型對(duì)象的指針定義形式類名*對(duì)象指針名;例PointA(5,10);Point*ptr;ptr=&A;通過指針訪問對(duì)象成員對(duì)象指針名->成員名指針46對(duì)象指針應(yīng)用舉例#include<iostream.h>intmain(){PointA(5,10);Point*ptr;

ptr=&A; intx; x=ptr->GetX(); cout<<x<<endl;return0;}指針47動(dòng)態(tài)存儲(chǔ)分配函數(shù)void*malloc(size);參數(shù)size:欲分配的字節(jié)數(shù)返回值:成功,則返回void型指針。

失敗,則返回空指針。頭文件:<stdlib.h>和<malloc.h>注意:若申請(qǐng)內(nèi)存成功,分配的字節(jié)數(shù)至少為size,也可能會(huì)大一些。

動(dòng)態(tài)存儲(chǔ)分配48動(dòng)態(tài)內(nèi)存釋放函數(shù)voidfree(void*memblock);參數(shù)memblock:指針,指向需釋放的內(nèi)存。返回值:無頭文件:<stdlib.h>和<malloc.h>注意:用free釋放的內(nèi)存必須是先前用malloc分配的。同一內(nèi)存只能釋放一次,重復(fù)釋放會(huì)出錯(cuò)。

動(dòng)態(tài)存儲(chǔ)分配49動(dòng)態(tài)申請(qǐng)內(nèi)存操作符newnew類型名T(初值列表)功能:在程序執(zhí)行期間,申請(qǐng)用于存放T類型對(duì)象的內(nèi)存空間,并依初值列表賦以初值。結(jié)果值:成功:T類型的指針,指向新分配的內(nèi)存。失?。?(NULL)

動(dòng)態(tài)存儲(chǔ)分配50釋放內(nèi)存操作符deletedelete指針P功能:釋放指針P所指向的內(nèi)存。P必須是new操作的返回值。

動(dòng)態(tài)存儲(chǔ)分配51動(dòng)態(tài)內(nèi)存操作符malloc與free是C中的函數(shù),在C++中仍可使用,new和delete是C++中新增的操作符。將動(dòng)態(tài)存儲(chǔ)分配功能設(shè)計(jì)為操作符,原因是:1)非常重要,使用頻繁2)可以進(jìn)行運(yùn)算符重載,任何類都可以定義自己的new和delete版本,增加了程序的靈活性。

動(dòng)態(tài)存儲(chǔ)分配52動(dòng)態(tài)存儲(chǔ)分配舉例#include<iostream.h>structdate{intmonth;intday;intyear;};

動(dòng)態(tài)存儲(chǔ)分配53intmain(){intindex,*point1,*point2;point1=&index;*point1=77;

point2=newint;*point2=173;cout<<"Thevaluesare"<<index<<""

<<*point1<<""<<*point2<<"\n";deletepoint2;

point1=newint;point2=point1;*point1=999;cout<<"Thevaluesare"<<index<<""

<<*point1<<""<<*point2<<"\n";

deletepoint1;54float*float_point1,*float_point2=newfloat;

float_point1=newfloat;*float_point2=3.14159;*float_point1=2.4*(*float_point2);

deletefloat_point2;

deletefloat_point1;55date*date_point;

date_point=newdate;//動(dòng)態(tài)分配結(jié)構(gòu)體date_point->month=10;date_point->day=18;date_point->year=1938;cout<<date_point->month<<"/"<<date_point->day<<"/"

<<date_point->year<<"\n";

deletedate_point;//釋放結(jié)構(gòu)體56char*c_point;

c_point=newchar[37];

//動(dòng)態(tài)分配數(shù)組

delete[]c_point;

//釋放數(shù)組

c_point=newchar[sizeof(date)+133];

//動(dòng)態(tài)分配數(shù)組

delete[]c_point;//釋放數(shù)組return0;}運(yùn)行結(jié)果:Thevaluesare7777173Thevaluesare7799999910/18/193857動(dòng)態(tài)創(chuàng)建對(duì)象舉例#include<iostream.h>#include"Point.h"intmain(){cout<<"StepOne:"<<endl;Point*Ptr1=newPoint;

deletePtr1;cout<<"StepTwo:"<<endl;Ptr1=newPoint(1,2);

deletePtr1;return0;}

動(dòng)態(tài)存儲(chǔ)分配58運(yùn)行結(jié)果:StepOne:DefaultConstructorcalled.Destructorcalled.StepTwo:Constructorcalled.Destructorcalled.59動(dòng)態(tài)創(chuàng)建對(duì)象數(shù)組舉例#include<iostream.h>#include"Point.h"intmain(){Point*Ptr=newPoint[2];

//創(chuàng)建對(duì)象數(shù)組Ptr[0].Move(5,10);//通過指針訪問數(shù)組元素的成員Ptr[1].Move(15,20);//通過指針訪問數(shù)組元素的成員cout<<"Deleting..."<<endl;

delete[]Ptr;//刪除整個(gè)對(duì)象數(shù)組return0;}

動(dòng)態(tài)存儲(chǔ)分配60運(yùn)行結(jié)果:DefaultConstructorcalled.DefaultConstructorcalled.Deleting...Destructorcalled.Destructorcalled.61以指針作為函數(shù)參數(shù)以地址方式傳遞數(shù)據(jù),可以用來返回函數(shù)處理結(jié)果。實(shí)參是數(shù)組名時(shí)形參可以是指針。

指針與函數(shù)62指針做函數(shù)參數(shù)舉例#include<iostream.h>#include"Point.h"voidf(Point**a,intn);intmain(){Point*pa[2];//動(dòng)態(tài)生成對(duì)象,其地址賦給指針數(shù)組元素pa[0]=newPoint(1,3);pa[1]=newPoint(2,4);f(pa,2);deletepa[0]; deletepa[1];return0;}

指針與函數(shù)63voidf(Point**a,intn)//實(shí)參是指針數(shù)組,形參應(yīng)使用二級(jí)指針//也可以寫成voidf(Point*a[],intn){for(inti=0;i<n;i++)cout<<a[i]->GetX()<<endl;}運(yùn)行結(jié)果:Constructorcalled.Constructorcalled.12Destructorcalled.Destructorcalled.64例:讀入三個(gè)浮點(diǎn)數(shù),將整數(shù)部分和小數(shù)部分分別輸出#include<iostream.h>voidsplitfloat(floatx,int*intpart,

float*fracpart){//形參intpart、fracpart是指針

*intpart=int(x); //取x的整數(shù)部分

*fracpart=x-*intpart;//取x的小數(shù)部分}

指針與函數(shù)65voidmain(void){ inti,n; floatx,f;

cout<<"Enterthree(3)floatingpointnumbers"

<<endl; for(i=0;i<3;i++) { cin>>x; splitfloat(x,&n,&f);//變量地址做實(shí)參 cout<<"IntegerPartis"<<n

<<"FractionPartis"<<f<<endl; }}66運(yùn)行結(jié)果:Enterthree(3)floatingpointnumbers4.7IntegerPartis4FractionPartis0.78.913IntegerPartis8FractionPartis0.913-4.7518IntegerPartis-4FractionPartis-0.751867例:輸出數(shù)組元素的內(nèi)容和地址#include<iostream.h>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; }}

指針與函數(shù)68voidmain(void){ longlist[5]={50,60,70,80,90};

cout<<"Inmain,addressofarrayis"<<unsignedlong(list)<<endl; cout<<endl;

Array_Ptr(list,5);}69運(yùn)行結(jié)果:Inmain,addressofarrayis6684132Infunc,addressofarrayis6684132AccessingarrayinthefunctionusingpointersAddressforindex0is6684132Valueis50Addressforindex1is6684136Valueis60Addressforindex2is6684140Valueis70Addressforindex3is6684144Valueis80Addressforindex4is6684148Valueis9070指針函數(shù)(返回指針值的函數(shù))當(dāng)函數(shù)的返回值是地址時(shí),該函數(shù)就是指針函數(shù)。定義形式存儲(chǔ)類型數(shù)據(jù)類型*函數(shù)名()

指針與函數(shù)71例:函數(shù)char*find(char*str,charch)在一個(gè)字符串str中找出字符ch第一次出現(xiàn)時(shí)的地址,并返回該地址值。#include<iostream.h>char*find(char*str,charch)//返回值類型為char*

{ while(*str!='\0') if(*str==ch)return(str); elsestr++; return(NULL);//若找不到,返回空指針}voidmain(){ chars[]="warrior"; char*p; p=find(s,'r');if(p)cout<<p<<endl;//輸出rrior p=find(s,'i');if(p)cout<<p<<endl;//輸出ior p=find(s,'b');if(p)cout<<p<<endl;//不輸出}72定義形式存儲(chǔ)類型數(shù)據(jù)類型(*函數(shù)指針名)();

含義:數(shù)據(jù)指針指向數(shù)據(jù)存儲(chǔ)區(qū),而函數(shù)指針指向的是程序代碼存儲(chǔ)區(qū)。函數(shù)指針(指向函數(shù)的指針)

指針與函數(shù)73舉例#include<stdio.h>voidprint_stuff(floatdata_to_ignore);voidprint_message(floatlist_this_data);voidprint_float(floatdata_to_print);void(*function_pointer)(float);intmain(){floatpi=3.14159;floattwo_pi=2.0*pi;

指針與函數(shù)void類型指針可以指向任意類型的對(duì)象,也可以指向除成員函數(shù)以外的函數(shù)。74print_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);return0;}75voidprint_stuff(floatdata_to_ignore){printf("Thisistheprintstufffunction.\n");}voidprint_message(floatlist_this_data){printf("Thedatatobelistedis%f\n",list_this_data);}voidprint_float(floatdata_to_print){printf("Thedatatobeprintedis%f\n",data_to_print);}76運(yùn)行結(jié)果:Thisistheprintstufffunction.Thisistheprintstufffunction.Thedatatobelistedis6.283180Thedatatobelistedis13.000000Thedatatobeprintedis3.141590Thedatatobeprintedis3.14159077用字符數(shù)組存儲(chǔ)和處理字符串字符數(shù)組的定義和引用例: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"沒有字符串變量,用字符數(shù)組來存放字符串字符串以'\0'為結(jié)束標(biāo)志字符數(shù)組的初始化

字符串78輸出一個(gè)字符串#include<iostream.h>intmain(){staticcharc[10]={'I','','a','m','','a','','b','o','y'};inti;for(i=0;i<10;i++)cout<<c[i];cout<<endl;return0;}運(yùn)行結(jié)果:Iamaboy79輸出一個(gè)鉆石圖形#include<iostream.h>intmain(){staticchardiamond[][5]={{'','','*'},

{'','*','','*'},{'*','','','','*'},{'','*','','*'},{'','','*'}};

inti,j;

for(i=0;i<5;i++)

{for(j=0;j<5;j++)

cout<<diamond[i][j];cout<<endl;

}return0}運(yùn)行結(jié)果:********80用字符數(shù)組存儲(chǔ)和處理字符串注意!若有如下聲明:chara[4],*p1,*p2;錯(cuò)誤的:

a="abc";

cin>>p1;正確的:

p1="abc";

p2=a;cin>>p2;

字符串81字符串的輸入/輸出方法逐個(gè)字符輸入輸出將整個(gè)字符串一次輸入或輸出

例:charc[]="China";

cout<<c;注意輸出字符不包括'\0'輸出字符串時(shí),輸出項(xiàng)是字符數(shù)組名,輸出時(shí)遇到'\0'結(jié)束。輸入多個(gè)字符串時(shí),以空格分隔;輸入單個(gè)字符串時(shí)其中不能有空格。

字符串82例如:程序中有下列語句:staticcharstr1[5],str2[5],str3[5];cin>>str1>>str2>>str3;運(yùn)行時(shí)輸入數(shù)據(jù):Howareyou?內(nèi)存中變量狀態(tài)如下:str1:How\0str2:are\0str3:you?\083若改為:staticcharstr[13];cin>>str;運(yùn)行時(shí)輸入數(shù)據(jù):Howareyou?內(nèi)存中變量str內(nèi)容如下:str:How\084整行輸入字符串cin.getline(字符數(shù)組名St,字符個(gè)數(shù)N,結(jié)束符);功能:一次連續(xù)讀入多個(gè)字符(可以包括空格),直到讀滿N個(gè),或遇到指定的結(jié)束符(缺省為'\n')。讀入的字符串存放于字符數(shù)組St中。讀取但不存儲(chǔ)結(jié)束符。cin.get(字符數(shù)組名St,字符個(gè)數(shù)N,結(jié)束符);功能:一次連續(xù)讀入多個(gè)字符(可以包括空格),直到讀滿N個(gè),或遇到指定的結(jié)束符(缺省為'\n')。讀入的字符串存放于字符數(shù)組St中。

既不讀取也不存儲(chǔ)結(jié)束符。

字符串85例:讀取字符和字符串voidmain(){charc1,c2,c3;charstr1[80],str2[100];cout<<"輸入三個(gè)字符:";c1=cin.get();

cin.get(c2);

cin.get(c3);

cin.get();cout<<"輸入第一行字符串:";

cin.get(str1,80);

cin.get();cout<<"輸入第二行字符串:";

cin.getline(str2,80);運(yùn)行:abc<回車>computer<回車>operator<回車>//讀取第一行后的回車//讀取第二行后的回車//第三行后的回車自動(dòng)被提取86整行輸入字符串舉例#include<iostream.h>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; }}

字符串87#include<stdlib.h>#include<iostream.h>voidmain(){ inti; system("cls"); cout<<"測試清屏,輸上幾個(gè)數(shù)字"<<endl; for(i=0;i<20;i++) cout<<i<<""; cout<<endl<<"按回車鍵開始清屏"; cin.get(); system("cls"); cout<<“屏幕顯示內(nèi)容已經(jīng)清除"<<endl; cin.get();}C++中沒有clrscr(),用system("cls")實(shí)現(xiàn)相同的功能,但和C中包含的頭文件不同,在C++中包含頭文件<stdlib.h>88字符串處理函數(shù)strcat(連接),strcpy(復(fù)制),

strcmp(比較),strlen(求長度),

strlwr(轉(zhuǎn)換為小寫),

strupr(轉(zhuǎn)換為大寫)頭文件<string.h>

字符串89this指針this指針是一個(gè)隱含于每一個(gè)類的成員函數(shù)中的特殊指針(包括構(gòu)造函數(shù)和析構(gòu)函數(shù)),它指向調(diào)用該函數(shù)的對(duì)象。當(dāng)對(duì)象調(diào)用成員函數(shù)時(shí),自動(dòng)將對(duì)象的地址(指針)賦給this指針,然后調(diào)用成員函數(shù),在成員函數(shù)中可直接使用該指針,指針名為this。在成員函數(shù)中可以使用*this來表示正在調(diào)用該函數(shù)的對(duì)象。如下例:90this指針的使用#include<iostream.h>classSample{private:intx,y;public:Sample(inta=0,intb=0){x=a;y=b;}voidPrint(){cout<<x<<endl;cout<<y<<endl;}};voidmain(){Samplec2(3,5); c2.Print();}成員函數(shù)中隱含著一個(gè)指針this,它指向調(diào)用成員函數(shù)的對(duì)象,如下述程序與上述程序等價(jià):

91this指針的使用#include<iostream.h>classSample{private:intx,y;public:Sample(inta=0,intb=0){this->x=a;//在此例中this=&c2。

this->y=b;}voidPrint(){cout<<(this->x)<<endl;//在此例中this=&c2。cout<<(this->y)<<‘endl;}};voidmain(){Samplec2(3,5); c2.Print();}92this指針的使用#include<iostream.h>classSample{private:intx,y;public: fun(inta,intb) { this->x=a; this->y=b; cout<<this<<'\t'<<x<<'\t'<<y<<endl;//E }};voidmain(){Samplec1,c2;cout<<&c1<<'\n';//Ac1.fun(1,2);//Bcout<<&c2<<'\n';//Cc2.fun(3,4);//D}此程序運(yùn)行結(jié)果是:0x0012FF78//主程序中A行輸出的是c1的地址0x0012FF7812//在B行通過c1調(diào)用成員函數(shù)

//fun()時(shí),E行的輸出0x0012FF70//主程序中C行輸出的是c2的地址0x0012FF7034//在D行通過c2調(diào)用成員函

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論