270 likes | 395 Views
7. 陣列. 向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。. 陣列. 7.1 一維陣列 7.2 將陣列當成函數的參數 7.3 二維陣列 7.4 將二維陣列當成函數的參數. 一維陣列. double Temperature [600]; int Record [52]; char Name [15]; 我們常把陣列長度以整數常數 (const int) 的型式另外宣告: const int RecordSize = 600;
E N D
7 陣列 向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。
陣列 • 7.1 一維陣列 • 7.2 將陣列當成函數的參數 • 7.3 二維陣列 • 7.4 將二維陣列當成函數的參數
一維陣列 double Temperature [600]; int Record [52]; char Name [15]; • 我們常把陣列長度以整數常數 (const int) 的型式另外宣告: const int RecordSize = 600; double Temp [RecordSize]; • 注意上述陣列長度必需為const int,不能是int,因為陣列長度在編譯時必需確定。
一維陣列: 宣告的時候可以同時完成初始化的動作 double Temp[5] = {48.4, 39.8, 40.5, 42.6, 41.2}; int Scope[] = {82, 78, 62, 69}; char Name[] = {'L','u','l','u'};
一維陣列各元素在記憶體內的配置情況 const int Size = 5; double Pressure[Size]; P[0] = 3.2; P[3] = P[0]*2.0;
陣列元件的下標表示法配合 for 迴圈 const int Size = 5; double Average, Sum = 0; for (int i = 0; i < Size; i++) Sum += P[i]; Average = Sum / double(Size);
陣列元件的下標表示法配合 for 迴圈計算其最大的元素值 double Max; Max = P[0]; for (int i = 1; i < Size; i++ ) if (Max < P[i]) Max = P[i];
將陣列當成函數的參數 cout << Average(P, Size) << endl; cout << MaxElem(P, Size) << endl; • 其中Size為先前宣告過的const int,代表陣列的長度。 • 函數的原型則寫成: double Average(double [], int); double MaxElem(double [], int); • 相當於是傳位址 (pass by address,或稱為call by address,「以位址呼叫」的意思),而不是傳值 (pass by value),在函數中對陣列的任何更動都直接作用在原陣列上。
範例程式 ArrayFnc.cpp 使用陣列名稱當成函數參數來傳遞
Fibonacci 數列 • 它所產生的是以下的固定數列: 1 1 2 3 5 8 13 21 .................
使用 static局 部變數的特性來避免重複計算相同的陣列元素 範例程式 Fibo.cpp : 產生Fibonacci 數列
二維陣列 • 亦稱為矩陣 (matrix) 或是表 (table)。例如 • 在C++ 中宣告成: double M[2][3]; • 如果加上初始化數據,則可以寫做: double M[2][3] = { {1.8, 4.9, 6.8},{6.2, 2.1, 3.4}}; double M[2][3] = { 1.8, 4.9, 6.8,6.2, 2.1, 3.4}; double M[][3] = { 1.8, 4.9, 6.8, 6.2, 2.1, 3.4};
二維陣列各元素在記憶體內的配置情況 • 在電腦內部這些資料是以「列」的次序儲存:
偏移量 • 對於一個m×n大小的矩陣M而言,M[i][j] 所在的位址相當於從 M[0][0] 算起,偏移量 (offset) 為 (i × n + j ) 個單位 的地方。
使用迴圈計算二維陣列平均值 const int Row = 2; const int Col = 3; double A[Row][Col]; • 給定初始值後,可以使用下列迴圈計算其平均值: double Sum = 0, Average; for (int i = 0; i < Row; i++) for (int j = 0; j < Col; j++) Sum += A[i][j]; Average = Sum / double(Row*Col);
矩陣元素的兩個下標與迥圈的關係 • 外圍迴圈是以逐列 (row) 的次序運作,而內圈以逐行 (column) 的次序演算。
將二維陣列當成函數的參數 • 例如,函數的原型 (prototype) 是 double MatrixAvg(double [ ][Col]); 或是 double MatrixAvg(double A[ ][Col]); 而函數的呼叫則使用下列敘述: cout << MatrixAvg(A);
三維陣列(tensor) • 對於一個m×n×p大小的張量T而言,元素T[i][j][k]所在的位址相當於從T[0][0][0]算起,偏移量 (offset) 為 (i × n × p + j × p + k ) 個單位的地方。