---
# System prepended metadata

title: 常用函式與應用二版
tags: [NSNote]

---

1. ###### tags: `NSNote`
# 常用函式與應用二版

{%hackmd fssTA9u7QDCSoJc5aAGcUQ %}

## 1. **<cmath>**
      a. pow(a,b); -> a 的 b 次方
      b. sqrt(c);
      c. cbrt(d);
      d. hypot(e);
      


| pow(a,b) | sqrt(c)  | cbrt(d)  | hypot(e,f)
| -------- | -------- | -------- | ---------- |
| a 的 b 次方| 輸出 c 的根|輸出 c 的三次方根|輸出e^2 + f^2開根號 （對沒錯就是畢氏定理）|


**==-> 小實驗：能直接輸出浮點數嗎？==**


## **2. <cctype>**
### 1.字元測定函數 
| isalpha(變數)| isalnum(變數) | isascii(變數) | isdigit(變數)|
| -------- | --------- | --------- | ---------|
| 若變數為英文字母，回傳1 | 若變數為英文字母或數字**字母**，回傳1 | 若變數屬於ASCII 0~127，回傳1 | 若變數為數字**字元**回傳1 |

**==->小實驗：isdigit()是判斷數字還是數字字元呢？==**
| isspace(變數) | islower(變數) | isupper(變數) |
|-----------|-----------|-----------|
| 若變數為空白字元，回傳1 | 若變數為小寫英文（a~z），回傳1| 若變數為大寫英文（A~Z），回傳1|


-> **[ascii](https://zh.wikipedia.org/wiki/ASCII)**

### 2. 字元轉換函數
|tolower(變數)|toupper(變數)|
|---------|---------|
|將字元Ａ～Ｚ轉換成 a~z |將字元 a~z 轉換成Ａ～Ｚ|
-> **==小實驗：若偵測到的字元不在更動範圍內的話，該字元會如何呢？==**

| toascii(變數)|
|-|
|用處不大，用強制轉型即可|


-> **發現 tolower 跟 toupper 轉換後會變 int，所以要顯示原本的英文字元，需使用強制轉型或putchar()**
```cpp=
    cout << (char)tolower(a1) << "\n";
    cout << (char)tolower(a2) << "\n";
    cout << (char)toupper(a1) << "\n";
    cout << (char)toupper(a2) << "\n";
```

### 補充：putchar()
```cpp=
    putchar(tolower(a1));
    putchar(tolower(a2));
    putchar(toupper(a1));
    putchar(toupper(a2));
```
會輸出：
aaAA
-> **所以putchar是直接輸出其字元，但沒辦法換行。**

## 3. **<algorithm>**

### 搜尋演算法

|find(front, end, value)|count(front , end, value)|
|-|-|
|從 front 到 end ( 不包含 end ) 找 value，若有就回傳第一個 value 的迭代器，若無則回傳 end|從 front 到 end ( 不包含 end ) 找 value 的數量，回傳 value 的個數|


search(front1, end1, front2, end2)|binary_search(front, end, value)|
|-|-|
|在front1到end1範圍中，找尋是否有依序出現front2到end2的每個元素，若有，回傳front2出現的迭代器，若無則回傳end1|二分搜尋，若value存在回傳true，否則回傳false(要先排序過)|


**以下兩函式須先排序**
|lower_bound(front, end, value)|upper_bound(front, end, value)|
|-|-|
|尋找第一個**不小於value**的迭代器，若不存在則回傳end|尋找第一個**大於value**的迭代器，若不存在則回傳end|

### 排序演算法

|sort(begin, end, cmp)|stable_sort(begin, end, cmp)|
|-|-|
|在begin到end範圍內排序，若無設定cmp比較函示，則使用預設的遞增排序。|同上，stable表示相同數值的元素，排序後相對位置不變。|

->何時適合用stable_sort?當你同時要排序不同的性質而希望順序不被打亂時。


### 集合演算法

此三種函式皆須先排序
|set_intersection(first1, last1, first2, last2, result)|set_union(first1, last1, first2, last2, result)|set_difference(first1, last1, first2, last2, result)|
|-|-|-|
|[first1, last1)範圍的資料與[first2, end2)的資料做**交集**，並把結果存在result中|[first1, last1)範圍的資料與[first2, end2)的資料做**聯集**，並把結果存在result中|[first1, last1)範圍的資料與[first2, end2)的資料做**差集**，並把對[first1, last1)的結果存在result中|

-> 以上三種都是以 [first1, last1) 優先儲存。



---
### 極值演算法

|min(a, b)|min_element(first, last)|
|-|-|
|回傳a與b中最小的，若相等則回傳a|在範圍內，找尋最小元素的迭代器，若有多個則回傳第一個|

|max(a, b)|max_element(first, last)|
|-|-|
|回傳a與b中最大的，若相等則回傳a|在範圍內，找尋最大元素的迭代器，若有多個則回傳第一個

->需注意max, min回傳的是值，而max_element, min_element回傳的則是位址。
### 排列演算法

須先排序
|next_permutation(first, last)|
|-|
|找尋下一個字母排序更大的結果|

```cpp=
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int main(){
    int arr[10] = {523,62,6,2462,542,5426,2,885,68,64};
    sort(arr, arr + 10);
    while(next_permutation(arr, arr + 10)){
        for(int i = 0; i < 10; i++){
            cout << arr[i] << " ";
        }
        cout << endl;
    }
}
```
output:
各位可以自己嘗試，電腦壞掉別找我。





==以上是我能想到的，在打競賽程式會用到的一些function。當然還有很多實用的function，等你們慢慢探索==

## **HW：**

:::info
1.使用<cmath>，給直角三角形的兩個邊，求斜邊長。
:::

:::info
2.使用<cctype>，輸入一串英文句子，將第奇數個字改成大寫，第偶數個字改成小寫，**空白**及**標點符號**不包含在字的計數內。
e.g.：
input：I am a High scHOOl sTuDENt. GoOD.
output：I aM a HiGh ScHoOl StUdEnT. gOoD.
:::

:::info
3.第一行輸入a, b，代表兩組集合的數字數量。
第二行及第三行分別輸入a及b的內容，每組數字間會空格。
輸出分三行：
第一行輸出兩集合的交集。
第二行輸出兩集合的聯集。
第三行輸出兩集合的差集。
:::

:::info
4.輸入書本數 n，接下來每一行輸入一本書名及其價錢（之間空格）請先依價錢排序後，同價位再依書名字典序排序。最後輸出一行一本書，從最便宜的開始。(提示：用stable_sort)
**e.g. :**
**input :**
6
abc 150
acb 150
bac 200
bca 250
cab 200
cba 175

**output :**
abc 150
acb 150
cba 175
bac 200
cab 200
bca 250
:::