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