C++一維數組
定義一維數組
定義一維數組的一般格式為:
類型標識符 數組名[常量表達式];
例如:
int a[10];
它表示數組名為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行改為下面一行就合法了:
const int n=5;
引用一維數組的元素
數組必須先定義,然后使用。只能逐個引用數組元素的值而不能一次引用整個數組中的全部元素的值。
數組元素的表示形式為:
數組名[下標]
下標可以是整型常量或整型表達式。例如:
a[0]= a[5]+ a[7]- a[2*3]
【例】數組元素的引用。
#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;}運行結果如下:
9 8 7 6 5 4 3 2 1 0
程序使a[0]~a[9]的值為0~9,然后按逆序輸出。
一維數組的初始化
1) 在定義數組時分別對數組元素賦予初值。例如:
int a[10]={0,1,2,3,4,5,6,7,8,9};2) 可以只給一部分元素賦值。例如:
int a[10]={0,1,2,3,4};3) 如果想使一個數組中全部元素值為1,可以寫成:
int a[10]={1,1,1,1,1,1,1,1,1,1};
不能寫成
int a[10]={1*10};
不能給數組整體賦初值。
4) 在對全部數組元素賦初值時,可以不指定數組長度。例如:
int a[5]={1,2,3,4,5};
可以寫成
int a[]={1,2,3,4,5};
一維數組程序舉例
【例】用數組來處理求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;}運行情況如下: