# 函式
### 作者 : explosionnn
###### tags: `MDCPP講義`
---
## 什麼是函式
----
### 示意圖

* 給定一個輸入$x$
* 經過函式這個黑箱子的處理
* 輸出$f(x)$
----
### 數學函數
$f(x)=3x^2+5x-7$
$f(2)=?$
* 代入$2$
* $3*2^2+5*2-7$
* 得到$f(2)=15$
c++的函式和數學大同小異
可以從數學的函數延伸思考
---
## 自訂函式
----
剛剛的數學函數用c++寫:
```cpp=
int f(int x){
int res = 3*x*x + 5*x - 7;
return res;
}
signed main(){
int num, ans;
cin >> num;
ans = f(num);
cout << ans << endl;
}
```
* 輸入```num```
* 將```num```代入```f```函式裡面
* ```f```函式裡面的```x```現在為```num```的值
* 將運算結果存到```res```裡面
* 回傳```res```並將回傳的值存到```ans```裡面
* 輸出```ans```
----
### 宣告
```cpp=
回傳值型態 函式名稱(參數1型態 參數1, 參數2型態 參數2, ...){
程式碼...
return 回傳值;
}
```
* 參數:函式的輸入
* 回傳值:函式的輸出
* 宣告函式要在```int main()```上面
* 函式執行到```return```就會結束,後面的程式碼都會被忽略
* 回傳值型態可以是任何東西(```int```, ```double```等等)
----
### 範例1(有回傳值)
----
### BEFORE
```cpp=
signed main(){
int a, b;
cin >> a >> b;
cout << a + b;
}
```
----
### AFTER
```cpp=
int add(int x, int y){
int result = x + y;
return result;
}
signed main(){
int a, b;
cin >> a >> b;
cout << add(a, b);
}
```
1. 將```a```、```b```傳入到```add```這個函式裡,現在函式裡的```x```是```a```的值,```y```是```b```的值
2. 將```x+y```的值存入```result```裡面
3. 函式執行到```return```,回傳```result```,結束函式
4. 現在```add(a, b)```這個東西的值就是剛剛回傳的```result```的值
----
### 範例2(無回傳值)
自訂函式也可以只是單純執行一段程式碼
因此也可以不回傳任何東西
----
### BEFORE
```cpp=
signed main(){
string name;
cin >> name;
cout << "hello " << name;
}
```
----
### AFTER
```cpp=
void greeting(string name){
cout << "hello " << name;
return;
}
signed main(){
string name;
cin >> name;
greeting(name);
}
```
1. 將```name```傳到```greeting```函式裡
2. 執行```cout << "hello " << name```;
3. 函式執行到```return```,結束函式
----
### 注意
* 因為此函式不回傳任何東西,所以回傳型態要寫```void```
* ```return```可以省略
----
### 幹嘛那麼麻煩?
* 將程式碼區分成小塊小塊的,可以方便分工
* 自訂函式可以取名稱,以後回來看程式碼的時候可以方便了解這段在寫什麼
* 將經常出現的程式碼寫成自訂函式,可以增加程式碼的可讀性與維護性
---
## 內建函式
----
### 標頭檔
很多內建函式的使用都需要引入```algorithm```標頭檔
```cpp=
#include <iostream>
#include <algorithm>
```
如果覺得標頭檔好多好亂也可以引入萬用標頭檔```bits/stdc++.h```
裡面就包含了上面兩個標頭檔
```cpp=
#include <bits/stdc++.h>
```
----
### 比大小
```min(變數a, 變數b)```
回傳兩個變數中的最小值
```max(變數a, 變數b)```
回傳兩個變數中的最大值
```cpp=
#include<bits/stdc++.h>
using namespace std;
signed main(){
int a, b, small, big;
cin >> a >> b;
small = min(a, b);
big = max(a, b);
cout << small << " " << big << endl;
}
```
----
### 交換
```swap(變數a, 變數b)```
將兩個變數交換
```cpp=
#include<bits/stdc++.h>
using namespace std;
signed main(){
int a, b;
cin >> a >> b;
cout << a << " " << b << endl;
swap(a, b);
cout << a << " " << b << endl;
}
```
----
### 排序
```sort(陣列名稱, 陣列名稱+數量, 比較函式)```
將陣列由小到大排序(預設)
可以自己編寫比較函式改變排序規則(由大到小、...)
```cpp=
#include<bits/stdc++.h>
using namespace std;
signed main(){
int arr[5] = {3, 5, 6, 7, 9};
sort(arr, arr+5);
for(int i = 0; i < 5; i++){
cout << arr[i] << " ";
}
}
```
----
### 自訂排序方法
c++的sort預設是從小排到大,
啊如果要由大排到小怎麼辦?
```cpp=
less<Type>() //由小排到大
greater<Type>() //由大排到小
```
```cpp=
sort(arr, arr+5, greater<int>());
```
----
### 自訂排序函式
或著你可以自己寫一段排序方法
```cpp=
bool cmp(int a, int b){
return a > b;
}
signed main(){
sort(arr, arr+n, cmp);
}
```
{"metaMigratedAt":"2023-06-17T01:22:27.186Z","metaMigratedFrom":"YAML","title":"函式","breaks":true,"image":"https://besthqwallpapers.com/Uploads/27-1-2019/78554/thumb2-megumin-artwork-protagonist-konosuba-series-manga.jpg","slideOptions":"{\"theme\":\"moon\"}","contributors":"[{\"id\":\"3de10d07-ffd5-4c6f-8eb3-56f675abf068\",\"add\":3857,\"del\":414}]"}