Try   HackMD

C++ 程式設計 函數 (下)

一、全域及局部變數

(一)說明

​​​​全域變數:就是大家共用的變數
​​​​//學校的大門,全校的人一起使用
​​​​局部變數:部分的人使用的變數
​​​​//教室的門,班上同學老師使用

(二)範例

1、【全域變數】

#include <iostream> using namespaec std; double a; //全域變數 //---函式位置--- double fun(){ //在函式內未定義a,則使用全域變數。 return ((a-32)*5/9); } //---主程式 --- int main(){ //在主程式內未定義a,則使用全域變數。 a = 99; return 0; } ``` #### 2、【全域變數與局部變數】 ```cpp= #include <iostream> using namespaec std; double a; //全域變數 //---函式位置--- double fun(){ //在函式內未定義a,則使用全域變數。 return ((a-32)*5/9); } //---主程式 --- int main(){ a = 99; //在主程式內未定義a,則使用全域變數。 cout << "全域的a=" << a <<endl; double a; //在主程式內定義a(局部變數) a = 88; cout << "局部的a=" << a <<endl; return 0; } //全域變數 a = 99; //局部變數 a = 88; //因全域與局部變數設的一樣,怕搞混也可以 cout << ::a <<endl; (::a)代表全域的a ``` ## 二、行內(inline) ### ()說明: 加快執行速度但不改視讀性 ### 圖示: ```cpp= //【加上inline】 #include <iostream> using namespaec std; double a; //全域變數 //---函式位置--- inline double fun(){ //在函式內未定義a,則使用全域變數。 return ((a-32)*5/9); } //---主程式 --- int main(){ cout << fun <<endl; return 0; } //【電腦會解讀成】 #include <iostream> using namespaec std; double a; //全域變數 //---主程式 --- int main(){ cout << ((a-32)*5/9) <<endl; return 0; } //等於不是透過函式呼叫而是直接運算,但使用者看如上可讀性較高。

三、定義聚集函式(#define)

(一)說明

​​​​可藉由定義來增加程式的可讀性
​​​​例如:3次方
​​​​#define cube(x) (x)*(x)*(x)
​​​​在撰寫程式時則將原本: x=x*x*x; 簡寫成 cube(x); 增加可讀性。

(二)範例

#include <iostream> using namespaec std; #define cube(x) (x)*(x)*(x) ---主程式 --- int main(){ int x = 2; cout << cube(x) <<endl; return 0; } ``` ### 四、函式庫 #### ()說明 許多聚集函式集結而成的字典 以程式視角 :讓程式可以讀懂使用者的用意 以使用者視角:讓使用者可以更有效率撰寫程式 #### ()常使用函式庫 若要使用函式庫 程式開頭 indule <cmath> 數學資料函式庫<cmath> exp(),log(),sin(),... 時間函式庫<ctime> //常使用clock() = clock stime //clock_t == long clock_t stime = clock (); //抓取目前的時脈A (開始) clock_t etime = clock (); //抓取目前時脈B (結束) cout << (double)(etime - stime)/(1000) << "秒" //1000看處理器頻率 1秒有多少clock就除與多少(這裡以1000示範) ### 五、overloading #### ()說明 一樣的函式,但可以透過不同的參數型態執行不同功能。 #### ()舉例 ```cpp= #include <iostream> using namespace std; #define PI 3.14 //---函式位置--- void fun(double i){ cout << "圓形面積" << r*r*PI; << endl; } void fun (double a,double b){ cout << "矩形面積" << a*b << endl; } void fun (char i){ cout << "顯示字元" << i << endl; } //---主程式 --- int main(){ fun(2.0); fun(2,3); fun('a'); return 0; } //output: 圓形面積 12.65 矩形面積 6 顯示字元 a ``` #### ()圖示 ![](https://i.imgur.com/WNCFHQJ.png) ### 六、Recursive (遞迴) #### ()說明 自己呼叫自己,但必須要有終止條件 #### ()舉例 ##### 1、階層運算 ```cpp= #include <iostream> using namespace std; int sum = 1; int fun(int n){ while (n > 0) { sum = sum * n; n -= 1; } return sum; } int main() { int n; cout << "請輸入:" ; cin >> n; if (n == 1) cout << 1; else cout << (n *fun(n - 1)); } ``` ##### 2、圖示 ![](https://i.imgur.com/mcaK9XC.png) ## 二、練習 ### ()題目一: 請設計一多載函式,函式有兩個參數: A. 當兩個參數都是字元時,則顯示該字元。 B. 當參數為字元和整數x時,則顯示該字元x次。 C. 當兩個參數都是整數時,則顯示兩個數相乘的結果。 fun('a','b') -->ab, fun('c','d') --> cd fun(3, 'a') -->aaa, fun(5, 'a') -->aaaaa fun('b', 4) -->bbbb, fun('b', 6) -->bbbbbb fun(3, 8) --> 24, fun(4, 9) --> 36 #### 1、程式碼(答案不唯一): ```cpp= #include<iostream> using namespace std; /*題目1:請設計一多載函式,函式有兩個參數: A. 當兩個參數都是字元時,則顯示該字元。 fun('a','b') -->ab, fun('c','d') --> cd B. 當參數為字元和整數x時,則顯示該字元x次。 fun(3, 'a') -->aaa, fun(5, 'a') -->aaaaa fun('b', 4) -->bbbb, fun('b', 6) -->bbbbbb C. 當兩個參數都是整數時,則顯示兩個數相乘的結果。fun(3, 8) --> 24, fun(4, 9) --> 36*/ void fun(int a, int b) { a = a * b; cout<<"輸出結果:"<<i<<endl; } void fun(char x, char y) { cout<<"輸出結果:"<<x<<y<<endl; } void fun(int a, char y) { cout<<"輸出結果:"; while (a> 0) { cout<<y ; a -= 1; } } void fun(char x, int b) { cout<<"輸出結果:"; while (b> 0) { cout<<x; b -= 1; } } int main() { int a, b,c,d; char x, y; cout<<"請設定預想輸入1之資料型態 1.整數 2.字元:"; cin>>c; cout<<"請設定預想輸入2之資料型態 1.整數 2.字元:"; cin>>d; if (c > 1 && d > 1) { cout<<"請設定輸入1:"; cin>>x; cout<<"請設定輸入2:"; cin>>y; fun (x,y); } else if (c == 1 && d == 1) { cout<<"請設定輸入1:"; cin>>a; cout<<"請設定輸入2:"; cin>>b; fun(a, b); } else if (c == 1 && d > 1) { cout<<"請設定輸入1:"; cin>>a; cout<<"請設定輸入2:"; cin>>y; fun(a, y); } else { cout<<"請設定輸入1:"; cin>>x; cout<<"請設定輸入2:"; cin>>b; fun(x, b); } return 0; } ``` #### 2、圖示: ![](https://i.imgur.com/Mu38Y8Y.png) ![](https://i.imgur.com/cyA3JQ3.png) ![](https://i.imgur.com/SC0XV7D.png) ![](https://i.imgur.com/CrWtAXP.png) ### ()題目二: 請撰寫一個模擬power()行為的函式,以「遞迴」方式計算任意數的任意整數次方。 (不能用<cmath>)並利用標準函式庫的clcok()檢查程式計算時間。 例如:power(2,10) --> 1024, try power(2,10000)時間比較長,不會0秒 #### 1、程式碼(答案不唯一): ```cpp= #include<iostream> #include<ctime> using namespace std; int i = 1; void pow(int a, int b) { while (b > 0) { i = i * a; b -= 1; } cout << "計算結果:" << i << endl; } int main() { int a, b; cout << "請輸入底數:"; cin >> a; cout << "請輸入次方:"; cin >> b; clock_t stime = clock(); pow(a, b); clock_t etime = clock(); cout << "使用時間" << (double)(etime - stime) / 3200000000 << "秒"; return 0; }

2、圖示: