# Function
by: hush
---
## 函式(function)是什麼?
----
不是韓式炸雞腿
----
把一段程式碼包裝以便重複使用的工具
----
- 優點:
1. 使同樣的程式碼容易被**重複使用**
2. 使整體程式的**可讀性提升**
3. 拿來遞迴~~這才是主因~~
- 缺點:
1. ~~寫函式好麻煩~~
---
## 語法
---
### 宣告的語法
```cpp=
<函式回傳值的型別> <函式的名字>(<參數們>)
{
//內容,然後函式裡請縮排
return <回傳的東西>; //遇到return函式就結束了
}
```
----
參數可以不用給,也可以給好幾個,語法:
```cpp=
(<參數型別1> <參數名字1>, <參數型別2> <參數名字2>, ...)
```
----
範例:
```cpp=
int add(int a,int b) //兩數相加的函式
{
int c=a+b;
return c;
}
```
```cpp=
string idk() //idk
{
string a="sidekick";
a.erase(0,1);
a.erase(a.find('e'),1);
a.erase(3);
return a;
}
```
----
main也是一個函式
執行程式時由系統去呼叫
```cpp=3
int main()
{
cout << "hello world\n";
return 0;
}
```
---
### 呼叫的語法
```cpp=10
//在程式的某處(某個函式內)
<要呼叫的函式名稱>(引數們);
//參數有幾個,引數就要丟幾個!
```
----
用函式之前
```cpp=
#include<iostream>
using namespace std;
int main()
{
int n=3,m=5;
int ans=n+m;
cout << ans; //8
}
```
----
用add取代ans
```cpp=
#include<iostream>
using namespace std;
int add(int a,int b) //兩數相加的函式
{
int c=a+b;
return c;
}
int main()
{
int n=3,m=5;
cout << add(n,m); //8
}
```
----
要注意的點:
1. 呼叫函式時,函式會**複製**引數到參數裡面,所以在函式裡亂動參數不會影響到引數
2. 在程式中呼叫的函式可以想像成一個**變數**,可以拿來輸出或是運算之類的
---
## void
----
如何寫不需要回傳東西的函式?
- 舉例:
你叫方先生把$a$跟$b$加起來
但不問他答案,叫他寫在紙上
等你需要知道答案時再去看紙
----
將回傳值的型別設為"void"
```cpp=
void <函數的名字>(<參數們>)
{
//內容
return; //return後面放分號就好
}
```
----
範例:
```cpp=
#include<iostream>
using namespace std;
int paper; //通常需要宣告在最外面,讓兩個函式都看的到paper
void multiply(int a,int b) //兩數相加的函式
{
paper=a*b;
return;
}
int main()
{
int n=3,m=5;
multiply(n,m); //等於寫c=m*n;
cout << paper; //15
}
```
----
void函式(**只有它**)可以不寫return
函式執行到最底下會自動return
---
## 變數作用域
----
- 全域變數:
- 在最外面(不在任何函式裡)宣告的變數
- 在它底下(物理上的)的函式都可以使用它
- 因為大家都可能動到它所以較容易有bug
- 在寫題目陣列開全域比較不會爆!
----
- 區域變數:
- 在一個區域(可以是函式或是迴圈之類的)內宣告的變數,只會在該區域有作用。
- 當離開該區域,區域變數則消失。
- 當區域變數與全域變數同名,則此名字會呼叫出區域變數(APCS會考)
----
```cpp=
#include <iostream>
using namespace std;
char c='c';
void f(char c) {
c='b';
}
void g() {
c='b';
}
int main() {
char a='a';
f(a);
cout << a << ' ' << c << '\n'; //a c
g();
cout << c << '\n'; //b
}
```
---
## 練習時間
----
題目:
- 寫一個函式,給它長寬高它算出體積,並且在main函式自行測式它
- 寫一個除法的函式,叫我測試
- 手刻變數交換函式(看你能寫多好)
- 自行揮發創意
---
# 謝謝大家
{"title":"Function","description":"type: slide","contributors":"[{\"id\":\"b49547c8-0e7f-46d0-99b2-8a45dfee8e90\",\"add\":2919,\"del\":535}]"}