Presentation is loading. Please wait.

Presentation is loading. Please wait.

向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。

Similar presentations


Presentation on theme: "向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。"— Presentation transcript:

1 向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。
7 陣列 向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。

2 陣列 7.1 一維陣列 7.2 將陣列當成函數的參數 7.3 二維陣列 7.4 將二維陣列當成函數的參數

3 一維陣列 我們常把陣列長度以整數常數 (const int) 的型式另外宣告:
double Temperature [600]; int Record [52]; char Name [15]; 我們常把陣列長度以整數常數 (const int) 的型式另外宣告: const int RecordSize = 600; double Temp [RecordSize]; 注意上述陣列長度必需為const int,不能是int,因為陣列長度在編譯時必需確定。

4 一維陣列: 宣告的時候可以同時完成初始化的動作
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'};

5 一維陣列各元素在記憶體內的配置情況 const int Size = 5; double Pressure[Size];
P[3] = P[0]*2.0;

6 陣列元件的下標表示法配合 for 迴圈 const int Size = 5; double Average, Sum = 0;
for (int i = 0; i < Size; i++) Sum += P[i]; Average = Sum / double(Size);

7 陣列元件的下標表示法配合 for 迴圈計算其最大的元素值
double Max; Max = P[0]; for (int i = 1; i < Size; i++ ) if (Max < P[i]) Max = P[i];

8 將陣列當成函數的參數 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),在函數中對陣列的任何更動都直接作用在原陣列上。

9 範例程式 ArrayFnc.cpp 使用陣列名稱當成函數參數來傳遞
#include <iostream> using namespace std; double Average(double [], int); // 函數 Average() 的宣告 double MaxElem(double [], int); // 函數 MaxElem() 的宣告 // 主程式 int main() { const int Size = 5; double P[Size] = {48.4, 39.8, 40.5, 42.6, 41.2}; P[0] = 3.2; P[3] = P[0]*2.0;

10 cout << "陣列 P 的平均值是: "
<< Average(P, Size) << endl; cout << "陣列 P 的最大值是: " << MaxElem(P, Size) << endl; } // 函數 Average() 的定義 double Average(double X[], int M) { double Sum = 0; for (int i = 0; i < M; i++) Sum += X[i]; return Sum/double(M);

11 // ------函數 MaxElem() 的定義 ---------------
double MaxElem(double Y[], int N) { double MaxE; MaxE = Y[0]; for (int i = 1; i < N; i++ ) if (MaxE < Y[i]) MaxE = Y[i]; return MaxE; }

12 操作結果 陣列 P 的平均值是: 26.22 陣列 P 的最大值是: 41.2

13 Fibonacci 數列 它所產生的是以下的固定數列:

14 範例程式 Fibo.cpp : 產生Fibonacci 數列
使用 static局 部變數的特性來避免重複計算相同的陣列元素 // Fibo.cpp #include <iostream> using namespace std; // --- 函數 Fibonacci() 的宣告 int Fibonacci(int n); // 主程式 int main() { int InputN, i; const int MaxSize = 100; cout << "請輸入Fibonacci 數列的長度:"; cin >> InputN; if (InputN > MaxSize)

15 cout << "下列是您所指定長度為 " << InputN
{ cerr << "Maximun size exceeded!"; return 0; } cout << "下列是您所指定長度為 " << InputN << " 的 Fibonacci 數列:\n"; for (i=0; i < InputN; i++) cout << Fibonacci(i) << " "; } // --- 函數 Fibonacci() 的定義 int Fibonacci(int N) { int i; static int Fib[MaxSize]; Fib[0] = Fib[1] = 1; for(i = 0; i < MaxSize; i++) if(Fib[i] == 0) break; while(i <= N) { Fib[i] = Fib[i-1] + Fib[i-2]; i++; } return Fib[N];

16 程式 Fibo.cpp 操作結果 請輸入 Fibonacci 數列的長度: 12 下列是您所指定長度為 12 的 Fibonacci 數列:

17 二維陣列 亦稱為矩陣 (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};

18 二維陣列各元素在記憶體內的配置情況 在電腦內部這些資料是以「列」的次序儲存:

19 偏移量 對於一個m×n大小的矩陣M而言,M[i][j] 所在的位址相當於從 M[0][0] 算起,偏移量 (offset) 為
(i × n + j ) 個單位 的地方。

20 使用迴圈計算二維陣列平均值 給定初始值後,可以使用下列迴圈計算其平均值: 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);

21 矩陣元素的兩個下標與迥圈的關係 外圍迴圈是以逐列 (row) 的次序運作,而內圈以逐行 (column) 的次序演算。

22 將二維陣列當成函數的參數 例如,函數的原型 (prototype) 是 或是 而函數的呼叫則使用下列敘述:
double MatrixAvg(double [ ][Col]); 或是 double MatrixAvg(double A[ ][Col]); 而函數的呼叫則使用下列敘述: cout << MatrixAvg(A);

23 範例程式 Array2Fnc.cpp // Array2Fnc.cpp #include <iomanip>
#include <iostream> using namespace std; // ---函數的宣告 void ShowMatrix(double B[][Col]); double MatrixAvg(double [ ][Col]); // 主程式 int main() { const int Row = 2; const int Col = 3; double A[Row][Col]={ 1.8, 4.9, 6.8, 6.2, 2.1, 3.4};

24 cout << "陣列 A 是: " << endl;
ShowMatrix(A); cout << "陣列 A 的平均值是: " << MatrixAvg(A) << endl; cout << "直接將 A 輸出的結果是: " << A << endl; } // ---函數 ShowMatrix() 的定義 void ShowMatrix(double B[][Col]) { for (int i=0; i < Row; i++) for (int j=0; j < Col; j++) cout << setw(5) << B[i][j]; cout << endl; return;

25 // ---函數 MatrixAvg() 的定義 ------
double MatrixAvg(double M[ ][Col]) { double Sum = 0; int i, j; for (i=0; i < Row; i++) for (j=0; j < Col; j++) Sum += M[i][j]; return Sum / double(Row*Col); }

26 操作結果 陣列 A 是: 陣列 A 的平均值是: 4.2 直接將 A 輸出的結果是: 0065FDEC

27 三維陣列(tensor) 對於一個m×n×p大小的張量T而言,元素T[i][j][k] 所在的位址相當於從T[0][0][0] 算起,偏移量 (offset) 為 (i × n × p + j × p + k ) 個單位的地方。


Download ppt "向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。"

Similar presentations


Ads by Google