C++ 程式初探 III
C++ 程式 II – 大綱 陣列 副函式
陣列 int array [10] #include <iostream.h> int main(void) { 陣列型別 陣列 陣列大小 ; int array [10] #include <iostream.h> int main(void) { int a[10]={0}; //設定初始值為0 for(int i=0; i<10; i++) { a[i] = i+1 } system(“PAUSE”); return 0; a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 1 2 3 4 5 6 7 8 9 10 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
2維陣列 int array [10] [11] ; 陣列型別 陣列 第一維大小 第二維大小 ; 陣列型別 陣列 第一維大小 第二維大小 ; int array [10] [11] ; #include <iostream.h> int main(void) { int array_a [2][3]; //設定大小 int array_b [2][3] = {{1, 2, 3}, {4, 5, 6}}; //初始化 int array_c [][] = {{1, 2, 3}, {4, 5, 6}}; //初始化設定大小 int array_d [2][3] = {0}; //初值為0 const int row = 2; const int col = 3; int array_e [row][col]; system(“PAUSE”); return 0; }
多維陣列 #include <iostream.h> int main(void) { int array_a [2][3][4]; //設定大小 //初始化 int array_b [2][3][2] = {{{0,1}, {2,3}, {4,5}}, {{6,7}, {8,9}, {10,11}}}; int array_c [2][3][2] = {0,1,2,3,4,5, 6,7,8,9,10,11}; system(“PAUSE”); return 0; }
練習 1 – 移動平均法 double a[7] = {0.2, 5.5, 9.9, 5.9, 1.6, 8.0, 5.1}; 利用移動平均法,計算每三個數字為一期的平均數。 0.2 5.5 9.9 5.9 1.6 8.0 5.1 a[0] a[1] a[2] a[3] a[4] a[5] a[6] (0.2+5.5+9.9)/3= 5.2 0.2 5.5 9.9 5.9 1.6 8.0 5.1 a[0] a[1] a[2] a[3] a[4] a[5] a[6] 5.2 7.1 5.8 5.167 4.9
陣列練習-找最大值 #include <iostream.h> int main(void) { int a[7] = {8,4,6,9,2,3,1}; int max = a[0]; //或-1e9 for(int i=1; i<n; i++) { if(a[i]>max) { max = a[i]; } cout<<“max = ”<<max<<endl; system(“PAUSE”); return 0; 8 4 6 9 2 3 1 a[0] a[1] a[2] a[3] a[4] a[5] a[6] max 8 4 6 9 2 3 1 8 8 4 6 9 2 3 1 8 8 4 6 9 2 3 1 8 8 4 6 9 2 3 1 9 8 4 6 9 2 3 1 9 8 4 6 9 2 3 1 9 8 4 6 9 2 3 1 9
練習 2 -氣泡排序法(1/2) max pos max pos 8 4 8 1 6 1 8 2 8 2 9 3 8 3 9 4 8 4 9 4 6 8 2 3 1 9 4 4 8 6 9 2 3 1 8 1 4 6 8 2 3 1 9 6 1 4 6 8 9 2 3 1 8 2 4 6 8 2 3 1 9 8 2 4 6 8 9 2 3 1 9 3 4 6 2 8 3 1 9 8 3 4 6 8 2 9 3 1 9 4 4 6 2 3 1 8 9 8 4 4 6 8 2 3 9 1 9 5 4 6 8 2 3 1 9 9 6 4 6 2 3 1 8 9 8 5 8
練習 2 -氣泡排序法(2/2) a[0] a[1] a[2] a[3] a[4] a[5] a[6] 4 6 8 2 3 1 9 9 6 4 6 2 3 1 8 9 8 5 4 2 3 1 6 8 9 6 4 2 3 1 4 6 8 9 4 3 2 1 3 4 6 8 9 3 2 1 2 3 4 6 8 9 2 1
練習 3 – 移除重複數字 Globe Logistic Lab. 2009 int array[10] = {1,1,1,3,3,4,5,5,5,6}; 將上述陣列元素中重複的移除,使得陣列Array中新 的陣列元素為 {1,3,4,5,6,0,0,0,0,0}; 允許使用額外的陣列宣告 宣告一個新的陣列b[10],將array中不重複的元素儲存至b中。 僅可使用同一陣列的空間 不額外宣告b[10],直接對array做判斷與運算。 Yuan Ze University 2009 Globe Logistic Lab. summer Revised
函式 int fun (int input) 回傳型別 函式名稱 (變數型態 變數名稱) int pow2(int num) { return num*num; } int pow(int n, int p) { int r = 1; for(int i = 0; i < p; i++) r *= n; return r;
函式 #include <iostream.h> int main(void) { int num = 0; int power = 0; cout << "輸入數值:”; cin >> num; cout << "輸入平方:”; cin >> power; cout << num <<" 平方:”<< pow2(num) << endl; cout << num <<" 的” << power << "次方:” cout<< pow(num, power)<< endl; system(“PAUSE”); return 0; }
函式 – 陣列引數 int fun (int ary[]) int fun (int ary[][3]) int max(int array[]) { int n=sizeof(array)/sizeof(a[0]); int max = a[0]; for(int i=1; i<n; i++) if(a[i]>max) max = a[i]; return max; } int fun(int array[][3]) { 回傳型別 函式名稱 (變數型態 變數名稱) int fun (int ary[]) int fun (int ary[][3])
函式– 陣列引數 void max(int array[]) { int n=sizeof(array)/sizeof(a[0]); int temp; for(int i=0; i<n-1; i++) if(a[i]>a[i+1]) { temp = a[i]; a[i] = a[i+1]; a[i+1] = a[i]; }
函式– 傳址 void Swap(int a, int b) { int temp = a; a = b; b = temp; } void max(int array[]) { int n=sizeof(array)/sizeof(a[0]); int temp; for(int i=0; i<n-1; i++) if(a[i]>a[i+1]) { Swap(a[i],a[i+1]); &
函式– 變數範圍(Scope)與生命週期 int n; void max(int array[]) { int n=sizeof(array)/sizeof(a[0]); int temp; for(int i=0; i<n-1; i++) if(a[i]>a[i+1]) { Swap(a[i],a[i+1]); } int main(){ int a[5]={5, 9, 8, 1, 6}; max(a); cout<<n<<endl; getchar(); return 0;
補充語法 – 條件運算子?: (a>b) ? a : b 函數 int max(int a, int b = 0) { 判斷式 ? 成立時變數 : 不成立時變數 (a>b) ? a : b 函數 int max(int a, int b = 0) { if(a>b) return a; else return b; } int max(int a, int b) { return a>b ? a : b void max(int a, int b) { cout<< a>b ? “a” : “b” int max = a>b ? a : “b” ; 變數型態需相等
#include<math.h> 補充 – 數學函式庫 #include<math.h> 方法 說明 ceil(x) 最小大於等於x的整數 pow(x, y) x的y次方 floor(x) 最大小於等於x的整數 sqrt(x) x開根號 fabs(x) 絕對值 tan(x) tangent of x exp(x) 指數e的x次方 sin(x) sine of x log(x) x的自然對數(e為底) cos(x) cosine of x log10(x) x的對數(10為底) fmod(x, y) 浮點數的x/y餘數
練習 3 Globe Logistic Lab. 2009 練習將氣泡排序法轉為函式。 (利用投影片9頁中,將最大值移至最後的概念) Yuan Ze University 2009 Globe Logistic Lab. summer Revised
練習 4 Globe Logistic Lab. 2009 假設此20個大小不同的面積記錄於陣列內(例如int area[20])。 同上次射飛鏢問題,但此次標靶有20個大小不同面積。 假設此20個大小不同的面積記錄於陣列內(例如int area[20])。 設計一個函式,每次呼叫會回傳射到面積index。 Yuan Ze University 2009 Globe Logistic Lab. summer Revised
檔案輸出與輸入 fstream.h ofstream fout(“fname.txt”); fout << var ; 函數標頭檔 fstream.h #include<fstream.h> //主函式 int main(void) { int number_a = 6; ofstream fout(“result.txt”); fout<<“number_a = ”; fout<<number_a; fout<<endl; system(“PAUSE”); return 0; //回傳0,程式結束 } 輸出類別 變數名稱 (檔名字串) ; ofstream fout(“fname.txt”); 變數名稱 運算子 變數名稱 ; fout << var ;
檔案輸入 fstream.h ifstream fout(“fname.txt”); fin >> var ; 函數標頭檔 fstream.h #include<fstream.h> //主函式 int main(void) { int number_a; ifstream fin(“infile.txt”); fin>>number_a; system(“PAUSE”); return 0; //回傳0,程式結束 } 輸出類別 變數名稱 (檔名字串) ; ifstream fout(“fname.txt”); 變數名稱 運算子 變數名稱 ; fin >> var ;
練習 5 Globe Logistic Lab. 2009 若有一檔案position.txt,其內容格式如右圖所示。 其中每一列有兩個數字,分別代表其位置(x, y),請讀取position.txt檔案資料,並計算每個座標點的距離矩陣(即任兩點間的距離,如下圖),並且輸出至螢幕上與DistMatrix.txt檔中。 Yuan Ze University 2009 Globe Logistic Lab. summer Revised
作業1 (Homework 1) 假設有一個扭蛋機,共有6種扭蛋,每種扭蛋有7個,利用程式模擬此扭蛋機,計算出要蒐集完六種扭蛋,平均需要轉幾次扭蛋機。