c++5上海交大(針對(duì)譚浩強(qiáng)的書)_第1頁
c++5上海交大(針對(duì)譚浩強(qiáng)的書)_第2頁
c++5上海交大(針對(duì)譚浩強(qiáng)的書)_第3頁
c++5上海交大(針對(duì)譚浩強(qiáng)的書)_第4頁
c++5上海交大(針對(duì)譚浩強(qiáng)的書)_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第五章數(shù)組計(jì)算機(jī)基礎(chǔ)教學(xué)研究室C++語言程序設(shè)計(jì)1主要內(nèi)容5.1數(shù)組的概念5.2一維數(shù)組的定義和引用5.3二維數(shù)組的定義和引用5.4用數(shù)組名作函數(shù)參數(shù)5.5字符數(shù)組*5.6C++處理字符串的方法——字符串類與字符串變量2概括地說:數(shù)組是有序數(shù)據(jù)的集合。要尋找一個(gè)數(shù)組中的某一個(gè)元素必須給出兩個(gè)要素,即數(shù)組名和下標(biāo)。數(shù)組名和下標(biāo)唯一地標(biāo)識(shí)一個(gè)數(shù)組中的一個(gè)元素。數(shù)組是有類型屬性的。同一數(shù)組中的每一個(gè)元素都必須屬于同一數(shù)據(jù)類型。一個(gè)數(shù)組在內(nèi)存中占一片連續(xù)的存儲(chǔ)單元。如果有一個(gè)整型數(shù)組a,則該數(shù)組在內(nèi)存中的存儲(chǔ)情況如圖所示。5.1數(shù)組的概念數(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]a35.1一維數(shù)組5.1.1引例:

【例5-(3)】求N個(gè)學(xué)生的平均成績,并統(tǒng)計(jì)高于平均分的人數(shù)。用以前所學(xué)知識(shí)實(shí)現(xiàn):intk=0;floats,ave,sum=0;for(inti=0;i<100;i++){cin>>s;sum=sum+s;}

ave=sum/100;for(i=0;i<100;i++){cin>>s; if(s>ave)k++;}用數(shù)組來實(shí)現(xiàn):intk=0;floats[100],ave,sum=0;for(i=0;i<100;i++){cin>>s[i];sum=sum+s[i];}

ave=sum/100;for(i=0;i<100;i++)if(s[i]>ave)k++;數(shù)組:一組數(shù)據(jù)類型相同的元素按一定順序存放,構(gòu)成的數(shù)據(jù)集合。45.1.2一維數(shù)組的定義、存儲(chǔ)和初始化

1.定義形式

數(shù)據(jù)類型數(shù)組名[整型常量表達(dá)式];

如:

ints[5];

s[0]s[1]s[2]s[3]s[4]

下標(biāo)從0開始數(shù)組名是常量,表示數(shù)組在內(nèi)存中的首地址。數(shù)組長度應(yīng)該為整型常量表達(dá)式,不能是變量。如:

s正確:

constints=10;

inta[s];floatf[5]; 錯(cuò)誤:

ints=10;

inta[s];floatb[3.4]52.數(shù)組的初始化

1)給所有元素賦初值。如:inta[5]={0,2,4,6,8};或inta[]={0,2,4,6,8};

2)給部分元素賦初值。如:inta[10]={1,3,5,7,9};

花括號(hào)內(nèi)列出的值賦給了前面的若干個(gè)元素,其余元素系統(tǒng)自動(dòng)賦0。

花括號(hào)錯(cuò)誤:

inta[10];a={1,3,5,7,9};//數(shù)組名是個(gè)地址常量,不能被賦值。

inta[10];a[10]={1,3,5,7,9};

//a[10]不是數(shù)組中的元素,不能用花括號(hào)為一個(gè)元素賦多個(gè)值。

intc[3]={1,2,3,4};

//常量個(gè)數(shù)超過數(shù)組定義的長度。65.1.3數(shù)組元素的引用和基本操作1.?dāng)?shù)組元素的引用

形式:數(shù)組名[下標(biāo)]

相當(dāng)于一個(gè)普通變量如有:inta[10]={1,2,3,4,5,6,7,8,9,10},b[10],i(2);則:

a[3]=a[0]+a[i];

cout<<a[2+i];

cout<<a[a[3]];

cout<<a[10];//數(shù)組下標(biāo)越界

cout<<a;//對(duì)數(shù)組一般不能作為一個(gè)整體進(jìn)行操作

b=a;72.基本操作假設(shè)有定義:inta[N];N是已定義過的符號(hào)常量。(1)數(shù)組元素的輸入for(j=0;j<N;j++)cin>>a[j];(2)通過隨機(jī)函數(shù)rand()產(chǎn)生0~100的N個(gè)數(shù)據(jù)

for(i=0;i<N;i++)//rand()函數(shù)產(chǎn)生0~32767之間的整數(shù)

a[i]=int(rand()/32768.*101);

(3)數(shù)組元素的求和

sum=0;for(j=0;j<N;j++)sum+=a[j];(4)求數(shù)組中的最大元素

max=a[0];//假設(shè)第一個(gè)元素值最大

for(j=1;j<N;j++)if(a[j]>max)max=a[j];8(5)求最大元素下標(biāo)

imax=0; //imax代表最大元素下標(biāo)

for(j=1;j<N;j++)if(a[j]>a[imax])imax=j;(6)將最大元素放于某一特定位置(如放在最前頭)

imax=0;for(j=1;j<N;j++)if(a[j]>a[imax])imax=j;

if(imax!=0){t=a[0];a[0]=a[imax];a[imax]=t;}9例5.2用數(shù)組來處理求Fibonacci數(shù)列問題??梢杂?0個(gè)元素代表數(shù)列中的20個(gè)數(shù),從第3個(gè)數(shù)開始,可以直接用表達(dá)式f[i]=f[i-2]+f[i-1]求出各數(shù)。程序如下:#include<iostream>#include<iomanip>usingnamespacestd;intmain(){inti;

intf[20]={1,1};//f[0]=1,f[1]=1

for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1];//在i的值為2時(shí),f[2]=f[0]+f[1],依此類推…5.1.4一維數(shù)組程序舉例10for(i=0;i<20;i++)//此循環(huán)的作用是輸出20個(gè)數(shù)

{if(i%5==0)cout<<endl;//控制換行,每行輸出5個(gè)數(shù)據(jù)

cout<<setw(8)<<f[i];//每個(gè)數(shù)據(jù)輸出時(shí)占8列寬度

}

cout<<endl;//最后執(zhí)行一次換行

return0;}運(yùn)行結(jié)果如下:(空一行)

11235813213455891442333776109871597258441816765115.1.4數(shù)組排序

排序是將一組數(shù)按遞增或遞減的次序排列,如按學(xué)生的成績、球賽積分等排序。常用的算法有:選擇法(√)

冒泡法(√)

插入法快速排序法

…...12多種排序算法

幾種簡單的排序算法

直接插入排序冒泡排序直接選擇排序幾種快速的排序方法

快速排序樹形選擇排序堆排序歸并排序基數(shù)排序

13多種排序算法的比較141.選擇法排序基本思想:(1)從n個(gè)數(shù)的序列中選出最小的數(shù)(遞增),與第1個(gè)數(shù)交換位置;(2)除第1個(gè)數(shù)外,其余n-1個(gè)數(shù)再按(1)的方法選出次小的數(shù),與第2個(gè)數(shù)交換位置;(3)重復(fù)(1)n-1遍,最后構(gòu)成遞增序列?!纠?.2】對(duì)存放在數(shù)組中的6個(gè)數(shù),用選擇法按遞增排序。

下標(biāo)01~5 12~523~5 3 4~5 4 5for(i=0;i<5;i++){min=i;for(j=i+1;j<6;j++)if(a[j]<a[min])min=j;if(i!=min){temp=a[i];a[i]=a[min];a[min]=temp;}}15例5.3編寫程序,用起泡法對(duì)10個(gè)數(shù)排序(按由小到大順序)。起泡法的思路是:將相鄰兩個(gè)數(shù)比較,將小的調(diào)到前頭。見圖5.2。然后進(jìn)行第2趟比較,對(duì)余下的前面5個(gè)數(shù)按上法進(jìn)行比較,見圖5.3。圖5.2圖5.316起泡排序舉例對(duì)整數(shù)序列85243按升序排序8524352438243582345823458初始狀態(tài)第一趟結(jié)果第二趟結(jié)果第三趟結(jié)果第四趟結(jié)果小的逐漸上升每趟沉下一個(gè)最大的17可以推知,如果有n個(gè)數(shù),則要進(jìn)行n-1趟比較(和交換)。在第1趟中要進(jìn)行n-1次兩兩比較,在第j趟中要進(jìn)行n-j次兩兩比較。根據(jù)以上思路寫出程序,今設(shè)n=10,本例定義數(shù)組長度為11,a[0]不用,只用a[1]~a[10],以符合人們的習(xí)慣。從前面的敘述可知,應(yīng)該進(jìn)行9趟比較和交換。#include<iostream>usingnamespacestd;intmain(){

inta[11];

inti,j,t;

cout<<″input10numbers:″<<endl;for(i=1;i<11;i++)//輸入a[1]~a[10]18

cin>>a[i];

cout<<endl;for(j=1;j<=9;j++)//共進(jìn)行9趟比較

for(i=1;i<=10-j;i++)//在每趟中要進(jìn)行(10-j)次兩兩比較

if(a[i]>a[i+1])//如果前面的數(shù)大于后面的數(shù)

{t=a[i];a[i]=a[i+1];a[i+1]=t;}//交換兩個(gè)數(shù)的位置,使小數(shù)上浮

cout<<″thesortednumbers:″<<endl;for(i=1;i<11;i++)//輸出10個(gè)數(shù)

cout<<a[i]<<″″;

cout<<endl;return0;}運(yùn)行情況如下:input10numbers:35911336-9-76100123↙thesortednumbers:-76-935691133100123192.冒泡法排序基本思想:(1)從第一個(gè)元素開始,對(duì)數(shù)組中兩兩相鄰的元素比較,將值較小的元素放在前面,值較大的元素放在后面,一輪比較比較完畢,最大的數(shù)存放在a[N-1]中;(2)然后對(duì)a[0]到a[N-2]的N-1個(gè)數(shù)進(jìn)行同(1)的操作,次最大數(shù)放入a[N-2]元素內(nèi),完成第二趟排序;依次類推,進(jìn)行N-1趟排序后,所有數(shù)均有序?!纠?.3】用冒泡排序法實(shí)現(xiàn)例4.28

3497K=5348

79K=4

34789K=33

47

8

9K=2for(i=0;i<5;i++)for(j=1;j<6-i;j++)if(a[j-1]>a[j]){temp=a[j-1]; a[j-1]=a[j];a[j]=temp;}思考:當(dāng)數(shù)據(jù)未交換,說明數(shù)組已有序,如何結(jié)束排序?

205.2二維數(shù)組

5.2.1二維數(shù)組的定義和初始化

1.數(shù)組的定義

形式:

數(shù)據(jù)類型數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];

如:

floata[2][3];a[0][0]a[0][1]a[0][2]

a[1][0]a[1][1]a[1][2]以“先行后列”的規(guī)則連續(xù)存放:

序號(hào):012345序號(hào)=當(dāng)前行號(hào)*每行列數(shù)+當(dāng)前列號(hào)21存儲(chǔ)順序按行存放,上例中數(shù)組a的存儲(chǔ)順序?yàn)椋?/p>

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

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

下標(biāo)不要越界5.2.2二維數(shù)組的引用2.數(shù)組的初始化(1)按在內(nèi)存排列順序?qū)λ性刭x初值。(2)按行給所有元素賦初值,每一行的數(shù)據(jù)放于一個(gè)花括號(hào)內(nèi)。(3)按行給部分元素賦初值,在靜態(tài)存貯類型static中省略的元素初值此時(shí)自動(dòng)為0。 對(duì)應(yīng)的數(shù)組b為:(4)按行賦初值也可省略第一維的長度。 對(duì)應(yīng)的數(shù)組c為:inta[2][3]={1,2,3,4,5,6};或inta[][3]={1,2,3,4,5,6};inta[2][3]={{1,2,3},{4,5,6}};staticintb[3][4]={{1,2},{0,3,4},{0,0,5}}

intc[][3]={{1},{},{2}};235.2.3

二維數(shù)組的基本操作

1.數(shù)組的輸入、輸出【例5.4】輸入兩個(gè)矩陣A、B的值,求c=A+B。

分析:A、B矩陣相加,其實(shí)質(zhì)是將兩矩陣的對(duì)應(yīng)元素相加。相加的條件是有相同的行、列數(shù)。

24#include"iostream.h"#include"iomanip.h"voidmain(){inta[2][3],b[2][3],c[2][3],i,j;

for(i=0;i<2;i++)for(j=0;j<3;j++)

cin>>a[i][j];

for(i=0;i<2;i++)for(j=0;j<3;j++)

cin>>b[i][j];

for(i=0;i<2;i++)//A+B矩陣,每個(gè)對(duì)應(yīng)元素相加

for(j=0;j<3;j++) c[i][j]=a[i][j]+b[i][j];for(i=0;i<2;i++){for(j=0;j<3;j++)

cout<<setw(4)<<c[i][j];

cout<<endl;}}程序:

25求二維數(shù)組中最大(或最?。┰丶跋聵?biāo)

【例5.5】對(duì)3×3方陣,求最大元素及下標(biāo)。與一維數(shù)組求最大值的方式相同

max=a[0][0];imax=0;jmax=0;for(i=0;i<3;i++)for(j=0;j<3;j++) if(a[i][j]>max){max=a[i][j];imax=i;jmax=j;}26矩陣轉(zhuǎn)置

將矩陣以主對(duì)角線為軸線,將元素的行和列位置調(diào)換。

【例4.6】對(duì)3×3方陣轉(zhuǎn)置

123 147a=456b=258789 369for(i=0;i<3;i++)for(j=0;j<i;j++){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;} 274.矩陣相乘

【例4.7】求兩個(gè)矩陣a[M][N]和b[N][P]的乘積

c。設(shè)矩陣A、B為:

則矩陣C為:即矩陣C的第i行第j列元素可通過右邊公式求得:c00元素的實(shí)現(xiàn):s=0;for(k=0;k<3;k++)s+=a[0][k]*b[k][0];c[0][0]=s;28例5.6:兩個(gè)矩陣乘積生成一個(gè)新的矩陣#include"iostream.h"voidmain(){

int

product(intc[][3],intd[][3]);

inta[3][3]={{1,2,3},{4,5,6},{7,8,9}};

intb[3][3]={2,3,4,5,6,7,8,9,0};

inti,j; for(i=0;i<3;i++) {for(j=0;j<3;j++)

cout<<a[i][j]<<"\t";

cout<<endl;}

cout<<endl;

for(i=0;i<3;i++) {for(j=0;j<3;j++)

cout<<b[i][j]<<"\t";

cout<<endl;}

cout<<endl; product(a,b);}29兩個(gè)矩陣乘積生成一個(gè)新的矩陣int

product(intc[][3],intd[][3]){inti,j,k,s,x[3][3];for(i=0;i<3;i++){for(j=0;j<3;j++) {s=0; {for(k=0;k<3;k++) s+=c[i][k]*d[k][j];

x[i][j]=s;

cout<<x[i][j]<<"\t"; }}

cout<<endl;}return0;}1234567892345678903642188196511261508430程序:#include"iostream.h"#defineM2#defineN3#defineP4voidmain(){inta[M][N]={{3,5,7},{4,6,8}},b[N][P]={{1,4,7,10},{2,5,8,11},{3,6,9,12}};

intc[M][P],i,j,k,s;for(i=0;i<M;i++)for(j=0;j<P;j++){s=0; //求一個(gè)元素的值

for(k=0;k<N;k++)s+=a[i][k]*b[k][j]; c[i][j]=s;}

for(i=0;i<M;i++){for(j=0;j<P;j++)cout<<c[i][j]<<"";

cout<<endl;}}31 數(shù)組名也可以作實(shí)參和形參,傳遞的是數(shù)組的起始地址。1.用數(shù)組元素作函數(shù)實(shí)參將數(shù)組元素的值傳送給形參變量。max=max_value(a[i][j],max);//調(diào)用max_value函數(shù)2.用數(shù)組名作函數(shù)參數(shù)可以用數(shù)組名作函數(shù)參數(shù),此時(shí)實(shí)參與形參都用數(shù)組名(也可以用指針變量,見第6章)。select_sort(a,10);//函數(shù)調(diào)用,數(shù)組名作實(shí)參關(guān)于用數(shù)組名作函數(shù)參數(shù)有兩點(diǎn)要說明:(1)如果函數(shù)實(shí)參是數(shù)組名,形參也應(yīng)為數(shù)組名(或指針變量),實(shí)參數(shù)組與形參數(shù)組類型應(yīng)一致。(2)需要特別說明的是:數(shù)組名代表數(shù)組首元素的地址,并不代表數(shù)組中的全部元素。因此用數(shù)組名作函數(shù)實(shí)參時(shí),只是將實(shí)參數(shù)組首元素的地址傳遞給形參。5.3用數(shù)組名作函數(shù)參數(shù)32形參可以是數(shù)組名,也可以是指針變量,它們用來接收實(shí)參傳來的地址。如果形參是數(shù)組名,它代表的是形參數(shù)組首元素的地址。在調(diào)用函數(shù)時(shí),將實(shí)參數(shù)組首元素的地址傳遞給形參數(shù)組名。這樣,實(shí)參數(shù)組和形參數(shù)組就共占同一段內(nèi)存單元。見圖5.6。用數(shù)組名作函數(shù)實(shí)參時(shí),改變形參數(shù)組元素的值將同時(shí)改變實(shí)參數(shù)組元素的值。3.用多維數(shù)組名作函數(shù)參數(shù)如果用二維數(shù)組名作為實(shí)參和形參,在對(duì)形參數(shù)組聲明時(shí),必須指定第二維(即列)的大小,第一維的大小可以指定,也可以不指定。如intarray[3][10];//形參數(shù)組的兩個(gè)維都指定或intarray[][10];//第一維大小省略33例題5-5#include<iostream>usingnamespacestd;intmain(){int

i,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];//使max開始時(shí)取a[0][0]的值

for(i=0;i<=2;i++)//從第0行~第2行

for(j=0;j<=3;j++)//從第0列~第3列

if(a[i][j]>max)//如果某元素大于max {max=a[i][j];//max將取該元素的值

row=i;//記下該元素的行號(hào)i

colum=j;//記下該元素的列號(hào)j }cout<<"max="<<max<<",row="<<row<<",colum="<<colum<<endl;return0;}34例5.8有一個(gè)3×4的矩陣,求矩陣中所有元素中的最大值。要求調(diào)用max_value()函數(shù)處理。解此題的算法已在例5.5中介紹。程序如下:#include<iostream>usingnamespacestd;intmain(){int

max_value(intarray[][4]);

inta[3][4]={{11,32,45,67},{22,44,66,88},{15,72,43,37}};

cout<<″maxvalueis″<<max_value(a)<<endl;return0;}int

max_value(intarray[][4]){inti,j,max;35

max=array[0][0];for(i=0;i<3;i++)for(j=0;j<4;j++)if(array[i][j]>max)max=array[i][j];returnmax;}運(yùn)行結(jié)果如下:maxvalueis88讀者可以將max_value函數(shù)的首部改為以下幾種情況,觀察編譯情況:int

max_value(intarray[][])int

max_value(intarray[3][])int

max_value(intarray[3][4])int

max_value(intarray[10][10])int

max_value(intarray[12])365.4字符串

字符串常量:"ab123"ab123\0系統(tǒng)自動(dòng)添加

‘\0’(結(jié)束標(biāo)志符)處理字符串的方法有:

字符數(shù)組、CString(string)類和字符指針。4.3.1字符數(shù)組

1.字符數(shù)組如:chars[6];

chars1[2][6];字符數(shù)組若干個(gè)字符字符串a(chǎn)bcdabcd\037字符數(shù)組的初始化

(1)逐個(gè)字符賦初值(2)用字符串為字符數(shù)組初始化chars[10]={'I','','a','m',''.'f','i','n','e'};//s不是字符串chars[10]={"Iamfine"};chars[10]="Iamfine";s是字符串,‘\0’系統(tǒng)自動(dòng)添加(3)字符串?dāng)?shù)組初始化對(duì)二維數(shù)組以字符串形式初始化。chara[4][8]={"COBOL","FORTRAN","PASCAL","C/C++"};注意:對(duì)于二維字符數(shù)組,用兩個(gè)下標(biāo)表示數(shù)組中的一個(gè)字符。

38注意不要出現(xiàn)下面的錯(cuò)誤:

chars[10]={“Thisisabook"};chars[10];s="Iamfine";chars[10];s={'I','','a','m',''.'f','i','n','e'};3.字符數(shù)組的輸入/輸出逐個(gè)數(shù)組元素的輸入/輸出

chars1[10];for(i=0;i<10;i++)//一定要輸入10個(gè)字符

cin>>s1[i];//s1[i]中是字符,不是字符串注意:輸入時(shí)各輸入項(xiàng)之間不需加空格分隔

39字符串整體的輸入/輸出

chars1[10],s2[2][5];輸入: 輸出:

cin>>s1; ?

cout<<s1;gets(s1); ?

puts(s1);for(inti=0;i<2;i++) ?

for(i=0;i<2;i++)gets(s2[i]); puts(s2[i]);s1、s2中是字符串,'\0'自動(dòng)添加注意:使用cin>>s1;語句,字符串中不能有空格。函數(shù)gets()和puts()是對(duì)字符串整體輸入/輸出應(yīng)加#include“stdio.h”命令。

gets(字符數(shù)組名或字符指針變量名); puts(字符數(shù)組名或字符指針變量名); #include"iostream"usingnamespacestd;intmain(){chara[10];

gets(a);

puts(a);

cin>>a;

cout<<a<<endl;return0;}abc

defgabc

defgabcd

efgabcd40#include"stdio.h"#include"iostream.h"voidmain(){

inti;charc[5]={'C','h','i','n','a'};charb[]="China"; for(i=0;i<5;i++) //不能用puts(c);也不能用cout<<c;

cout<<c[i];

puts(b); //或cout<<b;

cout<<b<<endl<<endl;for(i=0;b[i]!='\0';i++)//正確的,但是不好,不主張用這種方法

cout<<b[i];

cout<<endl;}輸出結(jié)果:ChinaChinaChinaChina【例5-(4)】字符串的輸入/輸出

41例5.9設(shè)計(jì)和輸出一個(gè)鉆石圖形。#include<iostream>usingnamespacestd;voidmain(){chardiamond[][5]={{′′,′′,′*′},{′′,′*′,′′,′*′},{′*′,′′,′′,′′,′*′},{′′,′*′,′′,′*′},{′′,′′,′*′}};

inti,j;for(i=0;i<5;i++){for(j=0;j<5;j++)

cout<<diamond[i][j];//逐個(gè)引用數(shù)組元素,每次輸出一個(gè)字符

cout<<endl;}}運(yùn)行結(jié)果為:* *******424.字符串處理函數(shù)

使用下面函數(shù)時(shí),應(yīng)加#include“string.h”命令。1.strlen(str)

功能:求str字符串的長度。不包括字符串結(jié)束標(biāo)志'\0'。說明:str可為字符串常量、字符數(shù)組名或字符指針。2.strlwr(str)

功能:將字符串中的大寫字母轉(zhuǎn)換成小寫字母。說明:str為字符字符串常量、數(shù)組名或字符指針。3.strupr(str)

功能:將字符串中的小寫字母轉(zhuǎn)換成大寫字母。說明:str為字符字符串常量、數(shù)組名或字符指針。4.strcpy(str1,str2)

功能:將str2所指的字符串復(fù)制到str1中。

說明:str1和str2為字符數(shù)組名或字符指針,str2還可以是字符串常量。

str1要有足夠大的空間。設(shè):charstr2[10]={“aaa"},str1[10];strcpy(str1,str2);str1={"bb"};str1=str2;435.strcat(str1,str2)

功能:將str2字符串內(nèi)容連接到str1字符串內(nèi)容的后面說明:str1要有足夠大的空間。例如:

chars1[20]="abcd";

cout<<strcat(s1,“kkk")<<endl;//s1中的內(nèi)容變?yōu)閍bcdkkk

6.strcmp(str1,str2)

功能:比較字符串str1和str2的大小。說明:從左至右逐個(gè)字符進(jìn)行比較ASCII碼值,直到出現(xiàn)不相同字符或遇到'\0'為止。

str1小于str2

返回-1str1

等于str2 返回0 str1

大于str2 返回1strcmp(“ABCD”,”BD”);//結(jié)果為:-144注意1:strcmp(str1,str2);strcmp(″China″,″Korea″);strcmp(str1,″Beijing″);注意2:charstr1[30]=″People′sRepublicof″;charstr2[]=″China″;cout<<strcat(str1,str2));//調(diào)用strcat函數(shù)cout<<strcat(str1,″China″)輸出:People′sRepublicofChina45#include"stdio.h"#include"string.h"voidmain(){chars[80];while(1){gets(s);

if(strcmp(s,"pass"))puts("Invalidpassword.\n");elsebreak;}puts("pass\n");}【例5-(5)】字符串處理函數(shù)示例

46例5.10有3個(gè)字符串,要求找出其中最大者。要求用調(diào)用max_string()函數(shù)的方式。程序如下:#include<iostream>#include<string>usingnamespacestd;intmain(){voidmax_string(charstr[][30],inti);//函數(shù)聲明

inti;charcountry_name[3][30];for(i=0;i<3;i++)

cin>>country_name[i];//輸入3個(gè)國家名

max_string(country_name,3);//調(diào)用max_string函數(shù)

return0;}5.5.6字符數(shù)組應(yīng)用舉例47voidmax_string(charstr[][30],intn){

inti;charmaxString[30];

strcpy(maxString,str[0]);//使maxString的值為str[0]的值

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

if(strcmp(str[i],maxString)>0)//如果str[i]>maxString

strcpy(maxString,str[i]); //將str[i]中的字符串復(fù)制到maxString

cout<<endl<<″thelargeststringis:″<<maxString<<endl;}運(yùn)行結(jié)果如下:CHINA↙GERMANY↙FRANCH↙thelargeststringis:GERMANY48用字符數(shù)組來存放字符串并不是最理想和最安全的方法。

C++提供了一種新的數(shù)據(jù)類型——字符串類型(string類型),在使用方法上,它和char、int類型一樣,可以用來定義變量,這就是字符串變量——用一個(gè)名字代表一個(gè)字符序列。實(shí)際上,string并不是C++語言本身具有的基本類型,它是在C++標(biāo)準(zhǔn)庫中聲明的一個(gè)字符串類,用這種類可以定義對(duì)象,每一個(gè)字符串變量都是string類的一個(gè)對(duì)象。相當(dāng)于定義一個(gè)字符串類型的變量的用法。*5.6C++處理字符串的方法——字符串類與字符串變量491.定義字符串變量和其他類型變量一樣,字符串變量必須先定義后使用,定義字符串變量要用類名string。如stringstring1;//定義string1為字符串變量stringstring2=″China″;//定義string2同時(shí)對(duì)其初始化應(yīng)當(dāng)注意:要使用string類的功能時(shí),必須在本文件的開頭將C++標(biāo)準(zhǔn)庫中的string頭文件包含進(jìn)來,即應(yīng)加上#include<string>//注意頭文件名不是string.h5.6.1字符串變量的定義和引用502.對(duì)字符串變量的賦值在定義了字符串變量后,可以用賦值語句對(duì)它賦予一個(gè)字符串常量,如:string1=″Canada″;

可以用一個(gè)字符串變量給另一個(gè)字符串變量賦值。如:string2=string1;//假設(shè)string2和string1均已定義為字符串變量在定義字符串變量時(shí)不需指定長度,長度隨其中的字符串長度而改變。可以對(duì)字符串變量中某一字符進(jìn)行操作,如stringword=″Then″;//定義并初始化字符串變量wordword[2]=′a′;//修改序號(hào)為2的字符,修改后word的值為″Than″3.字符串變量的輸入輸出可以在輸入輸出語句中用字符串變量名,輸入輸出字符串,如:cin>>string1;//從鍵盤輸入一個(gè)字符串給字符串變量string1

cout<<string2;//將字符串string2輸出51在以字符數(shù)組存放字符串時(shí),字符串的運(yùn)算要用字符串函數(shù),如strcat(連接)、strcmp(比較)、strcpy(復(fù)制).對(duì)string類對(duì)象,可以不用這些函數(shù),而直接用簡單的運(yùn)算符。(1)字符串復(fù)制用賦值號(hào)string1=string2;其作用與“strcpy(string1,string2);”相同。(2)字符串連接用加號(hào)(其作用與strcat(string1,string2)相同)stringstring1=″C++″;//定義string1并賦初值stringstring2=″Language″;//定義string2并賦初值string1=string1+string2;//連接string1和string2連接后string1為″C++Language″。(3)字符串比較直接用關(guān)系運(yùn)算符可以直接用==(等于)、>(大于)、<(小于)、!=(不等于)、>=(大于或等于)、<=(小于或等于)等關(guān)系運(yùn)算符來進(jìn)行字符串的比較。5.6.2字符串變量的運(yùn)算52//字符串變量的比較,字符數(shù)組中用函數(shù)strcmp(str1,str2)例5.11輸入3個(gè)字符串,要求將字母按由小到大的順序輸出。#include<iostream>#include<string>usingnamespacestd;intmain(){stringstring1,string2,string3,temp;

cout<<″pleaseinputthreestrings:″;//這是對(duì)用戶輸入的提示

cin>>string1>>string2>>string3;//輸入3個(gè)字符串

if(string2>string3){temp=string2;string2=string3;string3=temp;}//使串2≤串3if(string1<=string2)cout<<string1<<″″<<string2<<″″<<string3<<endl;//如果串1≤串2,則串1≤串2≤串35.6.3字符串運(yùn)算舉例53

elseif(string1<=string3)cout<<string2<<″″<<string1<<″″<<string3<<endl;//如果串1>串2,且串1≤串3,則串2<串1≤串3elsecout<<string2<<″″<<string3<<″″<<string1<<endl;//如果串1>串2,且串1>串3,則串2<串3<串1}運(yùn)行情況如下:pleaseinputthreestrings:ChinaU.S.A.Germany↙ChinaGermanyU.S.A.字符串運(yùn)算舉例54不僅可以用string定義字符串變量,也可以用string定義字符串?dāng)?shù)組。如stringname[5];//定義一個(gè)字符串?dāng)?shù)組,它包含5個(gè)字符串元素stringname[5]={″Zhang″,″Li″,″Fun″,″Wang″,″Tan″};//定義一個(gè)字符串?dāng)?shù)組并初始化此時(shí)name數(shù)組的狀況如圖5.11所示。圖5.115.6.4字符串?dāng)?shù)組55程序:

#include"iostream.h"#include"string.h"voidmain(){voiditoc(int,char[]);

intn;chars[30];

cin>>n;

itoc(n,s);

cout<<s<<endl;}voiditoc(intn,chars[]){voidreverse(char[]);

inti=0;intsign;if((sign=n)<0)n=-n;do{s[i]=n%10+'0';i++;n=n/10;}while(n>0);if(sign<0)s[i++]='-';s[i]='\0';reverse(s);}voidreverse(chars[]) {intc,i,j;j=strlen(s)-1;

for(i=0;i<j;i++,j--){c=s[i];s[i]=s[j];s[j]=c;}s[i+j+1]='\0';}寫一函數(shù)itoc(),把數(shù)字轉(zhuǎn)變成字符串。如數(shù)字-123,變?yōu)椤?123″。56//連接二個(gè)C風(fēng)格字符串,靜態(tài)分配合并數(shù)組//把結(jié)果存儲(chǔ)在一個(gè)C風(fēng)格字符串中#include<cstring>#include<iostream.h>//usingnamespacestd;intmain(){ constcharcp1[20]="MeryandLinda"; constcharcp2[20]="arefriends"; charcp3[80]; strcpy(cp3,cp1); strcat(cp3,cp2);

cout<<"Linkstring:"<<cp3<<endl; return0;}57//連接二個(gè)C風(fēng)格字符串,動(dòng)態(tài)分配合并數(shù)組//把結(jié)果存儲(chǔ)在一個(gè)C風(fēng)格字符串中#include<cstring>#include<iostream.h>//usingnamespacestd;intmain(){ constchar*cp1="MeryandLinda"; constchar*cp2="arefriends";

int

len=strlen(cp1)+strlen(cp2); char*result_str=newchar[len+1]; strcpy(result_str,cp1); strcat(result_str,cp2);

cout<<"Linkstring:"<<result_str<<endl; delete[]result_str; return0;}58//連接二個(gè)string類型字符串#include<string>#include<iostream>usingnamespacestd;intmain(){ conststringstr1("MeryandLinda"); conststringstr2("arefriends"); stringresult_str;

result_str=str1;

result_str+=str2;

cout<<"Linkstring:"<<result_str<<endl; return0;}#include<iostream>#include<string>usingnamespacestd;intmain(){ stringstr1,str2;

cin>>str1>>str2;

cout<<"length1:"<<str1.length()<<endl;

cout<<"length2:"<<str2.length()<<endl; return0;}59//比較二個(gè)C風(fēng)格字符串的值,靜態(tài)分配字符數(shù)組#include<iostream>#include<string>usingnamespacestd;intmain(){ charstr1[20],str2[20];

cout<<"Entertwostring:"<<endl;

cin>>str1>>str2;

intresult; result=strcmp(str1,str2);

if(result>0)

cout<<"\""<<str1<<"\""<<"isbiggerthan"<<"\""<<str2<<"\""<<endl; elseif(result<0)

cout<<"\""<<str2<<"\""<<"isbiggerthan"<<"\""<<str1<<"\""<<endl; else

cout<<"Theyareequal"<<endl; return0;}60//比較二個(gè)C風(fēng)格字符串的值#include<iostream>#include<string>usingnamespacestd;intmain(){ constint

str_size=20; char*str1,*str2; str1=newchar[str_size]; str2=newchar[str_size]; if(str1==NULL||str2==NULL){

cout<<"Noenoughmemory!"<<endl; return-1;}

cout<<"Entertwostring:"<<endl;

cin>>str1>>str2;

61

intresult; result=strcmp(str1,str2);

if(result>0)

cout<<"\""<<str1<<"\""<<"isbiggerthan"<<"\""<<str2<<"\""<<endl; elseif(result<0)

cout<<"\""<<str2<<"\""<<"isbiggerthan"<<"\""<<str1<<"\""<<endl; else

cout<<"Theyareequal"<<endl; delete[]str1; delete[]str2; return0;}62//比較二個(gè)string類型的字符串#include<iostream>#include<string>usingnamespacestd;intmain(){ stringstr1,str2;

cout<<"Entertwostring:"<<endl;

cin>>str1>>str2; if(str1>str2)

cout<<"\""<<str1<<"\""<<"isbiggerthan"<<"\""<<str2<<"\""<<endl; elseif(str1<str2)

cout<<"\""<<str2<<"\""<<"isbiggerthan"<<"\""<<str1<<"\""<<endl; else

cout<<"Theyareequal"<<endl; return0;}63通過以上兩個(gè)例子可以看到,用string定義字符串變量,簡化了操作,把原來復(fù)雜的問題簡單化了,這是C++對(duì)C的一個(gè)發(fā)展。歸納起來,C++對(duì)字符串的處理有兩種方法:

一種是用字符數(shù)組的方法,這是C語言采取的方法,一般稱為Cstring方法;一種是用string類定義字符串變量,稱為string方法。顯然,string方法使用方便,最好采用這種方法。無論用哪種方法,都要#include<string>頭文件。總結(jié)64程序中邏輯層次導(dǎo)致程序錯(cuò)6566定義一維數(shù)組的一般格式為類型標(biāo)識(shí)符數(shù)組名[常量表達(dá)式];例如:inta[10];它表示數(shù)組名為a,此數(shù)組為整型,有10個(gè)元素。說明:數(shù)組名定名規(guī)則和變量名相同,遵循標(biāo)識(shí)符定名規(guī)則。用方括號(hào)括起來的常量表達(dá)式表示下標(biāo)值,注意最后一個(gè)元素是a[9]而不是a[10]。5.2一維數(shù)組的定義和引用

5.2.1定義一維數(shù)組67數(shù)組必須先定義,然后使用。只能逐個(gè)引用數(shù)組元素的值而不能一次引用整個(gè)數(shù)組中的全部元素的值。5.2.2引用一維數(shù)組的元素例5.1數(shù)組元素的引用。#include<iostream>usingnamespacestd;intmain(){inti,a[10];for(i=0;i<=9;i++) a[i]=i;for(i=9;i>=0;i--)cout<<a[i]<<″″;

cout<<endl;return0;}運(yùn)行結(jié)果如下:9876543210程序使a[0]~a[9]的值為0~9,然后按逆序輸出。68(1)在定義數(shù)組時(shí)分別對(duì)數(shù)組元素賦予初值。例如

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

inta[10]={0,1,2,3,4};(3)如果想使一個(gè)數(shù)組中全部元素值為1,可以寫成

inta[10]={1,1,1,1,1,1,1,1,1,1};

不能給數(shù)組整體賦初值。(4)在對(duì)全部數(shù)組元素賦初值時(shí),可以不指定數(shù)組長度。例如:inta[5]={1,2,3,4,5};

可以寫成inta[]={1,2,3,4,5};5.2.3一維數(shù)組的初始化69 具有兩個(gè)下標(biāo)的數(shù)組稱為二維數(shù)組。有些數(shù)據(jù)要依賴于兩個(gè)因素才能唯一地確定,例如有3個(gè)學(xué)生,每個(gè)學(xué)生有4門課的成績,顯然,成績數(shù)據(jù)是一個(gè)二維表,如書中表5.1所示。想表示第3個(gè)學(xué)生第4門課的成績,就需要指出學(xué)生的序號(hào)和課程的序號(hào)兩個(gè)因素,在數(shù)學(xué)上以S3,4表示。在C++中以s[3][4]表示。5.3二維數(shù)組的定義和引用70定義二維數(shù)組的一般形式為類型標(biāo)識(shí)符數(shù)組名[常量表達(dá)式][常量表達(dá)式]例如:floata[3][4],b[5][10];定義a為3×4(3行4列)的單精度數(shù)組,b為5×10(5行10列)的單精度數(shù)組。注意不能寫成“floata[3,4],b[5,10];”。

C++對(duì)二維數(shù)組采用這樣的定義方式,使我們可以把二維數(shù)組看作是一種特殊的一維數(shù)組:它的元素又是一個(gè)一維數(shù)組。例如,可以把a(bǔ)看作是一個(gè)一維數(shù)組,它有3個(gè)元素:a[0],a[1],a[2],每個(gè)元素又是一個(gè)包含4個(gè)元素的一維數(shù)組。5.3.1定義二維數(shù)組71C++中,二維數(shù)組中元素排列的順序是:按行存放,即在內(nèi)存中先順序存放第一行的元素,再存放第二行的元素。圖5.5表示對(duì)a[3][4]數(shù)組存放的順序。圖5.5C++允許使用多維數(shù)組。有了二維數(shù)組的基礎(chǔ),再掌握多維數(shù)組是不困難的。72可以用下面的方法對(duì)二維數(shù)組初始化:(1)分行給二維數(shù)組賦初值。如inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};這種賦初值方法比較直觀,把第1個(gè)花括號(hào)內(nèi)的數(shù)據(jù)賦給第1行的元素,第2個(gè)花括號(hào)內(nèi)的數(shù)據(jù)賦給第2行的元素……即按行賦初值。(2)可以將所有數(shù)據(jù)寫在一個(gè)花括號(hào)內(nèi),按數(shù)組排列的順序?qū)Ω髟刭x初值。如inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};效果與前相同。但以第1種方法為好,一行對(duì)一行,界限清楚。用第2種方法如果數(shù)據(jù)多,寫成一大片,容易遺漏,也不易檢查。5.3.3二維數(shù)組的初始化73(3)可以對(duì)部分元素賦初值。如:inta[3][4]={{1},{5},{9}};它的作用是只對(duì)各行第1列的元素賦初值,其余元素值自動(dòng)置為0。賦初值后數(shù)組各元素為100050009000也可以對(duì)各行中的某一元素賦初值:inta[3][4]={{1},{0,6},{0,0,11}};初始化后的數(shù)組元素如下:1000060000110這種方法對(duì)非0元素少時(shí)比較方便,不必將所有的0都寫出來,只需輸入少量數(shù)據(jù)。(4)如果對(duì)全部元素都賦初值(即提供全部初始數(shù)據(jù)),則定義數(shù)組時(shí)對(duì)第一維的長度可以不指定,但第二維的長度不能省。如:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};74例5.4將一個(gè)二維數(shù)組行和列元素互換,存到另一個(gè)二維數(shù)組中。例如:a= 1 2 3b= 1 4 4 5 62 5 3 6程序如下:#include<iostream>usingnamespacestd;intmain(){

inta[2][3]={{1,2,3},{4,5,6}};

intb[3][2],i,j;5.3.4二維數(shù)組程序舉例75

cout<<″arraya:″<<endl;for(i=0;i<=1;i++){for(j=0;j<=2;j++){cout<<a[i][j]<<″″;b[j][i]=a[i][j];}

cout<<endl;}

cout<<″arrayb:″<<endl;for(i=0;i<=2;i++){for(j=0;j<=1;j++)

cout<<b[i][j]<<″″;

cout<<endl;}return0;}運(yùn)行結(jié)果如下:

arraya:

123456arrayb:

14253676 用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組,字符數(shù)組中的一個(gè)元素存放一個(gè)字符。字符數(shù)組具有數(shù)組的共同屬性。由于字符串應(yīng)用廣泛,C和C++專門為它提供了許多方便的用法和函數(shù)。5.5字符數(shù)組77定義字符數(shù)組的方法與前面介紹的類似。例如charc[10];c[0]=′

溫馨提示

  • 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)論