ch5陣列
陣列是將相同資料型別的多個變數結合在一起,每個陣列元素皆可視為變數使用,陣列佔有連續的記憶體空間,陣列提供索引值(index)存取陣列中個別元素,C語言規定陣列的第一個元素其索引值為0,第二個元素其索引值為1,依此類推,一個陣列擁有n個元素,若要存取陣列最後一個元素,需設定索引值為n-1,由此可知,每個索引值對應唯一一個陣列元素,因此我們只要指定陣列與索引值就可存取陣列中指定的元素。
不使用陣列與使用陣列的差異,若程式中要計算全班30位同學的國文科成績的總分,不使用陣列則需宣告30個變數(例如:score1、score2、…、score30)去儲存30個國文科成績,再去加總「sum=score1+score2+…+score30」獲得國文科全班總分;若使用陣列則可以利用陣列索引值概念與迴圈結構,使用迴圈控制陣列索引值存取與累加每一個元素,達成加總的功能,在成績計算總分、不及格人數、分數人數分佈等統計使用陣列較容易撰寫,尤其在樣本空間放大時更明顯。
使用變數累加500個成績計算總分
int score1,score2,score3,score4,…,score500;
sum=score1+score2+score3+score4+…+score500;
註:程式中不能寫…,實際上要完成宣告500個變數與500個變數相加的公式。
使用陣列累加500個成績計算總分
int score[500];
for(int i=0;i<500;i++){
sum=sum+score[i];
}
5-1 陣列
陣列是將相同資料型別的多個變數結合在一起,每個陣列元素皆可視為變數使用,陣列佔有連續的記憶體空間,陣列提供索引值(index)存取陣列元素。C語言規定陣列的第一個元素其索引值為0,第二個元素其索引值為1,依此類推,一個陣列擁有n個元素,若要存取陣列最後一個元素,需設定索引值為n-1。
5-2 陣列宣告與初始化
陣列初始化(一)
int A[4];
A[0] = 89;
A[1] = 55;
A[2] = 73;
A[3] = 66;
陣列初始化(二)
int A[4]={89,55,73,66};
陣列初始化(三)
int A[4];
for(int i=0;i<4;i++){
A[i] = 90;
}
5-3 一維陣列與迴圈
利用迴圈變數與陣列索引值結合,經由控制陣列索引值可以存取陣列中所有元素,以下為迴圈變數與陣列索引值結合範例。
使用A[i]存取陣列中元素,使用迴圈控制i的變化,當i等於0,A[i]就會存取陣列A的第一個元素;當i等於1,A[i]就會存取陣列A的第二個元素;當i等於2,A[i]就會存取陣列A的第三個元素,依此類推,就可以存取到陣列所有元素,這就是陣列與迴圈結合可以存取到陣列中所有元素的概念。
基於範圍的for迴圈(Range-based for loop)
C++11以後提供基於範圍的for迴圈(Range-based for loop),可以走訪陣列內所有元素一次。變數宣告為auto,編譯器會推導該變數的資料型別。
語法:
for(auto 變數: 陣列){
重複執行的程式
}
5-4 陣列範例
成績計算
成績計算 - 基於範圍的for迴圈
費氏數列
5-5二維陣列
二維陣列的宣告與初始化
所謂二維陣列的宣告是用於定義二維陣列的名稱與陣列中元素的個數,而初始化是指定陣列中元素的值。例如:int score[5][40],就是宣告一個整數的二維陣列,名稱為score,其列索引值由0到4,共5列,其行索引值0到39,共40行,將其圖示化表示如下圖,程式中使用score[1][2]可以存取陣列score的第2列第3行元素。
二維陣列初始化
二維陣列的使用
程式中使用陣列的優點為可以使用陣列索引存取陣列元素,例如:score[1][2],括弧內1與2分別表示為列索引值為1,行索引值為2,表示為陣列score的第2列第3行元素。也可以將索引值改成以變數i或變數j取代,如:score[i][j],當i等於1且j等於2,則score[i][j]相當於score[1][2],也就是表示陣列score的第2列第3行元素,此時可以使用巢狀迴圈控制變數i與變數j,當變數i與變數j變化時,對應的score[i][j]所對應的元素也會跟著改變。
以下為迴圈與陣列索引存取陣列中元素範例。
行
1
2
3
4
5
6
7
陣列的使用範例
int score[5][40];
srand(time(NULL));
for(int i=0;i<5;i++){
for(int j=0;j<40;j++){
score[i][j]=rand()%101;
}
}
說明
第1行:宣告二維陣列名稱為score有5列40行。
第3到7行:使用巢狀迴圈,迴圈變數i控制列,變數j控制行。程式「rand()%101」隨機產生介於0到100的數值。當i=0,j=0,score[i][j]指向二維陣列score的第1列第1行並將隨機產生的數值儲存入score[0][0]。
當i=0,j=1,score[i][j]指向二維陣列score的第1列第2行並將隨機產生的數值儲存入score[0][1]。
當i=0,j=2,score[i][j]指向二維陣列score的第1列第3行並將隨機產生的數值儲存入score[0][2]。
依此方式,依序產生40個隨機值,填入陣列中第一列,再產生40個隨機值填入第二列,直到填滿五列
完整程式如下
二維陣列的範例 Pascal三角形
設計一程式計算Pascal三角形,其定義如下。
解題想法
使用巢狀迴圈存取二維(8x8)陣列,外層迴圈變數i控制列,內層迴圈變數j控制行,當i值等於2,j值變化由1到1,利用「A[i][j] = A[i-1][j-1]+ A[i-1][j]」求A[2][1],外層迴圈變數i加1,則i值等於3,j值變化由1到2,利用「A[i][j] = A[i-1][j-1]+ A[i-1][j]」求A[3][1]與A[3][2],不斷重複上述動作,最後填滿陣列A即獲得Pascal三角形。
以下為本單元教學影片