---
# System prepended metadata

title: C++基礎筆記

---

# 常用函式表

|      功能       |  函式名稱  |            用途說明             |          適用型別          |   標頭檔    |
|:---------------:|:----------:|:-------------------------------:|:--------------------------:|:-----------:|
|  絕對值(整數)   |   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:略過當次迴圈
:::
# 遞迴
    