C++一維數組
定義一維數組
定義一維數組的一般格式為:
類型標識符 數組名[常量運算式];
例如:
它表示數組名為a,此數組為整型,有10個元素。
關於一維數組的幾點說明:
1) 數組名定名規則和變數名相同,遵循標識符定名規則。
2) 用方括弧括起來的常量運算式表示下標值,如下面的寫法是合法的:
int a[10]; int a[2*5]; int a[n*2]; //假設前面已定義了n為常變數
3) 常量運算式的值表示元素的個數,即數組長度。例如,在“int a[10];”中,10表示a數組有10個元素,下標從0開始,這10個元素是: a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7], a[8],a[9]。注意最後一個元素是a[9]而不是a[10]。
4) 常量運算式中可以包括常量、常變數和符號常量,但不能包含變數。也就是說,C++不允許對數組的大小作動態定義,即數組的大小不依賴於程式運行過程中變數的值。例如,下面這樣定義數組是不行的:
int n; cin>>n; //輸入a數組的長度 int a[n]; //企圖根據n的值決定數組的長度
如果把第1,2行改為下面一行就合法了:
引用一維數組的元素
數組必須先定義,然後使用。只能逐個引用數組元素的值而不能一次引用整個數組中的全部元素的值。
數組元素的表示形式為:
數組名[下標]
下標可以是整型常量或整型運算式。例如:
【例】數組元素的引用。
#include <iostream>using namespace std;int main( ){ int i, a[10]; for (i=0;i<=9;i++) a[i]=i; for (i=9;i>=0;i--) cout<<a[i]<<" "; cout<<endl; return 0;}
運行結果如下:
程式使a[0]~a[9]的值為0~9,然後按逆序輸出。
一維數組的初始化
1) 在定義數組時分別對數組元素賦予初值。例如:
int a[10]={0,1,2,3,4,5,6,7,8,9};
2) 可以只給一部分元素賦值。例如:
3) 如果想使一個數組中全部元素值為1,可以寫成:
int a[10]={1,1,1,1,1,1,1,1,1,1};
不能寫成
不能給數組整體賦初值。
4) 在對全部數組元素賦初值時,可以不指定數組長度。例如:
可以寫成
一維數組程式舉例
【例】用數組來處理求Fibonacci數列問題。
可以用20個元素代表數列中的20個數,從第3個數開始,可以直接用運算式f[i]=f[i-2]+f[i-1]求出各數。程式如下:
#include <iostream>#include <iomanip>using namespace std;int main( ){ int i; int f[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時,f[2]=f[0]+f[1],依此類推 for(i=0;i<20;i++) //此迴圈的作用是輸出20個數 { if(i%5==0) cout<<endl; //控制換行,每行輸出5個資料 cout<<setw(8)<<f[i]; //每個資料輸出時佔8列寬度 } cout<<endl; //最後執行一次換行 return 0;}
運行結果如下:
【例】編寫程式,用起泡法對10個數排序(按由小到大順序)。
起泡法的思路是:將相鄰兩個數比較,將小的調到前頭。見圖5.2。然後進行第2趟比較,對餘下的前面5個數按上法進行比較,見圖。
可以推知,如果有n個數,則要進行n-1趟比較(和交換)。在第1趟中要進行n-1次兩兩比較,在第j趟中要進行n-j次兩兩比較。
根據以上思路寫出程式,今設n=10,本例定義數組長度為11,a[0]不用,只用a[1]~a[10],以符合人們的習慣。從前面的敘述可知,應該進行9趟比較和交換。
#include <iostream>using namespace std;int main( ){ int a[11]; int i, j, t; cout<<"input 10 numbers :"<<endl; for (i=1;i<11;i++) //輸入a[1]~a[10] cin>>a[i]; cout<<endl; for (j=1;j<=9;j++) //共進行9趟比較 for(i=1;i<=10-j;i++)//在每趟中要進行(10-j)次兩兩比較 if (a[i]>a[i+1]) //如果前面的數大於後面的數 { t=a[i];a[i]=a[i+1];a[i+1]=t; }//交換兩個數的位置, 使小數上浮 cout<<"the sorted numbers :"<<endl; for(i=1;i<11;i++) //輸出10個數 cout<<a[i]<<" "; cout<<endl; return 0;}
運行情況如下:
input 10 numbers:3 5 9 11 33 6 -9 -76 100 123the sorted numbers:-76 -9 3 5 6 9 11 33 100 123
C++二維數組
具有兩個下標的數組稱為二維數組。有些資料要依賴於兩個因素才能惟一地確定,例如有3個學生,每個學生有4門課的成績,顯然,成績資料是一個二維表,如書中表所示。
想表示第3個學生第4門課的成績,就需要指出學生的序號和課程的序號兩個因素,在數學上以S3,4表示。在C++中以s[3][4]表示,它代表資料73。
定義二維數組
定義二維數組的一般形式為:
類型標識符 數組名[常量運算式][常量運算式];
例如:
定義a為3×4(3行4列)的單精確度數組,b為5×10(5行10列)的單精確度數組。注意不能寫成“float a[3,4], b[5,10];”。C++對二維數組採用這樣的定義方式,使我們可以把二維數組看作是一種特殊的一維數組:它的元素又是一個一維數組。例如,可以把a看作是一個一維數組,它有3個元素:a[0],a[1],a[2],每個元素又是一個包含4個元素的一維數組,見圖5.4。a[0],a[1],a[2]是3個一維數組的名字。
上面定義的二維數組可以理解為定義了3個一維數組,即相當於:
float a[0][4], a[1][4], a[2][4];
此處把a[0],a[1],a[2]作一維數組名。C++的這種處理方法在數組初始化和用指標表示時顯得很方便,這在以後會體會到。
C++中,二維數組中元素排列的順序是:按行存放,即在記憶體中先順序存放第一行的元素,再存放第二行的元素。圖表示對a[3][4]數組存放的順序。
上面定義的二維數組可以理解為定義了3個一維數組,即相當於:
float a[0][4], a[1][4], a[2][4];
此處把a[0],a[1],a[2]作一維數組名。C++的這種處理方法在數組初始化和用指標表示時顯得很方便,這在以後會體會到。
C++中,二維數組中元素排列的順序是:按行存放,即在記憶體中先順序存放第一行的元素,再存放第二行的元素。圖5.5表示對a[3][4]數組存放的順序。
C++允許使用多維陣列。有了二維數組的基礎,再掌握多維陣列是不困難的。例如,定義三維數組的方法是:
float a[2][3][4];
定義float型三維數組a,它有2×3×4=24個元素。多維陣列元素在記憶體中的排列順序:第一維的下標變化最慢,最右邊的下標變化最快。例如,上述三維數組的元素排列順序為:
複製代碼 代碼如下:
a[0][0][0]→a[0][0][1]→a[0][0][2]→a[0][0][3]→a[0][1][0]→a[0][1][1]→a[0][1][2]→a[0][1][3]→a[0][2][0]→a[0][2][1]→a[0][2][2]→a[0][2][3]→a[1][0][0]→a[1][0][1]→a[1][0][2]→a[1][0][3]→a[1][1][0]→a[1][1][1]→a[1][1][2]→a[1][1][3]→a[1][2][0]→a[1][2][1]→a[1][2][2]→a[1][2][3]
二維數組的引用
二維數組的元素的表示形式為:
如:
下標可以是整型運算式,如a[2-1][2*2-1]。不要寫成a[2,3],a[2-1,2*2-1]形式。
數組元素是左值,可以出現在運算式中,也可以被賦值,例如:
在使用數組元素時,應該注意下標值應在已定義的數組大小的範圍內。常出現的錯誤是:
int a[3][4]; //定義3行4列的數組 ┆ a[3][4]=15; //引用a[3][4]元素
定義a為3×4的數組,它可用的行下標值最大為2,列座標值最大為3。最多可以用到a[2][3],a[3][4]就超過了數組的範圍。
請嚴格區分在定義數組時用的a[3][4]和引用元素時的a[3][4]的區別。前者a[3][4]用來定義數組的維數和各維的大小,後者a[3][4]中的3和4是下標值,a[3][4]代表某一個元素。
二維數組的初始化
可以用下面的方法對二維數組初始化:
1) 分行給二維數組賦初值。如
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
這種賦初值方法比較直觀,把第1個花括弧內的資料賦給第1行的元素,第2個花括弧內的資料賦給第2行的元素……即按行賦初值。
2) 可以將所有資料寫在一個花括弧內,按數組排列的順序對各元素賦初值。如
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
效果與前相同。但以第1種方法為好,一行對一行,界限清楚。用第2種方法如果資料多,寫成一大片,容易遺漏,也不易檢查。
3) 可以對部分元素賦初值。如:
int a[3][4]={{1},{5},{9}};
它的作用是只對各行第1列的元素賦初值,其餘元素值自動置為0。賦初值後數組各元素為:
也可以對各行中的某一元素賦初值:
int a[3][4]={{1},{0,6},{0,0,11}};
初始化後的數組元素如下:
這種方法對非0元素少時比較方便,不必將所有的0都寫出來,只需輸入少量資料。也可以只對某幾行元素賦初值:
數組元素為:
第3行不賦初值。也可以對第2行不賦初值:
int a[3][4]={{1},{},{9}};
4) 如果對全部元素都賦初值(即提供全部初始資料),則定義數組時對第一維的長度可以不指定,但第二維的長度不能省。如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
可以寫成
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
系統會根據資料總個數分配儲存空間,一共12個資料,每行4列,當然可確定為3行。
在定義時也可以只對部分元素賦初值而省略第一維的長度,但應分行賦初值。如
int a[][4]={{0,0,3},{},{0,10}};
這樣的寫法,能通知編譯系統: 數組共有3行。數組各元素為:
C++在定義數組和表示數組元素時採用a[][]這種兩個方括弧的方式,對數組初始化時十分有用,它使概念清楚,使用方便,不易出錯。
二維數組程式舉例
【例】將一個二維數組行和列元素互換,存到另一個二維數組中。例如:
程式如下:
#include <iostream>using namespace std;int main( ){ int a[2][3]={{1,2,3},{4,5,6}}; int b[3][2],i,j; cout<<"array a:"<<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<<"array b:"<<endl; for (i=0;i<=2;i++) { for(j=0;j<=1;j++) cout<<b[i][j]<<" "; cout<<endl; } return 0;}
運行結果如下:
array a: 1 2 3 4 5 6array b: 1 4 2 5 3 6
【例】有一個3×4的矩陣,要求編程式求出其中值最大的那個元素的值,以及其所在的行號和列號。
開始時把a[0][0]的值賦給變數max,然後讓下一個元素與它比較,將二者中值大者儲存在max中,然後再讓下一個元素與新的max比,直到最後一個元素比完為止。max最後的值就是數組所有元素中的最大值。程式如下:
#include <iostream>using namespace std;int main( ){ int i,j,row=0,colum=0,max; int a[3][4]={{5,12,23,56},{19,28,37,46},{-12,-34,6,8}}; max=a[0][0];//使max開始時取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; //記下該元素的行號i colum=j;//記下該元素的列號j } cout<<"max="<<max<<",row="<<row<<",colum="<<colum<<endl; return 0;}
輸出結果為