## C語言程式設計導論
### 資料型態與輸入輸出
---
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
Table of Content
</h3>
- 認識資料型態
- 資料型態的種類
- 資料型態的宣告
- 輸入與輸出
- 例題練習
<!-- .element: class="fragment" data-fragment-index="1" -->
---
<!-- .slide: data-transition="fade" -->
### 認識資料型態
----
<!-- .slide: data-transition="fade" -->
**在電腦之中**
**資料會存到記憶體(RAM)與硬碟(Hard Disk)當中**
<!-- .element: class="fragment" data-fragment-index="1" -->
**其中每一個儲存單位稱為位元(bit)**
**每一個位元只能儲存$0$與$1$兩種資料**
<!-- .element: class="fragment" data-fragment-index="2" -->
**在傳統電路上就是通電與未通電兩種狀態**
<!-- .element: class="fragment" data-fragment-index="3" -->
----
<!-- .slide: data-transition="fade" -->
**所以說所有的資料都可以儲存成一堆$0$與$1$的形式**
**至於如何把一堆$0$與$1$表達成數字**
<!-- .element: class="fragment" data-fragment-index="1" -->
**我們之後的章節再討論**
<!-- .element: class="fragment" data-fragment-index="2" -->
----
<!-- .slide: data-transition="fade" -->
**為了計算方便**
**我們通常會把 $2^3=8$ bits 叫做 $1$ byte**
<!-- .element: class="fragment" data-fragment-index="1" -->
**有些書會把 bit 簡寫成 b**
**byte 簡寫成 B**
<!-- .element: class="fragment" data-fragment-index="2" -->
----
<!-- .slide: data-transition="fade" -->
**文字、數字等等不同的資料**
**對電腦而言要分配的空間也有所不同**
<!-- .element: class="fragment" data-fragment-index="1" -->
**接下來分別會介紹C語言中的基本資料型態**
<!-- .element: class="fragment" data-fragment-index="2" -->
---
<!-- .slide: data-transition="fade" -->
### 資料型態的種類
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
C語言常用的資料型態種類
</h3>
1. **整數 `int`:儲存正負整數**
2. **浮點數 `float`:存小數點後7位的數**
3. **雙精浮點數 `double`:存小數點後15位的數**
4. **字元 `char`:儲存英文字元及符號**
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
整數 int
</h3>
- **一個int是使用$32$bits也就是$4$bytes的空間**
- **總共可以表達$2^{32}=4294967296$種不同的數字**
- **範圍$[-2^{31},2^{31}-1]=[-2147483648,2147483647]$**
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
浮點數 float
</h3>
- **一個float是使用32bits也就是4bytes的空間**
- **範圍是 $[-3.4\times 10^{-38}, 3.4\times 10^{38}]$**
- **精度大概是小數點後6~7位**
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
雙精度浮點數 double
</h3>
- **一個float是使用64bits也就是8bytes的空間**
- **範圍是 $[-1.7\times 10^{−308}, 1.7\times 10^{308}]$**
- **精度大概是小數點後15位**
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
字元char
</h3>
**這種資料型態比較特別**
**他並不是直接在儲存空間存資料**
<!-- .element: class="fragment" data-fragment-index="1" -->
**而是藉由「數字」對照成「符號」**
<!-- .element: class="fragment" data-fragment-index="2" -->
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
字元char
</h3>
- **一個char是使用8bits也就是1byte的空間**
- **儲存英文及一些奇怪的符號**
- **總共可以表達$2^8=256$種不同的符號**
- **根據ASCII的表 從$0$到$127$都有對應的符號**
- **其中又以$32$到$126$最為常用**
[延伸閱讀:認識中文字元碼](https://idv.sinica.edu.tw/bear/charcodes/Section02.htm)
<!-- .element: class="fragment" data-fragment-index="1" -->
----
**如果不知道為什麼資料要這樣儲存**
**可以看[這一篇](https://hackmd.io/@ShanC/H1a5yIh8A)淺談這件事**
----
<!-- .slide: data-transition="fade" -->
ASCII表(來源:維基百科)

---
<!-- .slide: data-transition="fade" -->
### 資料型態的宣告
----
<!-- .slide: data-transition="fade" -->
**那麼在C語言要怎麼使用這些資料型態呢?**
**我們需要透過「宣告」變數來達成**
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-transition="fade" -->
**除此之外 我們也要幫變數取名字**
**來代替表示他在記憶體的位置**
**但是必須遵守以下規定**
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
變數名稱的規定
</h3>
- **只能由英文字母、數字、_(底線)構成**
- **第一個字元不可以為數字**
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
宣告一個變數
</h3>
**可以定義一個變數名稱`number`**
**並在前面加一個`int`告訴電腦這是整數**
```cpp
int number;
```
**後面要加分號喔**
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-transition="fade" -->
**每一行指令都要在後面加分號代表結束**
**這是C語言的爸爸規定的**
**別問我為什麼**
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-transition="fade" -->
**想當然 其他的資料型態也是如此宣告**
```cpp
int num;
float f1, f2;
double d_number;
char c;
```
----
<!-- .slide: data-transition="fade" -->
**在宣告的時候也可以直接塞資料在該變數上**
```cpp
int num = 87;
float f1, pi = 3.1415;
double d_number = 123.4567;
char c = 'A' // 字元符號前後要加 '' 電腦才不會誤認是其他東西;
```
----
<!-- .slide: data-transition="fade" -->
**有時候在處理一些問題時**
**會發現一個int根本不夠存放想存的數**
**這時就可以在int前加一個long long**
**範圍會變成$[-2^{63}, 2^{63}-1]$**
```cpp
long long int num;
```
----
<!-- .slide: data-transition="fade" -->
## 注意
## 電腦很笨
<!-- .element: class="fragment" data-fragment-index="1" -->
## 你不告訴他正確的資料型態
<!-- .element: class="fragment" data-fragment-index="2" -->
## 他也猜不出來
<!-- .element: class="fragment" data-fragment-index="3" -->
---
<!-- .slide: data-transition="fade" -->
### 輸入與輸出
----
<!-- .slide: data-transition="fade" -->
**當我們處理完資料之後**
**要怎麼確認資料是正確的呢?**
**我們勢必要叫電腦做點事情**
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-transition="fade" -->
**在前一個章節**
**我們學了怎麼用`printf`來輸出Hello World!**
```cpp
#include <stdio.h>
int main() {
printf("Hello World!");
return 0;
}
```
**其實`printf`就是C語言輸出的語法喔**
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
printf 語法
</h3>
```cpp
printf("一串文字");
```
----
<!-- .slide: data-transition="fade" -->
**那麼要是我們想輸出儲存在變數裡的整數**
**可以這樣寫**
```cpp
#include <stdio.h>
int main(){
int number = 4;
printf("The number is %d", number);
return 0;
}
```
**其實就是在想文字中想加的地方加上%d而已**
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-transition="fade" -->
**如果是輸出其他資料型態**
**%d的地方就要改成其他東西**
----
<h3 class="text-left">
資料型態的輸入輸出
</h3>
<!-- .slide: data-transition="fade" -->
- int: %d
- long long int: %lld
- float: %f
- double: %lf
- char: %c
- 字串: %s (之後的單元會提到)
----
**那如果是要輸入一個資料呢?**
**我們可以用`scanf`來將資料輸入到變數裡**
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-transition="fade" -->
<h3 class="text-left">
scanf 語法
</h3>
```cpp
int num;
scanf("%d", &num); // remember &
```
**%d的地方與printf差不多**
**注意前面要加個&代表儲存的位置**
**之後講「指標」時會詳細說明**
<!-- .element: class="fragment" data-fragment-index="1" -->
----
<!-- .slide: data-transition="fade" -->
**寫一個輸入一整數 並輸出該整數的程式**
**可以這樣寫**
```cpp
#include <stdio.h>
int main(){
int number;
scanf("%d", &number);
printf("The number is %d", number);
return 0;
}
```
----
<!-- .slide: data-transition="fade" -->
**如果要輸出一個小數點後2位的數字**
```cpp
#include <stdio.h>
int main(){
float num = 10.314;
printf("The number is %.2f", num);
return 0;
}
```
----
<!-- .slide: data-transition="fade" -->
**如果要輸出一個小數點後8位的數字**
```cpp
#include <stdio.h>
int main(){
double num = 10.314159265354; // 這裡用double
printf("The number is %.8f", num);
return 0;
}
```
----
<!-- .slide: data-transition="fade" -->
**如果要求輸出到小數點後幾位**
**有可能會四捨五入或五捨六入**
<!-- .element: class="fragment" data-fragment-index="1" -->
**主要是跟小數點二進制的儲存方式有關**
<!-- .element: class="fragment" data-fragment-index="2" -->
**這方面我們下次再討論**
<!-- .element: class="fragment" data-fragment-index="3" -->
---
<!-- .slide: data-transition="fade" -->
### 例題練習
----
<!-- .slide: data-transition="fade" -->
[Zerojudge d483. hello, world](https://zerojudge.tw/ShowProblem?problemid=d483)
**不要跟我說你不會**
<!-- .element: class="fragment" data-fragment-index="1" -->
---
<!-- .slide: data-transition="fade" -->
### 以上就是本章節的內容
{"description":"認識資料型態","title":"C程式設計導論-資料型態與輸入輸出","contributors":"[{\"id\":\"4f67a8cd-06ae-45dc-a8e3-62c6a41e5a37\",\"add\":8434,\"del\":913}]"}