




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第5章章 數組數組5.1 數組的概念數組的概念5.2 一維數組的定義和引用一維數組的定義和引用5.3 二維數組的定義和引用二維數組的定義和引用5.4 用數組名作函數參數用數組名作函數參數5.5 字符數組字符數組*5.6 C+處理字符串的方法處理字符串的方法字符串類與字字符串類與字符串變量符串變量概括地說:概括地說: 數組是有序數據的集合。要尋找一個數組是有序數據的集合。要尋找一個數組中的某一個元素必須給出兩個要素,即數組名數組中的某一個元素必須給出兩個要素,即數組名和下標。數組名和下標惟一地標識一個數組中的一和下標。數組名和下標惟一地標識一個數組中的一個元素。個元素。數組是有類型屬性的。同一
2、數組中的每一個元素都數組是有類型屬性的。同一數組中的每一個元素都必須屬于同一數據類型。一個數組在內存中占一片必須屬于同一數據類型。一個數組在內存中占一片連續的存儲單元。如果有一個整型數組連續的存儲單元。如果有一個整型數組a,假設數,假設數組的起始地址為組的起始地址為2000,則該數組在內存中的存儲情,則該數組在內存中的存儲情況如圖況如圖5.1所示。所示。5.1 數組的概念數組的概念 圖圖5.1引入數組就不需要在程序中定義大量的變量,大大引入數組就不需要在程序中定義大量的變量,大大減少程序中變量的數量,使程序精煉,而且數組含減少程序中變量的數量,使程序精煉,而且數組含義清楚,使用方便,明確地反映
3、了數據間的聯系。義清楚,使用方便,明確地反映了數據間的聯系。許多好的算法都與數組有關。熟練地利用數組,可許多好的算法都與數組有關。熟練地利用數組,可以大大地提高編程和解題的效率,加強了程序的可以大大地提高編程和解題的效率,加強了程序的可讀性。讀性。C+用方括號來表示下標,如用用方括號來表示下標,如用s1,s2,s3 分別代表分別代表s1,s2,s3。定義一維數組的一般格式為定義一維數組的一般格式為類型標識符類型標識符 數組名常量表達式;數組名常量表達式;例如例如int a10;它表示數組名為它表示數組名為a,此數組為整型,有,此數組為整型,有10個元素。個元素。說明:說明:(1) 數組名定名規
4、則和變量名相同,遵循標識符數組名定名規則和變量名相同,遵循標識符定名規則。定名規則。5.2 一維數組的定義和引用一維數組的定義和引用 5.2.1 定義一維數組定義一維數組(2) 用方括號括起來的常量表達式表示下標值,用方括號括起來的常量表達式表示下標值,如下面的寫法是合法的:如下面的寫法是合法的: int a10;int a2*5;int an*2; /假設前面已定義了假設前面已定義了n為常變量為常變量 (3) 常量表達式的值表示元素的個數,即數組長常量表達式的值表示元素的個數,即數組長度。例如,在度。例如,在“int a10;”中,中,10表示表示a數組有數組有10個元素個元素,下標從下標從
5、0開始開始,這這10個元素是:個元素是: a0,a1,a2,a3,a4,a5,a6,a7, a8,a9。注意最后一個元素是。注意最后一個元素是a9而不而不是是a10。(4) 常量表達式中可以包括常量、常變量和符號常量表達式中可以包括常量、常變量和符號常量,但不能包含變量。也就是說,常量,但不能包含變量。也就是說,C+不允許對不允許對數組的大小作動態定義,即數組的大小不依賴于程數組的大小作動態定義,即數組的大小不依賴于程序運行過程中變量的值。例如,下面這樣定義數組序運行過程中變量的值。例如,下面這樣定義數組是不行的:是不行的:int n;cinn; /輸入輸入a數組的長度數組的長度int an;
6、 /企圖根據企圖根據n的值決定數組的長度的值決定數組的長度 如果把第如果把第1,2行改為下面一行就合法了行改為下面一行就合法了:const int n=5;數組必須先定義,然后使用。只能逐個引用數組元數組必須先定義,然后使用。只能逐個引用數組元素的值而不能一次引用整個數組中的全部元素的值。素的值而不能一次引用整個數組中的全部元素的值。數組元素的表示形式為數組元素的表示形式為數組名下標數組名下標下標可以是整型常量或整型表達式。例如下標可以是整型常量或整型表達式。例如a0= a5+ a7- a2*35.2.2 引用一維數組的元素引用一維數組的元素例例5.1 數組元素的引用。數組元素的引用。#inc
7、lude using namespace std;int main( )int i,a10; for (i=0;i=0;i-)coutai ; coutendl; return 0;運行結果如下:運行結果如下: 9 8 7 6 5 4 3 2 1 0程序使程序使a0a9的值為的值為09,然后按逆序輸出。,然后按逆序輸出。(1) 在定義數組時分別對數組元素賦予初值。例在定義數組時分別對數組元素賦予初值。例如如int a10=0,1,2,3,4,5,6,7,8,9;(2) 可以只給一部分元素賦值。例如可以只給一部分元素賦值。例如int a10=0,1,2,3,4; (3) 如果想使一個數組中全部元
8、素值為如果想使一個數組中全部元素值為1,可以,可以寫成寫成int a10=1,1,1,1,1,1,1,1,1,1;不能寫成不能寫成 int a10=1*10;不能給數組整體賦初值。不能給數組整體賦初值。(4) 在對全部數組元素賦初值時,可以不指定數在對全部數組元素賦初值時,可以不指定數組長度。例如組長度。例如int a5=1,2,3,4,5;可以寫成可以寫成 int a=1,2,3,4,5;5.2.3 一維數組的初始化一維數組的初始化例例5.2 用數組來處理求用數組來處理求Fibonacci數列問題。數列問題。可以用可以用20個元素代表數列中的個元素代表數列中的20個數,從第個數,從第3個數個
9、數開始,可以直接用表達式開始,可以直接用表達式fi=fi-2+fi-1求出各數。求出各數。程序如下:程序如下:#include #include using namespace std;int main( ) int i; int f20=1,1; /f0=1,f1=1 for(i=2;i20;i+)5.2.4 一維數組程序舉例一維數組程序舉例 fi=fi-2+fi-1; /在在i的值為的值為2時,時,f2=f0+f1,依此類推,依此類推 for(i=0;i20;i+) /此循環的作用是輸出此循環的作用是輸出20個數個數 if(i%5=0) coutendl; /控制換行,每行輸出控制換行,每
10、行輸出5個數據個數據 coutsetw(8)fi; /每個數據輸出時占每個數據輸出時占8列寬度列寬度 coutendl; /最后執行一次換行最后執行一次換行 return 0;運行結果如下:運行結果如下:(空一行)(空一行) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610987 1597 2584 4181 6765例例5.3 編寫程序,用起泡法對編寫程序,用起泡法對10個數排序(按由小個數排序(按由小到大順序)。到大順序)。起泡法的思路是:將相鄰兩個數比較,將小的調到起泡法的思路是:將相鄰兩個數比較,將小的調到前頭。見圖前頭。見圖5.2。然后進行第然后進
11、行第2趟比較,對余下的前面趟比較,對余下的前面5個數按上法進個數按上法進行比較,見圖行比較,見圖5.3。 圖圖5.2 圖圖5.3可以推知,如果有可以推知,如果有n個數,則要進行個數,則要進行n-1趟比較(和趟比較(和交換)。在第交換)。在第1趟中要進行趟中要進行n-1次兩兩比較,在第次兩兩比較,在第j趟中要進行趟中要進行n-j次兩兩比較。次兩兩比較。根據以上思路寫出程序,今設根據以上思路寫出程序,今設n=10,本例定義數組,本例定義數組長度為長度為11,a0不用,只用不用,只用a1a10,以,以符合人們的習慣。從前面的敘述可知,應該進行符合人們的習慣。從前面的敘述可知,應該進行9趟比較和交換。
12、趟比較和交換。#include using namespace std;int main( ) int a11; int i,j,t; coutinput 10 numbers :endl; for (i=1;iai; coutendl; for (j=1;j=9;j+) /共進行共進行9趟比較趟比較 for(i=1;iai+1) /如果前面的數大于后面的數如果前面的數大于后面的數 t=ai;ai=ai+1;ai+1=t; /交換兩個數的位置,使小數上浮交換兩個數的位置,使小數上浮 coutthe sorted numbers :endl; for(i=1;i11;i+) /輸出輸出10個數個
13、數 coutai ; coutendl; return 0;運行情況如下:運行情況如下:input 10 numbers:3 5 9 11 33 6 -9 -76 100 123 the sorted numbers:-76 -9 3 5 6 9 11 33 100 123具有兩個下標的數組稱為二維數組。有些數據要依具有兩個下標的數組稱為二維數組。有些數據要依賴于兩個因素才能惟一地確定,例如有賴于兩個因素才能惟一地確定,例如有3個學生,個學生,每個學生有每個學生有4門課的成績,顯然,成績數據是一個門課的成績,顯然,成績數據是一個二維表,如書中表二維表,如書中表5.1所示。所示。想表示第想表示第
14、3個學生第個學生第4門課的成績,就需要指出學生門課的成績,就需要指出學生的序號和課程的序號兩個因素,在數學上以的序號和課程的序號兩個因素,在數學上以S3,4表表示。在示。在C+中以中以s34表示,它代表數據表示,它代表數據73。5.3 二維數組的定義和引用二維數組的定義和引用定義二維數組的一般形式為定義二維數組的一般形式為類型標識符類型標識符 數組名常量表達式常量表達式數組名常量表達式常量表達式例如例如float a34,b510;定義定義a為為34(3行行4列)的單精度數組,列)的單精度數組,b為為510(5行行10列)的單精度數組。注意不能寫成列)的單精度數組。注意不能寫成“float a
15、3,4,b5,10;”。C+對二維數組采用這樣對二維數組采用這樣的定義方式,使我們可以把二維數組看作是一種特的定義方式,使我們可以把二維數組看作是一種特殊的一維數組:它的元素又是一個一維數組。例如,殊的一維數組:它的元素又是一個一維數組。例如,可以把可以把a看作是一個一維數組,它有看作是一個一維數組,它有3個元素:個元素:a0,a1,a2,每個元素又是一個包含,每個元素又是一個包含4個個元素的一維數組,見圖元素的一維數組,見圖5.4。a0,a1,a2是是3個一維數組的名字。個一維數組的名字。5.3.1 定義二維數組定義二維數組圖圖5.4上面定義的二維數組可以理解為定義了上面定義的二維數組可以理
16、解為定義了3個一維數個一維數組,即相當于組,即相當于float a04,a14,a24此處把此處把a0,a1,a2作一維數組名。作一維數組名。C+的這種處理方法在數組初始化和用指針表示時顯得的這種處理方法在數組初始化和用指針表示時顯得很方便,這在以后會體會到。很方便,這在以后會體會到。C+中,二維數組中元素排列的順序是:按行存放,中,二維數組中元素排列的順序是:按行存放,即在內存中先順序存放第一行的元素,再存放第二即在內存中先順序存放第一行的元素,再存放第二行的元素。圖行的元素。圖5.5表示對表示對a34數組存放的順數組存放的順序。序。圖圖5.5C+允許使用多維數組。有了二維數組的基礎,再允許
17、使用多維數組。有了二維數組的基礎,再掌握多維數組是不困難的。例如,定義三維數組的掌握多維數組是不困難的。例如,定義三維數組的方法是方法是float a234; 定義定義float型三維數組型三維數組a,它有,它有234=24個元素。個元素。多維數組元素在內存中的排列順序:第一維的下標多維數組元素在內存中的排列順序:第一維的下標變化最慢,最右邊的下標變化最快。例如,上述三變化最慢,最右邊的下標變化最快。例如,上述三維數組的元素排列順序為維數組的元素排列順序為a000a001a002a003a010a011a012a013a020a021a022a023a100a101a102a103a110a1
18、11a112a113a120a121a122a123二維數組的元素的表示形式為二維數組的元素的表示形式為數組名數組名 下標下標下標下標如如a23。下標可以是整型表達式,如。下標可以是整型表達式,如a2-12*2-1。不要寫成。不要寫成a2,3,a2-1,2*2-1形式。形式。數組元素是左值,可以出現在表達式中,也可以被數組元素是左值,可以出現在表達式中,也可以被賦值,例如賦值,例如b12=a23/2;在使用數組元素時,應該注意下標值應在已定義的在使用數組元素時,應該注意下標值應在已定義的數組大小的范圍內。常出現的錯誤是數組大小的范圍內。常出現的錯誤是5.3.2 二維數組的引用二維數組的引用in
19、t a34; /定義定義3行行4列的數組列的數組a34=15; /引用引用a34元素元素定義定義a為為34的數組,它可用的行下標值最大為的數組,它可用的行下標值最大為2,列坐標值最大為列坐標值最大為3。最多可以用到。最多可以用到a23,a34就超過了數組的范圍。就超過了數組的范圍。請嚴格區分在定義數組時用的請嚴格區分在定義數組時用的a34和引用和引用元素時的元素時的a34的區別。前者的區別。前者a34用用來定義數組的維數和各維的大小,后者來定義數組的維數和各維的大小,后者a34中的中的3和和4是下標值,是下標值,a34代表某一個元素。代表某一個元素。可以用下面的方法對二維數組初始化:可以用下面
20、的方法對二維數組初始化:(1) 分行給二維數組賦初值。如分行給二維數組賦初值。如int a34=1,2,3,4,5,6,7,8,9,10,11,12; 這種賦初值方法比較直觀,把第這種賦初值方法比較直觀,把第1個花括號內的數個花括號內的數據賦給第據賦給第1行的元素,第行的元素,第2個花括號內的數據賦給第個花括號內的數據賦給第2行的元素行的元素即按行賦初值。即按行賦初值。(2) 可以將所有數據寫在一個花括號內,按數組可以將所有數據寫在一個花括號內,按數組排列的順序對各元素賦初值。如排列的順序對各元素賦初值。如int a34=1,2,3,4,5,6,7,8,9,10,11,12;效果與前相同。但以
21、第效果與前相同。但以第1種方法為好,一行對一行,種方法為好,一行對一行,界限清楚。用第界限清楚。用第2種方法如果數據多,寫成一大片,種方法如果數據多,寫成一大片,容易遺漏,也不易檢查。容易遺漏,也不易檢查。5.3.3 二維數組的初始化二維數組的初始化(3) 可以對部分元素賦初值。如可以對部分元素賦初值。如int a34=1,5,9;它的作用是只對各行第它的作用是只對各行第1列的元素賦初值,其余元列的元素賦初值,其余元素值自動置為素值自動置為0。賦初值后數組各元素為。賦初值后數組各元素為1 0 0 05 0 0 09 0 0 0 也可以對各行中的某一元素賦初值:也可以對各行中的某一元素賦初值:i
22、nt a34=1,0,6,0,0,11; 初始化后的數組元素如下:初始化后的數組元素如下:1 0 0 00 6 0 00 0 11 0這種方法對非這種方法對非0元素少時比較方便,不必將所有的元素少時比較方便,不必將所有的0都寫出來,只需輸入少量數據。也可以只對某幾行都寫出來,只需輸入少量數據。也可以只對某幾行元素賦初值:元素賦初值:int a34=1,5,6; 數組元素為數組元素為 1 0 0 05 6 0 00 0 0 0第第3行不賦初值。也可以對第行不賦初值。也可以對第2行不賦初值:行不賦初值:int a34=1,9;(4) 如果對全部元素都賦初值(即提供全部初始如果對全部元素都賦初值(即
23、提供全部初始數據),則定義數組時對第一維的長度可以不指定,數據),則定義數組時對第一維的長度可以不指定,但第二維的長度不能省。如但第二維的長度不能省。如int a34=1,2,3,4,5,6,7,8,9,10,11,12;可以寫成可以寫成int a4=1,2,3,4,5,6,7,8,9,10,11,12;系統會根據數據總個數分配存儲空間,一共系統會根據數據總個數分配存儲空間,一共12個數個數據,每行據,每行4列,當然可確定為列,當然可確定為3行。行。在定義時也可以只對部分元素賦初值而省略第一維在定義時也可以只對部分元素賦初值而省略第一維的長度,但應分行賦初值。如的長度,但應分行賦初值。如int
24、 a4=0,0,3,0,10;這樣的寫法,能通知編譯系統:這樣的寫法,能通知編譯系統: 數組共有數組共有3行。數行。數組各元素為組各元素為 0 0 3 00 0 0 00 10 0 0C+在定義數組和表示數組元素時采用在定義數組和表示數組元素時采用a這種兩個方括號的方式,對數組初始化時十分有用,這種兩個方括號的方式,對數組初始化時十分有用,它使概念清楚,使用方便,不易出錯。它使概念清楚,使用方便,不易出錯。例例5.4 將一個二維數組行和列元素互換,存到另一將一個二維數組行和列元素互換,存到另一個二維數組中。例如個二維數組中。例如a=123 b=14456 2536程序如下:程序如下:#incl
25、ude using namespace std;int main( ) int a23=1,2,3,4,5,6; int b32,i,j;5.3.4 二維數組程序舉例二維數組程序舉例 coutarray a:endl; for (i=0;i=1;i+) for (j=0;j=2;j+) coutaij ; bji=aij; coutendl; coutarray b:endl; for (i=0;i=2;i+) for(j=0;j=1;j+) coutbij ; coutendl; return 0;運行結果如下:運行結果如下: array a: 1 2 3 4 5 6 array b: 1
26、4 2 5 3 6例例5.5 有一個有一個34的矩陣,要求編程序求出其中值的矩陣,要求編程序求出其中值最大的那個元素的值,以及其所在的行號和列號。最大的那個元素的值,以及其所在的行號和列號。開始時把開始時把a00的值賦給變量的值賦給變量max,然后讓,然后讓下一個元素與它比較,將二者中值大者保存在下一個元素與它比較,將二者中值大者保存在max中,然后再讓下一個元素與新的中,然后再讓下一個元素與新的max比,直到最后比,直到最后一個元素比完為止。一個元素比完為止。max最后的值就是數組所有元最后的值就是數組所有元素中的最大值。素中的最大值。程序如下:程序如下: #include using na
27、mespace std;int main( ) int i,j,row=0,colum=0,max; int a34=5,12,23,56,19,28,37,46,-12,-34,6,8; max=a00; /使使max開始時取開始時取a00的值的值 for (i=0;i=2;i+) /從第從第0行行第第2行行 for (j=0;jmax) /如果某元素大于如果某元素大于maxmax=aij; /max將取該元素的值將取該元素的值row=i; /記下該元素的行號記下該元素的行號icolum=j; /記下該元素的列號記下該元素的列號j coutmax=max,row=row,colum=colu
28、mendl; return 0; 輸出結果為輸出結果為 max=56,row=0,colum=3常量和變量可以用作函數實參,同樣數組元素也可常量和變量可以用作函數實參,同樣數組元素也可以作函數實參,其用法與變量相同。數組名也可以以作函數實參,其用法與變量相同。數組名也可以作實參和形參,傳遞的是數組的起始地址。作實參和形參,傳遞的是數組的起始地址。1. 用數組元素作函數實參用數組元素作函數實參由于實參可以是表達式,而數組元素可以是表達式由于實參可以是表達式,而數組元素可以是表達式的組成部分,因此數組元素當然可以作為函數的實的組成部分,因此數組元素當然可以作為函數的實參,與用變量作實參一樣,將數組
29、元素的值傳送給參,與用變量作實參一樣,將數組元素的值傳送給形參變量。形參變量。5.4 用數組名作函數參數用數組名作函數參數例例5.6 用函數處理例用函數處理例5.5。算法和例算法和例5.5是一樣的,今設一函數是一樣的,今設一函數max_value,用,用來進行比較并返回結果。可編寫程序如下:來進行比較并返回結果。可編寫程序如下: #include using namespace std;int main( ) int max_value(int x,int max); /函數聲明函數聲明 int i,j,row=0,colum=0,max int a34=5,12,23,56,19,28,37
30、,46,-12,-34,6,8; /數組初始數組初始化化 max=a00; for (i=0;i=2;i+) for (j=0;j=3;j+) max=max_value(aij,max); /調用調用max_value函數函數if(max=aij) /如果函數返回的是如果函數返回的是aij的的值值row=i; /記下該元素行號記下該元素行號i colum=j; /記下該元素列號記下該元素列號j coutmax=max,row=row,colum=colummax) return x; /如果如果xmax,函數返回值為,函數返回值為xelse return max; /如果如果xmax,函數返
31、回值為,函數返回值為max 2. 用數組名作函數參數用數組名作函數參數可以用數組名作函數參數,此時實參與形參都用數可以用數組名作函數參數,此時實參與形參都用數組名(也可以用指針變量,見第組名(也可以用指針變量,見第6章)。章)。例例5.7 用選擇法對數組中用選擇法對數組中10個整數按由小到大排序。個整數按由小到大排序。所謂選擇法就是先將所謂選擇法就是先將10個數中最小的數與個數中最小的數與a0對對換換;再將再將a1到到a9中最小的數與中最小的數與a1對對換換每比較一輪每比較一輪,找出一個未經排序的數中最小找出一個未經排序的數中最小的一個。共比較的一個。共比較9輪。輪。根據此思路編寫程序如下:根
32、據此思路編寫程序如下:#include using namespace std;int main( )void select_sort(int array,int n); /函數聲明函數聲明 int a10,i; coutenter the originl array:endl;for(i=0;iai; coutendl; select_sort(a,10); /函數調用,數組名作實參函數調用,數組名作實參 coutthe sorted array:endl; for(i=0;i10;i+) /輸出輸出10個已排好序的數個已排好序的數 coutai ; coutendl; return 0;v
33、oid select_sort(int array,int n) /形參形參array是數組名是數組名int i,j,k,t; for(i=0;in-1;i+)k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk;arrayk=arrayi;arrayi=t; 運行情況如下:運行情況如下: enter the originl array:6 9 -2 56 87 11 -54 3 0 77 /輸入輸入10個數個數the sorted array:-54 -2 0 3 6 9 11 56 77 87關于用數組名作函數參數有兩點要說明:關于用數組
34、名作函數參數有兩點要說明:(1) 如果函數實參是數組名,形參也應為數組名如果函數實參是數組名,形參也應為數組名(或指針變量,關于指針見第(或指針變量,關于指針見第5章),形參不能聲章),形參不能聲明為普通變量(如明為普通變量(如int array;)。實參數組與形參數)。實參數組與形參數組類型應一致(現都為組類型應一致(現都為int型),如不一致,結果型),如不一致,結果將出錯。將出錯。(2) 需要特別說明的是:需要特別說明的是: 數組名代表數組首元素數組名代表數組首元素的地址,并不代表數組中的全部元素。因此用數組的地址,并不代表數組中的全部元素。因此用數組名作函數實參時名作函數實參時,不是把
35、實參數組的值傳遞給形參,不是把實參數組的值傳遞給形參,而只是將實參數組首元素的地址傳遞給形參。而只是將實參數組首元素的地址傳遞給形參。形參可以是數組名,也可以是指針變量,它們用來形參可以是數組名,也可以是指針變量,它們用來接收實參傳來的地址。如果形參是數組名,它代表接收實參傳來的地址。如果形參是數組名,它代表的是形參數組首元素的地址。在調用函數時,將實的是形參數組首元素的地址。在調用函數時,將實參數組首元素的地址傳遞給形參數組名。這樣,實參數組首元素的地址傳遞給形參數組名。這樣,實參數組和形參數組就共占同一段內存單元。見圖參數組和形參數組就共占同一段內存單元。見圖5.6。圖圖5.6在用變量作函
36、數參數時,只能將實參變量的值傳給在用變量作函數參數時,只能將實參變量的值傳給形參變量,在調用函數過程中如果改變了形參的值,形參變量,在調用函數過程中如果改變了形參的值,對實參沒有影響,即實參的值不因形參的值改變而對實參沒有影響,即實參的值不因形參的值改變而改變。而用數組名作函數實參時改變。而用數組名作函數實參時,改變形參數組元改變形參數組元素的值將同時改變實參數組元素的值。在程序設計素的值將同時改變實參數組元素的值。在程序設計中往往有意識地利用這一特點改變實參數組元素的中往往有意識地利用這一特點改變實參數組元素的值。值。實際上,聲明形參數組并不意味著真正建立一個包實際上,聲明形參數組并不意味著
37、真正建立一個包含若干元素的數組,在調用函數時也不對它分配存含若干元素的數組,在調用函數時也不對它分配存儲單元,只是用儲單元,只是用array這樣的形式表示這樣的形式表示array是是一維數組名,以接收實參傳來的地址。因此一維數組名,以接收實參傳來的地址。因此array中方括號內的數值并無實際作用,編譯系統對中方括號內的數值并無實際作用,編譯系統對一維數組方括號內的內容不予處理。形參一維數組一維數組方括號內的內容不予處理。形參一維數組的聲明中可以寫元素個數,也可以不寫。的聲明中可以寫元素個數,也可以不寫。函數首部的下面幾種寫法都合法,作用相同。函數首部的下面幾種寫法都合法,作用相同。void s
38、elect_sort(int array10,int n) /指定元素個數與實參數組指定元素個數與實參數組相同相同void select_sort(int array,int n) /不指定元素個數不指定元素個數void select_sort(int array5,int n) /指定元素個數與實參數組指定元素個數與實參數組不同不同在學習第在學習第6章時可以進一步知道,章時可以進一步知道,C+實際上只把實際上只把形參數組名作為一個指針變量來處理,用來接收從形參數組名作為一個指針變量來處理,用來接收從實參傳過來的地址。前面提到的一些現象都是由此實參傳過來的地址。前面提到的一些現象都是由此而產生
39、的。而產生的。3. 用多維數組名作函數參數用多維數組名作函數參數如果用二維數組名作為實參和形參,在對形參數組如果用二維數組名作為實參和形參,在對形參數組聲明時,必須指定第二維(即列)的大小,且應與聲明時,必須指定第二維(即列)的大小,且應與實參的第二維的大小相同。第一維的大小可以指定,實參的第二維的大小相同。第一維的大小可以指定,也可以不指定。如也可以不指定。如int array310; /形參數組的兩個維都指定形參數組的兩個維都指定或或 int array10; /第一維大小省略第一維大小省略二者都合法而且等價。但是不能把第二維的大小省二者都合法而且等價。但是不能把第二維的大小省略。下面的形
40、參數組寫法不合法:略。下面的形參數組寫法不合法:int array; /不能確定數組的每一行有多少列元素不能確定數組的每一行有多少列元素int array3; /不指定列數就無法確定數組的結構不指定列數就無法確定數組的結構在第二維大小相同的前提下,形參數組的第一維可在第二維大小相同的前提下,形參數組的第一維可以與實參數組不同。例如,實參數組定義為以與實參數組不同。例如,實參數組定義為int score510; 而形參數組可以聲明為而形參數組可以聲明為int array310; /列數與實參數組相同,行數不同列數與實參數組相同,行數不同int array810;這時形參二維數組與實參二維數組都是
41、由相同類型這時形參二維數組與實參二維數組都是由相同類型和大小的一維數組組成的,實參數組名和大小的一維數組組成的,實參數組名score代表代表其首元素(即第一行)的起始地址,系統不檢查第其首元素(即第一行)的起始地址,系統不檢查第一維的大小。一維的大小。如果是三維或更多維的數組,處理方法是類似的。如果是三維或更多維的數組,處理方法是類似的。例例5.8 有一個有一個的矩陣,求矩陣中所有元素中的矩陣,求矩陣中所有元素中的最大值。要求用函數處理。的最大值。要求用函數處理。解此題的算法已在例解此題的算法已在例5.5中介紹。中介紹。程序如下:程序如下:#include using namespace st
42、d;int main( )int max_value(int array4); int a34=11,32,45,67,22,44,66,88,15,72,43,37; coutmax value is max_value(a)endl; return 0;int max_value(int array4)int i,j,max; max=array00; for( i=0;i3;i+) for(j=0;jmax) max=arrayij; return max;運行結果如下:運行結果如下:max value is 88 讀者可以將讀者可以將max_value函數的首部改為以下幾種情函數的首部
43、改為以下幾種情況,觀察編譯情況:況,觀察編譯情況:int max_value(int array) int max_value(int array3)int max_value(int array34)int max_value(int array1010)int max_value(int array12)用來存放字符數據的數組是字符數組,字符數組中用來存放字符數據的數組是字符數組,字符數組中的一個元素存放一個字符。字符數組具有數組的共的一個元素存放一個字符。字符數組具有數組的共同屬性。由于字符串應用廣泛,同屬性。由于字符串應用廣泛,C和和C+專門為它專門為它提供了許多方便的用法和函數。提供
44、了許多方便的用法和函數。5.5 字符數組字符數組定義字符數組的方法與前面介紹的類似。例如定義字符數組的方法與前面介紹的類似。例如char c10;c0=I;c1= ;c2=a;c3=m;c4= ;c5=h;c6=a;c7=p;c8=p; c9=y;上面定義了上面定義了c為字符數組,包含為字符數組,包含10個元素。在賦值個元素。在賦值以后數組的狀態如圖以后數組的狀態如圖5.7所示。所示。圖圖5.75.5.1 字符數組的定義和初始化字符數組的定義和初始化對字符數組進行初始化,最容易理解的方式是逐個對字符數組進行初始化,最容易理解的方式是逐個字符賦給數組中各元素。如字符賦給數組中各元素。如char
45、c10=I, ,a,m, ,h,a,p,p,y;把把10個字符分別賦給個字符分別賦給c0c9這這10個元素。個元素。如果花括號中提供的初值個數大于數組長度,則按如果花括號中提供的初值個數大于數組長度,則按語法錯誤處理。如果初值個數小于數組長度,則只語法錯誤處理。如果初值個數小于數組長度,則只將這些字符賦給數組中前面那些元素,其余的元素將這些字符賦給數組中前面那些元素,其余的元素自動定為空字符。如果提供的初值個數與預定的數自動定為空字符。如果提供的初值個數與預定的數組長度相同,在定義時可以省略數組長度,系統會組長度相同,在定義時可以省略數組長度,系統會自動根據初值個數確定數組長度。如自動根據初值
46、個數確定數組長度。如char c=I, ,a,m, ,h,a,p,p,y;也可以定義和初始化一個二維字符數組,如也可以定義和初始化一個二維字符數組,如char diamond55= , ,*, , *, ,*,*, , , ,*, ,*, ,*, , ,*;只能對字符數組的元素賦值,而不能用賦值語句對只能對字符數組的元素賦值,而不能用賦值語句對整個數組賦值。如整個數組賦值。如char c5;c=C,h,i,n,a; /錯誤,不能對整個數組一次賦值錯誤,不能對整個數組一次賦值c0=C; c1=h;c2=i;c3=n;c4=a; /對數組元素賦值,對數組元素賦值,正確正確如果已定義了如果已定義了a
47、和和b是具有相同類型和長度的數組,是具有相同類型和長度的數組,且且b數組已被初始化,請分析:數組已被初始化,請分析: a=b; /錯誤,不能對整個數組整體賦值錯誤,不能對整個數組整體賦值a0=b0; /正確,引用數組元素正確,引用數組元素 5.5.2 字符數組的賦值與引用字符數組的賦值與引用例例5.9 設計和輸出一個鉆石圖形。設計和輸出一個鉆石圖形。 #include using namespace std;void main( )char diamond5= , ,*, ,*, ,*,*, , , ,*, ,*, ,*, , ,*; int i,j; for (i=0;i5;i+) for
48、(j=0;j5;j+)coutdiamondij; /逐個引用數組元素,每次輸出一個字符逐個引用數組元素,每次輸出一個字符coutendl;運行結果為運行結果為 * * * * * * *用一個字符數組可以存放一個字符串中的字符。如用一個字符數組可以存放一個字符串中的字符。如char str12=I, ,a,m, ,h,a,p,p,y;用一維字符數組用一維字符數組str來存放一個字符串來存放一個字符串I am happy中的字符。字符串的實際長度(中的字符。字符串的實際長度(10)與數組長度)與數組長度(12)不相等,在存放上面)不相等,在存放上面10個字符之外,系統對個字符之外,系統對字符數
49、組最后兩元素自動填補空字符字符數組最后兩元素自動填補空字符0。為了測定字符串的實際長度,為了測定字符串的實際長度,C+規定了一個規定了一個“字字符串結束標志符串結束標志”,以字符,以字符0代表。在上面的數組代表。在上面的數組中,第中,第11個字符為個字符為0,就表明字符串的有效字符,就表明字符串的有效字符為其前面的為其前面的10個字符。也就是說,遇到字符個字符。也就是說,遇到字符0就就表示字符串到此結束,由它前面的字符組成字符串。表示字符串到此結束,由它前面的字符組成字符串。5.5.3 字符串和字符串結束標志字符串和字符串結束標志對一個字符串常量,系統會自動在所有字符的后面對一個字符串常量,系
50、統會自動在所有字符的后面加一個加一個0作為結束符。例如字符串作為結束符。例如字符串I am happy共有共有10個字符,但在內存中它共占個字符,但在內存中它共占11個字節,最后個字節,最后一個字節一個字節0是由系統自動加上的。是由系統自動加上的。在程序中往往依靠檢測在程序中往往依靠檢測0的位置來判定字符串是的位置來判定字符串是否結束,而不是根據數組的長度來決定字符串長度。否結束,而不是根據數組的長度來決定字符串長度。當然,在定義字符數組時應估計實際字符串長度,當然,在定義字符數組時應估計實際字符串長度,保證數組長度始終大于字符串實際長度。如果在一保證數組長度始終大于字符串實際長度。如果在一個
51、字符數組中先后存放多個不同長度的字符串,則個字符數組中先后存放多個不同長度的字符串,則應使數組長度大于最長的字符串的長度。應使數組長度大于最長的字符串的長度。說明:說明: 0只是一個供辨別的標志。只是一個供辨別的標志。如果用以下語句輸出一個字符串:如果用以下語句輸出一個字符串:coutstr; /用字符數組名輸入字符串用字符數組名輸入字符串coutstr; /用字符數組名輸出字符串用字符數組名輸出字符串在運行時輸入一個字符串,如在運行時輸入一個字符串,如China 在內存中,數組在內存中,數組str的狀態如圖的狀態如圖5.9所示,在所示,在5個字符個字符的后面自動加了一個結束符的后面自動加了一
52、個結束符0。5.5.4 字符數組的輸入輸出字符數組的輸入輸出圖圖5.9輸出時,逐個輸出字符直到遇結束符輸出時,逐個輸出字符直到遇結束符0,就停止,就停止輸出。輸出結果為輸出。輸出結果為China如前所述,字符數組名如前所述,字符數組名str代表字符數組第一個元代表字符數組第一個元素的地址,執行素的地址,執行“coutstr;”的過程是從的過程是從str所指向所指向的數組第一個元素開始逐個輸出字符,直到遇到的數組第一個元素開始逐個輸出字符,直到遇到0為止。為止。請注意:請注意:(1) 輸出的字符不包括結束符輸出的字符不包括結束符0。(2) 輸出字符串時,輸出字符串時,cout流中用字符數組名,而
53、流中用字符數組名,而不是數組元素名。不是數組元素名。 (3) 如果數組長度大于字符串實際長度,也只輸如果數組長度大于字符串實際長度,也只輸出到遇出到遇0結束。結束。(4) 如果一個字符數組中包含一個以上如果一個字符數組中包含一個以上0,則,則遇第一個遇第一個0時輸出就結束。時輸出就結束。(5) 用用cin從鍵盤向計算機輸入一個字符串時,從從鍵盤向計算機輸入一個字符串時,從鍵盤輸入的字符串應短于已定義的字符數組的長度,鍵盤輸入的字符串應短于已定義的字符數組的長度,否則會出現問題。否則會出現問題。C+提供了提供了cin流中的流中的getline函數,用于讀入一行字函數,用于讀入一行字符(或一行字符
54、中前若干個字符),使用安全又方符(或一行字符中前若干個字符),使用安全又方便,請參閱第便,請參閱第13章章13.3.2節。節。由于字符串使用廣泛,由于字符串使用廣泛,C和和C+提供了一些字符串提供了一些字符串函數,使得用戶能很方便地對字符串進行處理。幾函數,使得用戶能很方便地對字符串進行處理。幾乎所有版本的乎所有版本的C+都提供下面這些函數,它們是放都提供下面這些函數,它們是放在函數庫中的,在在函數庫中的,在string和和string.h頭文件中定義。頭文件中定義。如果程序中使用這些字符串函數,應該用如果程序中使用這些字符串函數,應該用#include命令把命令把string.h或或stri
55、ng頭文件包含到本文件中。下頭文件包含到本文件中。下面介紹幾種常用的函數。面介紹幾種常用的函數。5.5.5 字符串處理函數字符串處理函數1. 字符串連接函數字符串連接函數 strcat其函數原型為其函數原型為strcat(char,const char);strcat是是string catenate(字符串連接)的縮寫。該(字符串連接)的縮寫。該函數有兩個字符數組的參數,函數的作用是:將第函數有兩個字符數組的參數,函數的作用是:將第二個字符數組中的字符串連接到前面字符數組的字二個字符數組中的字符串連接到前面字符數組的字符串的后面。第二個字符數組被指定為符串的后面。第二個字符數組被指定為con
56、st,以,以保證該數組中的內容不會在函數調用期間修改。連保證該數組中的內容不會在函數調用期間修改。連接后的字符串放在第一個字符數組中,函數調用后接后的字符串放在第一個字符數組中,函數調用后得到的函數值,就是第一個字符數組的地址。例如得到的函數值,就是第一個字符數組的地址。例如char str130=Peoples Republic of ;char str2=China;cout字符串字符串2,函數值為一正整數。,函數值為一正整數。(3) 如果字符串如果字符串1str2) cout0) coutyes;4. 字符串長度函數字符串長度函數strlen函數原型為函數原型為strlen(const
57、char);strlen是是string length(字符串長度)的縮寫。它是(字符串長度)的縮寫。它是測試字符串長度的函數。其函數的值為字符串中的測試字符串長度的函數。其函數的值為字符串中的實際長度,不包括實際長度,不包括0在內。如在內。如char str10=China;coutstrlen(str);輸出結果不是輸出結果不是10,也不是,也不是6,而是,而是5。以上是幾種常用的字符串處理函數,除此之外還有以上是幾種常用的字符串處理函數,除此之外還有其他一些函數。其他一些函數。例例5.10 有有3個字符串個字符串,要求找出其中最大者。要求用要求找出其中最大者。要求用函數調用。函數調用。程
58、序如下:程序如下:#include #include using namespace std;int main( ) void max_string(char str30,int i); /函數聲明函數聲明int i; char country_name330; for(i=0;icountry_namei; /輸入輸入3個國家名個國家名 max_string(country_name,3); /調用調用max_string函數函數 return 0;5.5.6 字符數組應用舉例字符數組應用舉例void max_string(char str30,int n) int i; char stri
59、ng30; strcpy(string,str0); /使使string的值為的值為str0的值的值 for(i=0;i0) /如果如果stristringstrcpy(string,stri); /將將stri中的字符串復制到中的字符串復制到string coutendlthe largest string is: stringendl;運行結果如下:運行結果如下:CHINA GERMANY FRANCH the largest string is: GERMANY用字符數組來存放字符串并不是最理想和最安全的用字符數組來存放字符串并不是最理想和最安全的方法。方法。C+提供了一種新的數據類型提
60、供了一種新的數據類型字符串類型字符串類型(string類型),在使用方法上,它和類型),在使用方法上,它和char、int類類型一樣,可以用來定義變量,這就是字符串變量型一樣,可以用來定義變量,這就是字符串變量用一個名字代表一個字符序列。用一個名字代表一個字符序列。實際上,實際上,string并不是并不是C+語言本身具有的基本類語言本身具有的基本類型,它是在型,它是在C+標準庫中聲明的一個字符串類,用標準庫中聲明的一個字符串類,用這種類可以定義對象。每一個字符串變量都是這種類可以定義對象。每一個字符串變量都是string類的一個對象。類的一個對象。*5.6 C+處理字符串的方法處理字符串的方法
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 設備檢修安全管理制度
- 設備等級評估管理制度
- 2025年中國家庭影院立體聲接收器行業市場全景分析及前景機遇研判報告
- 設計成果運用管理制度
- 評估公司價格管理制度
- 診所醫療軟件管理制度
- 診所財務制度管理制度
- 貝殼門店分級管理制度
- 財務集中中心管理制度
- 賬務實物分開管理制度
- MOOC 工程倫理-西南石油大學 中國大學慕課答案
- 24春國家開放大學《教育法學》終結性考試(大作業)參考答案
- 小米汽車發布會
- 設計質量管理和保證措施及設計質量管理和質量保證措施
- 國家級社會體育指導員理論考試試題及答案
- 小學科學學法指導
- 充電樁建設項目可行性研究報告
- 第七屆全國急救技能大賽(醫生組)理論考試題庫大全-下部分
- 分級護理制度培訓
- 初中物理核心素養培養
- 安全應急管理培訓
評論
0/150
提交評論