# 函式 ### 作者 : explosionnn ###### tags: `MDCPP講義` --- ## 什麼是函式 ---- ### 示意圖 ![](https://i.imgur.com/FcK2sXA.png =300x) * 給定一個輸入$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}]"}
    479 views
   owned this note