1 2 Outline 二維與多維陣列 Lecture 08 多維陣列函式 標準函式庫 函式簡介 一維陣列 二維陣列與多維陣列 陣列為多個同一型態變數之組合 int a[10]; 可存放 10 個整數資料的陣列, 可視為 10 個變數排成一個隊伍, 並給每一個變數一個編號, 自 0 號開始 至 9 號為止 a[0], a[1], a[2], a[],, a[9] 5 6 二維陣列的宣告 陣列為多個同一型態變數之組合 int A[][10]; 可存放 0 個整數資料的二維陣列, 可視為 0 個變數排成 個隊伍 ( 列 ), 並給每一個變數兩個編號, 一個編號指定在第幾個隊伍 另一個編號指定在隊伍內的順序 A[0][0], A[0][1], A[0][2], A[0][9], A[1][0], A[1][1], 二維陣列 (Array) 的使用 int cars[][6]; 宣告一整數陣列, 可存放 列 6 行共 18 個整數型別的資料 使用 cars[0][1] = ; 將 存入 cars 陣列中的第 0 列第 1 行的元素 cars[2][0]++; 將 cars 陣列中的第 2 列第 0 行的元素增加 1 cars[1][0]=cars[1][1]+a; 將 cars 陣列中的第 1 列第 1 行的值取出, 與變數 a 作加法運算後, 將結果存入第 1 列第 0 行的元素 為什麼有二維陣列或多維陣列? 對某些運算來說很自然 (e.g. 行列式 矩陣 ) 1
7 8 8-1.cpp int a[][5]; for(int i=0;i<;i++) { for(int j=0;j<5;j++) { a[i][j] = i*10 + j; 0 1 2 10 11 12 1 1 20 21 22 2 2 二維陣列的初始化 int a[][] = {{1,2,,, {5,6,7,8, {9,10,11,12; 陣列元素排列方式 各陣列元素之初始值 for(int i=0;i<;i++) { for(int j=0;j<5;j++) { cout << a[i][j] << " "; cout << "\n"; 9 10 請想想以下陣列初始化後之內容為? int a[][] = {1,2,,; int a[][] = {{1,2,,, {8, 1, {, 2; int a[][] = {{0,{1,2,,,{5,1,2,; int a[][] = {1,2,,,5,6,7,8; int a[][] = {{1, 2, {,, 5; 1 2 1 2 8 1 0 0 2 0 0 1 2 5 1 2 1 2 5 6 7 8 1 2 0 0 5 0 在陣列有給初始值時, 且陣列大小被省略時, 編譯器會根據初始值的個數來決定陣列大小 但是只有第一個維度可以省略! double A[][], b[], c[][10][0]; 矩陣向量相乘 1 2 1221 1 0 1 0 1 0 1 2 0 1 2 1 0 12 210211 0 1 0 11 010211 c a b c1 ai 1b1ai2b2 aib aib i ij j j1 11 12 8-2.cpp int a[][] = { {1,2,,, {1,0,1,0, {2,1,0,1, {0,1,0,1 ; int b[] = {,,2,1, c[]={0; 1 2 1 0 1 0 2 1 0 12 0 1 0 11 8-2.cpp for(int i=0;i<;i++) { for(int j=0;j<;j++) { c[i] += a[i][j] * b[j]; for(int i=0;i<;i++) { cout << c[i] << " "; c a b c1 ai 1b1ai2b2 aib aib i ij j j1 2
1 1 多維陣列 二維以上陣列 ( 稱為多維陣列 ) 在實務上應用比較少 宣告 int a[10][5][]; 宣告一三維陣列, 第一維度有 10 個 第二維度 5 個 第三維度 個 共可儲存 150 個不同的整數值 可想成我們宣告了 10 個不同的 5 列 行之二維陣列 float q[100][200][10][5]; 宣告一個四維陣列, 共可儲存 100 x 200 x 10 x 5 個不同的浮點數 可想成我們宣告了一個 100 列 200 行之二維陣列, 而此二維陣列中每個元素又是一個 10 列 5 行之二維陣列 C- 字串陣列 / 字元的二維陣列 15 16 回顧 字串 = 字元的一維陣列 char a[10] = "ABCDEFGHI"; cin 可以從鍵盤讀取字串 char a[10]; cin >> a; cout 可以將 C 字串輸出 char a[]="hello"; cout << a; 8-.cpp char msg[200] = "This is a test."; cout << msg; cout << "\n 請輸入一串字 : "; cin >> msg; cout << msg; This is a test. 請輸入一串字 : Hello Kitty Hello cin 利用空白或是換行符號來分隔不同資料, 所以只能藉此得到不含空白的字串 17 18 二維字元陣列 / 字串陣列 char a[][6] = {{"Pig", {"Tiger", {"Dog"; char a[][6] = {{"Pig", {"Tiger", {"Dog"; char [][6] = {{'P', 'i', 'g', 0, {'T', 'i', 'g', 'e', 'r', 0, {'D', 'o', 'g', 0; 8-.cpp char a[][6] = {{"Pig", {"Tiger", {"Dog"; int i; for(i=0;i<;i++) { cout << a[i] << endl; Pig Tiger Dog
19 20 函式簡介 數學函數 mathematical function 數學上有所謂的函數 (function) y = f(x) x 為自變數, y 為應變數 舉例 y = f(x) = x 2 +x+2 5 0 y = sin() 數學函式指定一些運算使用的參數, 並計算出一些結果 5 0 25 20 15 10 5 0 5 5 1 1 5 21 22 函式簡介 在電腦程式上, 函式 (function) 為獨立的程式運作單元 (unit), 或稱為模組 (module) 副程式 (subroutine) 程序 (procedure) 函式常用來包裝複雜的程式碼, 使主程式看起來較為簡單易懂 函式是用來創造 黑盒子 (black box) 只看得見進去盒子的東西, 和出來盒子的東西, 盒子裡怎麼運作是看不到 也不想看到的 y = sin() C/C++ 所提供的指令很少 基本算術運算 (+,-,*,/,%) 選擇性述敍 迴圈述敍, 許多功能藉由函式所提供與擴充 ( 如三角函數, 字串處理, ) 當需要使用函式時, 會需要兩個要件 : 函式的原型宣告 (prototype) 由標頭檔 (header file) 取得 函式的定義 (definition) 由函式庫 (library) 取得 1-1.cpp // 輸出 "Hello World" 至螢幕上 cout << "Hello World"; /* 函式執行完畢, 回傳 0 */ 將 iostream 這個標頭檔內含有以定義標準輸入輸出之類別 物件 與函式等等的宣告 標準函式庫裡的東西都定義在 std 這個命名空間裡, 用來避免名稱的衝突 使用標準程式庫的 cout 物件輸出 2 2 函式的來源 C/C++ 標準函式庫 (standard library) 為程式語言認為必要提供的基本功能 C/C++ 標準函式庫 自訂函式 第三方 (third party) 免費的或商業的程式庫 C/C++ Standard Library
25 26 程式執行結果 數學函式庫 注意, 在電腦裡的三角函數以弳度為單位, 而非我們一般使用的角度 角度 : 以 60 度為一個圓 弳度 : 以 2 為一個圓 角度轉弳度 角度 * / 180 弳度換角度 弳度 * 180 / http://www.cplusplus.com/reference/clibrary/cmath/ 類別三角函數 sin asin cos acos tan atan sinh, cosh, tanh 指數與對數 exp log log10 次方與根號 pow sqrt 進位與捨位 ceil floor 取絕對值 fabs, 0: 0, 1 8-5.cpp 10: 0.1768, 0.98808 20: 0.202, 0.9969 0: 0.5, 0.866025 0: 0.62788, 0.7660 50: 0.7660, 0.62788 60: 0.866025, 0.5 70: 0.9969, 0.202 double theta; 80: 0.98808, 0.1768 double rad; 90: 1, 6.122e-017 double coeff =.115926558979286 / 180.0; for(theta=0; theta<=90; theta=theta+10) { rad = theta * coeff; cout << theta << ": " << sin(rad); cout << ", " << cos(rad) << endl; 27 28 8-6.cpp 程式執行結果 2^ = 8 log10(2) = 0.010 log10(2^) = 0.9009 sqrt(.0) = 1.7205 pow(.0, 0.5) = 1.7205 double a; a = pow(2.0,); // 計算 2 的 次方 cout << "2^ = " << a; cout << "\nlog10(2) = " << log10(2.0); cout << "\nlog10(2^) = " << log10(a); cout << "\nsqrt(.0) = " << sqrt(.0); cout << "\npow(.0, 0.5) = " << pow(.0, 0.5); 8-7.cpp double a; a = log10(.0); cout << "a = log10(.0) = " << a << endl; cout << "pow(10.0, a) = " << pow(10.0, a) << endl; cout << "exp(1)=" << exp(1.0) << endl; cout << "log(exp(1)) = " << log(exp(1.0)) << endl; 程式執行結果 a = log10(.0) = 0.77121 pow(10.0, a) = exp(1)=2.71828 log(exp(1)) = 1 29 0 8-8.cpp a=sqrt(2) = 1.121 floor(a) = 1 ceil(a) = 2 a=-sqrt(2) = -1.121 floor(a) = -2 ceil(a) = -1 fabs(a) = 1.121 double a = sqrt(2.0); cout << "a=sqrt(2) = " << a << endl; cout << "floor(a) = " << floor(a) << endl; cout << "ceil(a) = " << ceil(a) << endl; a=-a; cout << "a=-sqrt(2) = " << a << endl; cout << "floor(a) = " << floor(a) << endl; cout << "ceil(a) = " << ceil(a) << endl; cout << "fabs(a) = " << fabs(a) << endl; floor: 傳回最接近且小於傳入參數的整數 ceil: 傳回最接近且大於傳入參數的整數 fabs: 取絕對值 C 標準函式庫 #include <cstdlib> 分類 函式名稱 說明 atof, strtod 字串轉浮點數 C 字串轉換 atoi 字串轉整數 atol, strtol 字串轉長整數 亂數 srand 設定亂數產生的種子 rand 產生一亂數 整數相關 abs, labs 取整數的絕對值 進階函式 bsearch 在陣列中找尋資料 qsort 對陣列中的資料排序 重要常數 RAND_MAX 亂數的最大值 http://www.cplusplus.com/reference/clibrary/cstdlib/ 5
1 2 8-9.cpp #include <cstdlib> int i, seed; cout << " 請輸入亂數種子 : "; cin >> seed; srand(seed); for(i=0;i<10;i++) { 請輸入亂數種子 : 1 1867,5 26500, 1572,5 2958,0 26, 2815,5 16827,1 91,1 1192,1 56, cout << rand() << "," << rand()%6 << endl; 請輸入亂數種子 : 2 29216, 17795,0 19650,0 261, 1816,1 28189,1 606, 17829,5 067,5 28961, 8-10.cpp #include <cstdlib> #include <ctime> int i; srand(time(0)); cout << endl; for(i=0;i<10;i++) { 2.71017 0.70186-1.8802-1.586 1.0997-1.8172 1.96655-1.125 0.68908 1.00778 cout << ((double) rand())/rand_max*6-2 << endl; 2.72756.8099.0119 0.19285 1.87078 1.0195 0.9789 1.2182-1.9567-1.689 C 字串函式庫 #include <cstring> 函式名稱 strncpy strncat strcmp strlen strchr strrchr 說明 字串拷貝 字串串接 傳回字串比較結果 傳回字串長度 在字串中找尋一字元, 並傳回其位置 從字串尾端開始往回找尋一字元, 並傳回其位置 strstr 在字串中找尋一字串, 並傳回其起始位置 strtok 將字串依指定字元符號作切割 http://www.cplusplus.com/reference/clibrary/cstring/ 作業六 6