---
# System prepended metadata

title: 2. 資料型別

---

# 資料型別
變數跟java一樣，要先寫資料型態

Ex: int x = 10;
:::success
C++ 11 後可以直接用  auto
:::


* float 、double 單精度、雙精度(後面會做說明)
* char (後面會介紹)
* bool 布林值，儲存 true 或 false
* **string** 字串，儲存多個字元
* long 長整數
* void 無返回值的函數使用 (例如 void myFunction())

## 宣告常數
```cpp=
#define x 10 // 語法1
const int x = 10; // 語法2
int const x = 10; // 語法3
```

---

以下根據較特殊的資料型態做更深的講解

# char
:::info
char會將賦值的東西都轉為數字(十進位)
:::
根據輸出指令不同，可以得到不同的結果
```cpp=
char x = 0101; // x = 65
cout << x << endl; // 印出 '@'
cout << (int)x << endl; // 印出 '65'
```
也可以根據char的特性，用以下方法判斷 **是否大寫**
```cpp=
char c;
cin >> c;
if (c >= 'A' && c <= 'Z')
{
    cout << "這是大寫";
}
else
{
    cout << "這不是大寫";
}
```
> 驗證是否是數字也是同樣辦法

### 取出**字串中的數字和**
> Q: 將 “123qwe456” 中是數字的部分取出並加入ans
```cpp=
c - '0'
```
:::info
### ascii與char
數字轉char : `char a = (char)100`
char轉string: `string s(1,a)`
:::


# float 與 double
float只能存到一定位數，所以通常會用double。
:::warning
而宣告常數若使用define，系統也會優先使用double，若要指定為float，要在後面加上f。
:::
APCS很愛考科學記號，$e+4$ 就是 $10^4$。

---
輸出小數點 ⇒ 在數字後面個加上點” . “ 就行`cout<< 101./5.;`

**輸出到精確位數**

```c
#include <iostream>
#include <iomanip> //先導入函式庫
using namespace std;

int main(){
    cout<<  fixed << setprecision(9) << 2434./7.;
    return 0;
}
```

注意，`setprecision()` 的效果，會持續影響到後面的所有 `cout` 。
所以要新的cout時要重新設定

### 浮點數誤差

當你執行以下程式碼時你會發現

```c
int main(){
    float f = 3.333333333333333;
	cout << fixed << setprecision(15) << f;
    return 0;
}
//輸出:3.333333253860474
```

後面的小數位都錯誤的，這就是所謂的 *浮點數誤差* 

> 一個浮點數在固定位數之後就會與原本的值不一樣而產生誤差。
> 
:::success
 `double` 比 `float` 準確， 可以儲存的準確位數較多
:::


# typedef
可以用**修飾字**自訂要大一點記憶體還是小一點
```cpp
long
short
```
如果今天題目測資很大要用到`long long`
不可能要每次定義變數都打這麼多
可以直接，用`typedef long long LL`
這樣之後要用到就直接寫LL就好
```cpp=
#define Mx 10000
typedef long long LL
LL li[Mx]
int main(){
    LL int x = 10E+40
}
```

# 補充 - 查看記憶體大小
可以用
```cpp=
sizeof(x)
```
# 補充 - python四捨五入
python的四捨五入函式`round`是按照 Banker rounding的機制去跑的，
**當最後一位是5**
* 第一個數字 1.35 在 1.3 和 1.4 的正中間，round 到小數點後第一位，選擇偶數的 1.4。
* 第一個數字 1.25 在 1.2 和 1.3 的正中間，round 到小數點後第一位，選擇偶數的 1.2。

所以在python要精確地做到遠離0的四捨五入要透過套件
```python=
from decimal import Decimal, ROUND_HALF_UP
n = eval(input())
k = Decimal(str(n)).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
if k==-0.00:
    print("0.00")
else:
    print(k)
```
https://medium.com/%E7%A8%8B%E5%BC%8F%E4%B9%BE%E8%B2%A8/python-round-%E5%9B%9B%E6%8D%A8%E4%BA%94%E5%85%A5-%E7%9A%84%E5%B0%8F%E5%9D%91-7ef8accad931