---
tags: C++, 程式設計
---
# C++ 程式設計 函數 (下)
## 一、全域及局部變數
### (一)說明
全域變數:就是大家共用的變數
//學校的大門,全校的人一起使用
局部變數:部分的人使用的變數
//教室的門,班上同學老師使用
### (二)範例
#### 1、【全域變數】
```cpp=
#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); 增加可讀性。
#### (二)範例
```cpp=
#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
```
#### (四)圖示

### 六、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、圖示

## 二、練習
### (一)題目一:
請設計一多載函式,函式有兩個參數:
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、圖示:




### (二)題目二:
請撰寫一個模擬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、圖示:
