# Ch02 變數與運算
> 上一章: [Ch00 C的編譯環境架設](https://hackmd.io/@sunfrancis12/rJxDo6jza)
> 下一章: [Ch03 if 條件判斷](https://hackmd.io/@sunfrancis12/SJ_9xCjzT)
> 回目錄: [NTCU程式戰鬥營C講義](https://hackmd.io/@sunfrancis12/ByfdXdjG6)
## 什麼是變數
變數的性質類似於我們以前國高中使用的未知數X,Y一樣,是用來代表某一個東西
在程式語言中,我們可以透過輸入資料,來讓變數初始化(X=100)
*變數相當於一個盒子,可以拿來裝資料
不同種類的盒子分別有不同的用途,例如裝飲料的牛奶盒、裝食物的便當盒、裝文具的鉛筆盒…等等
不同種類的變數也分別有不同的用途,例如整數、小數、字串、字元、布林數…等等*
> 取自 [新竹實驗中學C++程式語言教學講義 -Ch2 變數與輸入](https://hackmd.io/@CLKO/HJtZXMpqb?type=view)
## C常用的變數型態
常見C的變數型態有:
* int 整數
* float 浮點數
* double 雙精度浮點數(Double Float)
* char 字元
還有其他資料型態可以參考:
> [維基百科: 資料型態 (C語言)](https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B_(C%E8%AF%AD%E8%A8%80))
## 變數型態的範圍以及格式化字串
:::info
關於格式化字串下面會說明
:::
| 變數型態 | 格式化字串 | 範圍 |
|:--------:|:-----------:|:----------------------------:|
| int | %i, %d | -2147483648至2147483647 |
| float | %f、%e、%g | 2.939x10^-38 至 3.403x10^+38 |
| double | %lf、%e、%g | 5.563x10^−309 至 1.798x10^+308 |
| char | %c | -128至127 (ASCII編碼) |
## 變數的宣告
在使用一個變數之前,我們必須先進行<a style="color:red">**宣告**</a>,類似於定義某個東西
```c=
變數型態 變數名稱;
```
範例如下:
```C=
int a; //宣告一個整數a
int b = 100; //初始化b的值為100
```
我們也可以在同一行宣告多筆資料:
> 宣告的每筆資料要用 , 間隔
```C=
int a,b=100,c=1000;
```
## 變數的輸入輸出
我們上述列出的`格式化字串`,功能是告訴程式你想要輸出,輸入的變數類型以及要輸出,輸入哪一個變數
輸入一筆資料:
```c=
scanf("變數類型的格式化字串",&變數的名稱);
```
輸出一筆資料:
```c=
printf("變數類型的格式化字串",變數的名稱);
```
比如說我們要輸入一個整數a,並且將A的結果輸出
```c=
int a; //宣告一個整數a
scanf("%d",&a); // %d為int變數的格式化字串 a為想要輸入的變數
printf("%d",a); //%d為int變數的格式化字串 a為想要輸出的變數
```
## 多筆資料的輸入輸出
輸入複數資料:
> 每筆資料用 , 間隔
資料的輸入對象跟順序有關,輸入第一筆資料將會放進a,第二筆則會放進b....以此類推
```c=
scanf("%d%d%d",&a,&b,&c);
```

輸出複數資料:
> 與輸入的概念相同
```c=
printf("%d%d%d",a,b,c);
```
一次輸入三筆資料並印出:
```c=
#include<stdio.h>
int main(){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("a,b,c的數值為%d,%d,%d",a,b,c);
}
```
輸入內容:
> 由於要讓程式知道我們輸入的是三筆資料,因此我們輸入每個變數都需要空格分隔
>
> *輸入內容為(30 40 50)而非(304050)*
```c=
30 40 50
```
輸出結果:
```c=
a,b,c的數值為30,40,50
```
當然也可以輸入不同種變數的複數資料:
```c=
scanf("%d%f%e",&int_a,&float_b,&double_c);
```
一次輸入三筆不同種變數資料並印出:
```c=
#include<stdio.h>
int main(){
int a;
float b;
double c;
scanf("%d%f%lf",&a,&b,&c);
printf("a,b,c的數值為%d,%f,%lf",a,b,c);
}
```
輸入內容:
```c=
563 2342.49453 3493.3258934
```
輸出結果:
```c=
a,b,c的數值為563,2342.494629,3493.325893
```
---
除了使用空格間格之外,我們也可以根據需求,自訂義資料的讀取方式
```c=
scanf("電話:%dID:%d",&a,&b);
```

從一串句子讀取我們要的資訊:
```c=
#include<stdio.h>
int main(){
int id,tel;
float money;
scanf("ID:%dtel:%dmoney:%f",&id,&tel,&money);
printf("ID,電話,剩餘金額的數值為%d,%d,%f",id,tel,money);
}
```
輸入內容:
```c=
ID:245tel:3479234money:4094.56
```
輸出結果:
```c=
ID,電話,剩餘金額的數值為245,3479234,4094.560059
```
:::info
更詳細的格式化輸入輸出會到之後的章節在做補充,字元的輸入的則是會在字串處理一併講解
:::
# 變數的四則運算(國小數學)
## 各類運算符號
* `+` : 將兩個變數的值相加
* `-` : 將兩個變數的值相減
* `*` : 將兩個變數的值相乘
* `/` : 將兩個變數的值相除,如果是整數之間的除法,只會留下商,浮點數的運算,則會有小數點
- 5/2 = 2 (整數相除)
- 5.0/2.0 = 2.5 (浮點數相除)
* `%` : 除法取餘數
- 10%9 = 1
- 20%6 = 2
- 4%5 = 0
* ()內的會優先計算
- 10*(1+2) = 30
## = 的規則
程式中`=`的規則與我們學的數學的規則不太一樣,他的規則比較類似**指定**
```c=
a = 11 //把a的值指定為11
b = a+1 //把b的值指定為a+1
//結果:a=11 b=12
```
以下為一些變數之間運算的範例
```c=
a = 10
b = 10
a = a*b //把a的值指定為a*b (10*10)
//結果: a=100
b = a%b //把b的值指定為a%b (100%10)
//結果 b=0
```
## 四則運算的表示方法
除了上述的表示方法,我們也可以把他寫的更簡略一些
```c=
a = a+b -> a+=b
a = a*b -> a*=b
a = a-b -> a-=b
a = a%b -> a%=b
.....
```
我們也可以使用疊代器的方式來描述
```c=
a = a+1 -> a++
b = b-1 -> b--
```
## 四則運算的範例
<a style="color:orange">【例題】</a>
> 輸入一個整數,並輸出其個位數的值
範例程式:
```c=
#include<stdio.h>
int main(){
int a,digit;
scanf("%d",&a);
digit = a%10;
printf("個位數的數字是: %d",digit);
}
```
輸入內容:
```c=
234325
```
輸出結果:
```c=
個位數的數字是: 5
```
<a style="color:orange">【例題】</a>
> 經典的華氏轉攝氏
> 公式: (華氏-32) * 5/9 = 攝氏
範例程式:
```c=
#include<stdio.h>
int main(){
float f;
scanf("%f",&f);
printf("%f",(f-32)*5/9);
}
```
輸入內容:
```c=
122
```
輸出結果:
```c=
50.000000
```
<a style="color:orange">【例題】</a>
> 你身上總共有n元,而一個蛋塔40元
> 請你寫一個程式,輸入你身上所擁有的金額(n),並輸出你最多可以買多少蛋塔以及身上剩下多少錢
>
範例輸入:
```c=
300
```
範例輸出:
```c=
你最多可以買7個蛋塔 剩下20元
```
範例程式:
```c=
#include<stdio.h>
int main(){
int num;
printf("請輸入一個數字: ");
scanf("%d",&num);
printf("你最多可以買%d個蛋塔 剩下%d元",num/40,num%40);
}
```
---
> 上一章: [Ch00 C的編譯環境架設](https://hackmd.io/@sunfrancis12/rJxDo6jza)
> 下一章: [Ch03 if 條件判斷](https://hackmd.io/@sunfrancis12/SJ_9xCjzT)
> 回目錄: [NTCU程式戰鬥營C講義](https://hackmd.io/@sunfrancis12/ByfdXdjG6)