# 常用函式表
| 功能 | 函式名稱 | 用途說明 | 適用型別 | 標頭檔 |
|:---------------:|:----------:|:-------------------------------:|:--------------------------:|:-----------:|
| 絕對值(整數) | abs(x) | 回傳整數 x 的絕對值 | int, long | <cstdlib> |
| 絕對值(浮點數) | fabs(x) | 回傳浮點數 x 的絕對值 | float, double, long double | <cmath> |
| 平方根 | sqrt(x) | 開根號(√x) | 浮點數 | <cmath> |
| 次方 | pow(x,y) | x 的 y 次方(x^y) | 浮點數 | <cmath> |
| 向上取數 | ceil(x) | 向上無條件進位 | 浮點數 | <cmath> |
| 向下取數 | floor(x) | 向下無條件捨去 | 浮點數 | <cmath> |
| 四捨五入 | round(x) | 四捨五入 | 浮點數 | <cmath> |
| 截尾(去小數) | trunc(x) | 去掉小數點後的部分(不進位) | 浮點數 | <cmath> |
| 取最大值 | max(x, y) | 回傳 x 和 y 中較大的那一個 | 同型別變數 | <algorithm> |
| 取最小值 | min(x, y) | 回傳 x 和 y 中較小的那一個 | 同型別變數 | <algorithm> |
| 自然對數(ln) | log(x) | 以 e 為底的對數 | 浮點數 | <cmath> |
| 常用對數(log10) | log10(x) | 以 10 為底的對數 | 浮點數 | <cmath> |
| 指數函數(e^x) | exp(x) | 回傳 e 的 x 次方 | 浮點數 | <cmath> |
| 餘數(浮點數) | fmod(x, y) | x 除以 y 的餘數(適用於浮點數) | 浮點數 | <cmath> |
| sin函數 | sin(x) | x 為弧度,回傳正弦值 | 浮點數 | <cmath> |
| cos函數 | cos(x) | x 為弧度,回傳餘弦值 | 浮點數 | <cmath> |
| tan函數 | tan(x) | x 為弧度,回傳正切值 | 浮點數 | <cmath> |
| 交換 | swap() | 交換兩個變數的值 | 不限 | <algorithm> |
# 輸入輸出
## 加速輸出輸入
:::spoiler 傳送門
{%preview https://hackmd.io/EPLTE8crQhy7rByYcgsnFw#%E5%8A%A0%E9%80%9F%E8%BC%B8%E5%87%BA%E8%BC%B8%E5%85%A5 %}
:::
## 緩衝區( Buffer )
:::spoiler 緩衝區-基本概念
> #### 當你輸入一行文字並按下ENTER(也就是輸入\n)時
> #### 資料會一次性進入輸入緩衝區,例如你輸入:
```cpp=
123 hello
```
> #### 實際上,緩衝區內是這樣的:
```cpp=
'1' '2' '3' ' ' 'h' 'e' 'l' 'l' 'o' '\n'
```
> #### 假設你有這段:
```cpp=
int n;
string s;
cin >> n;
```
> 這行會從緩衝區中取出一個整數(遇到空白或換行就停止)
> 所以它會吃掉 '1' '2' '3',遇到空白 ' ' 就停了下來
> 所以:n = 123
> 緩衝區剩下: ' ' , 'h' , 'e' , 'l' , 'l' , 'o' , '\n'
:::
:::spoiler 輸入緩衝區
### 輸入緩衝區(Input Buffer)
> #### 當你輸入東西時(例如在鍵盤上打字並按下 Enter),整行資料會先被存在輸入緩衝區中
> #### 然後 cin 或其他輸入函式會一點一點地從這個緩衝區取資料來用
:::
:::spoiler 輸出緩衝區
### 輸出緩衝區(Output Buffer)
> #### 當你使用 cout 印東西時,其實資料不一定馬上印出來
> #### 而是會先暫存在輸出緩衝區,等條件符合時再一起輸出
:::
## stringstream
:::info
> ### 範例程式碼:
```cpp=
string s = "123 456 789";
stringstream ss(s);
int a, b, c;
ss >> a >> b >> c; // 一次讀三個整數
```
stringstream 是用來模擬 cin 處理字串 , stringstream是來自於 <sstream> 標頭檔,能夠 :
* 依照空格分割字串
* 依型別自動轉換
* 讓你從一整串字串中依序擷取出你要的資料
> #### 簡單來說stringstream就是一個cin,但是cin需要輸入資料對吧,所以它讀的資料是s
:::
## getline
:::info
> ### 範例程式碼:
```cpp=
string s = "apple,banana,cat";
stringstream ss(s);
string item;
while (getline(ss, item, ',')) {
cout << item << "\n";
}
```
> #### getline() 是用來讀取一整行文字的函式
> #### 不像 cin 只讀到空格就停
> #### getline是來自於<string>標頭檔
1. getline(cin, s) : 從輸入讀整行(含空格), 直到讀入換行符號"\n"為止
2. getline(ss, item, ','):從字串串流中用特定符號(如逗號)來分割取值
3. 但要記得清理緩衝區,利用
cin.ignore()來忽略一個字元
cin.ignore(10) -> 忽略10個字元
cin.ignore(1000, '\n') -> 忽略1000個字元,直到遇到'\n'
cin.ignore(numeric_limits<streamsize>::max(), '\n'); -> 清空直到換行,最保險做法
:::
# 陣列
::: spoiler 教學傳送門
{%preview https://openhome.cc/Gossip/CppGossip/OneDimArray.html %}
:::
:::danger
## 陣列放在全域
> ### 1.全域變數會自動初始化每個型態的預設值
> ### 2.區域陣列只能開到數百萬的大小,而全域陣列能開到數千萬的大小
> * 區域陣列開太大超出限制的話,會在運行到那一行時產生RE
> * 全域陣列開太大超出限制的話,在編譯時,編譯器就會將其擋住,無法通過編譯
:::
# 迴圈
:::spoiler 迴圈內基礎語法
1. dreak :point_right:跳出迴圈
2. continue :point_right:略過當次迴圈
:::
# 遞迴