電腦課實驗四數組第5章_第1頁
電腦課實驗四數組第5章_第2頁
電腦課實驗四數組第5章_第3頁
電腦課實驗四數組第5章_第4頁
電腦課實驗四數組第5章_第5頁
已閱讀5頁,還剩55頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論