




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第5章數(shù)組5.1數(shù)組的概念5.2一維數(shù)組的定義和引用5.3二維數(shù)組的定義和引用5.4用數(shù)組名作函數(shù)參數(shù)5.5字符數(shù)組5.6字符串類5.1數(shù)組的概念數(shù)組是一種順序容器,是由單一類型元素組成的一個有序集合。一個數(shù)組在內(nèi)存中占一片連續(xù)的存儲單元。引入數(shù)組就不需要在程序中定義大量的變量,大大減少程序中變量的數(shù)量,使程序精煉,而且數(shù)組含義清楚,使用方便,明確地反映了數(shù)據(jù)間的聯(lián)系。許多好的算法都與數(shù)組有關(guān)。熟練地利用數(shù)組,可以大大地提高編程和解題的效率,加強了程序的可讀性。5.2一維數(shù)組的定義和引用描述數(shù)組必須給出元素類型,元素個數(shù),元素個數(shù)必須在編程時確定,任何變量都不允許,C++不允許對數(shù)組的大小作動態(tài)定義,即數(shù)組的大小不依賴于程序運行過程中變量的值。定義一維數(shù)組的一般格式為
類型標(biāo)識符數(shù)組名[常量表達(dá)式];inta[‘a(chǎn)’];//表示inta[97];intn=100;inta[n];//錯:元素個數(shù)必須預(yù)知constintn=100;inta[n];//okinta[];//錯:無元素個數(shù)inta[]={1,2,3,4,5};//ok:通過初始化確定元素個數(shù)數(shù)組初始化可選,但須遵循語法。無初始化的數(shù)組按規(guī)定取默認(rèn)值。intarray1[5]={1,2,3,4,5,6};//錯:初始值個數(shù)超元素個數(shù)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}};數(shù)組元素的訪問:對數(shù)組元素的訪問是通過下標(biāo)操作符,按元素在數(shù)組中的位置進(jìn)行訪問,稱為索引訪問或下標(biāo)訪問。數(shù)組元素的表示形式為
數(shù)組名[下標(biāo)]注意:①數(shù)組是一種組合類型,它是不能作為一個整體進(jìn)行訪問和處理的,只能按元素進(jìn)行個別的訪問和處理。②C++數(shù)組中的第1個元素的下標(biāo)為0,且下標(biāo)表達(dá)方式是固定的。③數(shù)組元素在內(nèi)存中是從低地址開始順序排列的,各元素的存儲單元大小相同,各元素的存儲單元之間沒有空隙,可以從數(shù)組第1個元素的存儲單元的起始地址計算出任意一個元素的存儲單元的起始地址。④C++不對數(shù)組的邊界進(jìn)行檢測。數(shù)組使用過程中是否出界完全是由程序員來控制的。例:#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()返回某數(shù)據(jù)類型的字節(jié)長度。數(shù)組的默認(rèn)值對于實施了初始化的數(shù)組,如果初始值的個數(shù)小于數(shù)組元素的個數(shù),則后面的元素個數(shù)全為0。對于沒有初始化的數(shù)組,分兩種情況:一種是全局?jǐn)?shù)組和靜態(tài)數(shù)組,即在函數(shù)外部定義的,或加上static修飾的數(shù)組定義,其元素總是全被清0。另一種是局部數(shù)組,即在函數(shù)內(nèi)部定義的數(shù)組,其值不確定。#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";}結(jié)果:array1:12300array2:00000array3:20000array4:200905620622935288229372820090953165.3二維數(shù)組的定義和引用C++中的數(shù)組可以有多個下標(biāo),需要兩個下標(biāo)才能標(biāo)識某個元素的數(shù)組稱為二維數(shù)組。⑴二維數(shù)組的定義inta[3][4];二維數(shù)組可以存儲二維表或矩陣。intb[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};要訪問二維數(shù)組中某個元素,必須指定兩個下標(biāo)。c=b[2][3];⑵二維數(shù)組的初始化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}};
注意:只能省略最高維。⑶二維數(shù)組的遍歷#include<iostream>usingnamespacestd;intmain(){inta[][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};cout<<sizeof(a)<<endl;//數(shù)組總的字節(jié)數(shù)
cout<<sizeof(a[0])<<endl;//一行的字節(jié)數(shù)
cout<<sizeof(a[0][0])<<endl;//一個元素的字節(jié)數(shù)
intm=sizeof(a)/sizeof(a[0]);//行數(shù)
intn=sizeof(a[0])/sizeof(a[0][0]);//列數(shù)
for(inti=0;i<m;i++)for(intj=0;j<n;j++)cout<<a[i][j]<<"";return0;}⑷二維數(shù)組的存儲二維數(shù)組在內(nèi)存中轉(zhuǎn)化為一維方式存儲。
inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};123456789101112第一行第二行第三行二維數(shù)組程序舉例例:將一個二維數(shù)組行和列元素互換,存到另一個二維數(shù)組中。如a= 1 2 3b= 1 4 4 5 6 2 5 3 6思路:找規(guī)律——b[j][i]=a[i][j]遍歷數(shù)組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號開始報數(shù),報到3的倍數(shù)的離開,一直數(shù)下去,直到最后只剩下一個人,求此人的編號。思路:將17人的編號寫入數(shù)組,如某人離開,則將相應(yīng)元素的值賦為0;定義一個變量n來記報數(shù)的數(shù);循環(huán)遍歷數(shù)組,如元素的值不為0,則n++(報數(shù)),如此時n的值為3的倍數(shù),則將元素的值賦為0(離開)。待解決的問題:如何循環(huán)遍歷數(shù)組?如何知道只剩下1人?1234567891011121314151617#include<iostream>usingnamespacestd;intmain(){constintm=17;intn=0,leave=0;//n為報數(shù)計數(shù),leave為離開的人數(shù)計數(shù)
inta[m];for(intk=0;k<m;k++)//將17人的編號寫入數(shù)組aa[k]=k+1;for(inti=0;;i++){i=i%m;//從數(shù)組尾部跳至數(shù)組頭部
if(a[i]!=0)//不為0,則表示此人沒離開,應(yīng)報數(shù)
{n++; //報數(shù)
if(n%3==0)//報到3的倍數(shù)
{a[i]=0;//離開
leave++;//離開的人數(shù)加1if(leave==(m-1))//如果已離開16人,退出循環(huán)
break;}}}for(intj=0;j<m;j++)//輸出最最后1人的編號
{if(a[j]!=0)cout<<a[j];}return0;}5.4用數(shù)組名作函數(shù)參數(shù)常量和變量可以用作函數(shù)實參,同樣數(shù)組元素也可以作函數(shù)實參,其用法與變量相同。數(shù)組名也可以作實參和形參,傳遞的是數(shù)組的起始地址。1.用數(shù)組元素作函數(shù)實參由于實參可以是表達(dá)式,而數(shù)組元素可以是表達(dá)式的組成部分,因此數(shù)組元素當(dāng)然可以作為函數(shù)的實參,與用變量作實參一樣,將數(shù)組元素的值傳送給形參變量。例:有一個3×4的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號。思路:開始時把a[0][0]的值賦給變量max,然后讓下一個元素與它比較,將二者中值大者保存在max中,然后再讓下一個元素與新的max比,直到最后一個元素比完為止。max最后的值就是數(shù)組所有元素中的最大值。#include<iostream>usingnamespacestd;intmax_value(intx,intmax);//函數(shù)聲明intmain(){inti,j,row=0,colum=0,max;inta[3][4]={{5,12,23,56},{19,28,37,46},{-12,-34,6,8}};//數(shù)組初始化
max=a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++){max=max_value(a[i][j],max);//調(diào)用max_value函數(shù)
if(max==a[i][j])//如果函數(shù)返回的是a[i][j]的值
{row=i;//記下該元素行號icolum=j;//記下該元素列號j}}cout<<"max="<<max<<",row="<<row<<",colum="<<colum<<endl;}intmax_value(intx,intmax)//定義max_value函數(shù){if(x>max)returnx;//如果x>max,函數(shù)返回值為xelsereturnmax;//如果x≤max,函數(shù)返回值為max}2.用數(shù)組名作函數(shù)參數(shù)可以用數(shù)組名作函數(shù)參數(shù),此時實參與形參都用數(shù)組名(也可以用指針變量,見第6章)。格式: 函數(shù)聲明
voidselect_sort(intarray[],intn);
函數(shù)調(diào)用
select_sort(a,10);例:用選擇法對數(shù)組中10個整數(shù)按由小到大排序。所謂選擇法就是先將10個數(shù)中最小的數(shù)與a[0]對換,再將a[1]到a[9]中最小的數(shù)與a[1]對換……每比較一輪,找出一個未經(jīng)排序的數(shù)中最小的一個。共比較9輪。#include<iostream>usingnamespacestd;voidselect_sort(intarray[],intn);//函數(shù)聲明intmain(){inta[10];cout<<"輸入10個整數(shù):"<<endl;for(inti=0;i<10;i++)//輸入10個數(shù)
cin>>a[i];cout<<endl;select_sort(a,10);//函數(shù)調(diào)用,數(shù)組名作實參
cout<<"已排序的數(shù)組:"<<endl;for(inti=0;i<10;i++)//輸出10個已排好序的數(shù)
cout<<a[i]<<"";cout<<endl;return0;}voidselect_sort(intarray[
],
intn)//形參array是數(shù)組名{intk,t;for(inti=0;i<n-1;i++){
k=i;for(intj=i+1;j<n;j++)//找沒排序的元素中最小者的下標(biāo)if(array[j]<array[k])k=j;
t=array[k];array[k]=array[i];array[i]=t;}}注意:數(shù)組名代表數(shù)組首元素的地址,并不代表數(shù)組中的全部元素。因此用數(shù)組名作函數(shù)實參時,不是把實參數(shù)組的值傳遞給形參,而只是將實參數(shù)組首元素的地址傳遞給形參。a[0]a[1]a[2]a[0][1]a[0][4]a[0][4]a[0][4]a聲明形參數(shù)組并不意味著真正建立一個包含若干元素的數(shù)組,在調(diào)用函數(shù)時也不對它分配存儲單元,只是用array[]這樣的形式表示array是一維數(shù)組名,以接收實參傳來的地址。因此array[]中方括號內(nèi)的數(shù)值并無實際作用,編譯系統(tǒng)對一維數(shù)組方括號內(nèi)的內(nèi)容不予處理。形參一維數(shù)組的聲明中可以寫元素個數(shù),也可以不寫。因此,傳遞數(shù)組時,一般還需傳遞數(shù)組元素的個數(shù)。函數(shù)首部的下面幾種寫法都合法,作用相同。voidselect_sort(intarray[10],intn)//指定元素個數(shù)與實參數(shù)組相同voidselect_sort(intarray[],intn)//不指定元素個數(shù)voidselect_sort(intarray[5],intn)//指定元素個數(shù)與實參數(shù)組不同3.用多維數(shù)組名作函數(shù)參數(shù)如果用二維數(shù)組名作為實參和形參,在對形參數(shù)組聲明時,必須指定第二維(即列)的大小,且應(yīng)與實參的第二維的大小相同。第一維的大小可以指定,也可以不指定。如intarray[3][10]//形參數(shù)組的兩個維都指定或
intarray[][10]//第一維大小省略二者都合法而且等價。但是不能把第二維的大小省略。例:編寫程序①初始化一個矩陣A(5×5),元素值取自隨機函數(shù),并輸出;②將其傳遞給函數(shù),實現(xiàn)矩陣轉(zhuǎn)置;③在主函數(shù)中輸出結(jié)果。標(biāo)準(zhǔn)庫<cstdlib>提供兩個幫助生成偽隨機數(shù)的函數(shù)。函數(shù)一:intrand(void); 返回一個在零到RAND_MAX
之間的偽隨機整數(shù)。
j=(int)(n*rand()/(RAND_MAX+1.0)) //產(chǎn)生一個0到n之間的隨機數(shù)函數(shù)二:voidsrand(unsignedseed);
rand函數(shù)實際上生成的是偽隨機數(shù),程序每次執(zhí)行時產(chǎn)生的序列都是重復(fù)的。可使用srand函數(shù)來初始化隨機數(shù)生成器。
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轉(zhuǎ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字符數(shù)組用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組,字符數(shù)組中的一個元素存放一個字符。字符數(shù)組具有數(shù)組的共同屬性。一般的字符數(shù)組的操作和前面介紹的類似,本節(jié)主要講解用字符數(shù)組存放C串。1.C串的結(jié)構(gòu)一個C串是一個字符序列,用來表示各種名字或者文字說明。每個字符占據(jù)1個字節(jié),字符序列的最后總是添加有一個結(jié)束標(biāo)志“\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帶三個參數(shù),一個存儲該文本的字符數(shù)組、一個長度和一個定界字符。第三個參數(shù)的默認(rèn)值是'\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-串的庫函數(shù):函數(shù)原型函數(shù)說明size_tstrlen(constchar*s)確定字符串的長度(終止符之前的字符個數(shù))char*strcpy(char*s1,constchar*s2)將s2復(fù)制到字符數(shù)組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為要設(shè)置的字符char*strstr(constchar*s1,constchar*s2)查找s1中第一次出s2的位置,如找到,返回指向匹配串的指針,否則返回NULL5.6字符串類用字符數(shù)組來存放字符串并不是最理想和最安全的方法。C++提供了一種新的數(shù)據(jù)類型——字符串類型(string類型),在使用方法上,它和char、int類型一樣,可以用來定義變量,這就是字符串變量——用一個名字代表一個字符序列。實際上,string并不是C++語言本身具有的基本類型,它是在C++標(biāo)準(zhǔn)庫中聲明的一個字符串類,用這種類可以定義對象。每一個字符串變量都是string類的一個對象。字符串類string提供了復(fù)制、查找等典型串操作,并能自動分配存儲空間。string類包含在頭文件<string>中。⑴string的構(gòu)造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的字符數(shù)據(jù)連接到str1的尾部str1+str2; //返回一個字符串,它將str2的字符數(shù)據(jù)連接到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的成員函數(shù)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中出現(xiàn)的索引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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 版權(quán)合同樣本:版權(quán)許可協(xié)議7篇
- 2023一年級數(shù)學(xué)下冊 三 認(rèn)識圖形 1初步認(rèn)識長方形和正方形教學(xué)設(shè)計 西師大版
- 起重操作作業(yè)安全技術(shù)培訓(xùn)
- 10 竹節(jié)人 教學(xué)設(shè)計-2024-2025學(xué)年語文六年級上冊統(tǒng)編版
- Unit 4 I have a pen pal Part A Lets talk Lets learn大單元整體教學(xué)設(shè)計表格式-2024-2025學(xué)年人教PEP版英語六年級上冊
- 《有余數(shù)除法解決問題》教學(xué)設(shè)計-2024-2025學(xué)年二年級下冊數(shù)學(xué)人教版
- 2023九年級語文下冊 第一單元 4 海燕教學(xué)設(shè)計 新人教版
- Unit 1 My classroom大單元(教學(xué)設(shè)計)-2024-2025學(xué)年人教PEP版英語四年級上冊
- 2023六年級數(shù)學(xué)下冊 二 冰淇淋和有多大-圓柱和圓錐信息窗2 圓柱的表面積第1課時教學(xué)設(shè)計 青島版六三制
- 名校聯(lián)盟浙江省溫州市蒼南縣龍港鎮(zhèn)第二中學(xué)七年級歷史與社會上冊 32 與山為鄰(第一課時)垂直的生計 教學(xué)設(shè)計
- 育嬰師綜合素質(zhì)試題及答案展示
- 醫(yī)院培訓(xùn)課件:《醫(yī)療安全(不良)事件報告制度》
- 物理-重慶市南開中學(xué)高2025屆高三第七次質(zhì)量檢測暨3月月考試題和答案
- 2025年湖北省部分高中高三語文3月一模聯(lián)考試卷附答案解析
- 2025屆高考地理二輪復(fù)習(xí)高考非選擇題專練專練八以世界典型區(qū)域為背景的綜合題含解析
- 2025年單位節(jié)日集體福利慰問品采購合同8篇
- 2025年三一物理面試題及答案
- 展覽會議展前展中展后服務(wù)方案(技術(shù)方案)
- 第16課《大家排好隊》名師課件
- 北京大學(xué)DeepSeek系列-DeepSeek與AIGC應(yīng)用
- 2025年開封大學(xué)單招職業(yè)傾向性測試題庫新版
評論
0/150
提交評論