挑戰C++程式語言 ──第9章 函數
本章主題 函數的定義與宣告 變數的能見度 參數的傳遞 內嵌(inline)函數 遞迴函數(Recursive Function) 主程式的引數 函數的應用
函數的定義與宣告 【定義函數的語法】 函數型態 函數名稱 參數列 函數主體 函數型態 函數名稱(資料型態 參數1,資料型態 參數2, …) 函數型態 函數名稱(資料型態 參數1,資料型態 參數2, …) { // 函數主體 [return expression ;] } 函數型態 函數名稱 參數列 函數主體
函數的定義與宣告 【呼叫函數的語法】 函數的宣告--函數原型 函數名稱(引數1,引數2, …); 【呼叫函數的語法】 函數名稱(引數1,引數2, …); 函數的宣告--函數原型 函數型態 函數名稱(資料型態 參數1,資料型態 參數2, …);
函數範例
C++的程式架構 #include < > #define 資料型態 函數1(參數列); // 函數原型,即函數的宣告 資料型態 函數1(參數列); // 函數原型,即函數的宣告 資料型態 函數2(參數列); // 函數原型,即函數的宣告 ... 全域變數的宣告; 資料型態 main(參數列) // 定義main函數 { 私有變數的宣告; 函數主體; return 運算式或值; } 資料型態 函數1(參數列) // 定義函數1 資料型態 函數2(參數列) // 定義函數2
變數的能見度 全域(Global)變數 私有(Private)變數 範疇運算子(::)
參數的傳遞 以值傳遞(Call By Value) 以址傳遞(Call By Address) 以參考值傳遞(Call By Reference)
以值傳遞(Call By Value) int add(int x, int y) { x += y; return x; } int i = 789, j = 876 ,r; r = add(80, 90); cout << "add(80,90) = " << r << endl; cout << "add(" << i << "," << j << ") = " << add(i, j) << endl; 【執行結果】 add(80,90) = 170 add(789,876) = 1665 int add(int x, int y) { x += y; return x; }
以址傳遞(Call By Address) int add(int *x, int *y) { *x += *y; *y = -(*y); int i = 789, j = 876; cout << "i = " << i << endl; cout << "j = " << j << endl; cout << "i + j = " << add(&i, &j) << endl; cout << "j = " << j << endl << endl; int add(int *x, int *y) { *x += *y; *y = -(*y); return *x; } 【執行結果】 i = 789 j = 876 i + j = 1665 i = 1665 j = -876
以參考值傳遞(Call By Reference) int i = 789, j = 876; cout << "i = " << i << endl; cout << "j = " << j << endl; cout << "i + j = " << add(i, j) << endl; cout << "j = " << j << endl << endl; int add(int &x, int &y) { x += y; y = -(y); return x; } 【執行結果】 i = 789 j = 876 i + j = 1665 i = 1665 j = -876
內嵌(inline)函數 #include <iostream.h> inline int max(int x, int y); // 將max宣告為inline function void main(void) { int i = 789, j = 876; cout << "max(" << i << "," << j << ") = " << max(i, j) << endl; return; } inline int max(int x, int y) // 將max定義為inline function if (x > y){ return x; else{ return y;
遞迴函數(Recursive Function) cout << "5! = " << factorial(5) << endl; long factorial(int n) { if (n == 1){ return 1; // 當n等於1時同址呼叫 } else{ return n * factorial(n-1); // 當n大於1時呼叫factorial(n-1);
主程式的引數 // 程式名稱: 9_func10.cpp // 程式功能: 測試argc, argv #include <iostream.h> void main(int argc, char *argv[]) { int i; string s[5]; cout << "argc = " << argc << endl; for(i = 0; i < argc; i++){ s[i] = argv[i]; cout << "argv[" << i << "] = " << argv[i] << endl; cout << "s[" << i << "] = " << s[i] << endl; } return; 【執行結果】 D:\PROGRAM>9_FUNC7.EXE abc def argc = 3 argv[0] = D:\PROGRAM\9_FUNC7.EXE s[0] = D:\PROGRAM\9_FUNC7.EXE argv[1] = abc s[1] = abc argv[2] = def s[2] = def
函數的應用 內建函數:亂數產生器rand( ) 與 random(n) 內建函數:日期與時間getdate( ) 與gettime( ) 內建函數: ceil(x) 與floor(x) 內建函數: 平方根 sqrt(x) 內建函數: 次方 pow(x, y) 列印空白與列印空白列 布林函數 氣泡浮昇排序法 堆疊的實作(使用陣列) 堆疊的實作(使用鏈結串列結構)
結論 函數的定義與宣告 變數的能見度 參數的傳遞 內嵌(inline)函數 遞迴函數(Recursive Function) 主程式的引數 函數的應用