---
# System prepended metadata

title: Ch02 變數與運算
tags: [程式教學]

---

# 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);
```
![](https://hackmd.io/_uploads/ByfTG-3fa.png)

輸出複數資料:
> 與輸入的概念相同
```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);
```
![](https://hackmd.io/_uploads/ry4LQbnza.png)


從一串句子讀取我們要的資訊:
```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)
