# 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)