# Ch3 四則運算 > 搭配 [Zero Judge 高中生程式解題系統](https://zerojudge.tw/Problems) ## > 上一章:[變數與輸入](https://hackmd.io/s/HJtZXMpqb) > 下一章:[if條件判斷](https://hackmd.io/s/HyuwnlMoZ) > 回目錄:[國立科學園區實驗中學C++程式語言自學講義](https://hackmd.io/s/B18yT_i5Z) 在上一章,我們學會宣告變數,以及將使用者輸入的資訊存進變數裡 在這一章,我們將學會對變數做各種運算 ## <font color='darkblue'> 輸出運算式 </font> 在[輸出](https://hackmd.io/s/rk7oU9i5-)的章節,我們學過直接輸出數學運算式 像是`cout << 1+2+3` 會直接印出`6` 而這運算式,其實不是只能用固定的數字,而是可以用**變數**去做運算 例如`cout << 3+n` ,會依照`n`目前所代表的數字,來決定相加後的值為何 至於`n`代表的數字為何,則是看程式目前跑到那行時 n 變成什麼值了而定 可能是從使用者輸入的數字,也可能是一開始就設定好的數字 <font color="darkorange"> 【例題】</font> 小明有n個10元硬幣,請問小明總共有幾元? 以下程式示範將使用者輸入的數乘以10後輸出 ```cpp= int n ; cin >> n; cout << n*10 << endl; ``` 不管使用者輸入了什麼數字,這支程式都會將他乘以10以後印出來 <!-- > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a004: 民國與西元的換算 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a004) --> ## <font color='darkblue'> 多個變數輸入 </font> 當然,如果你要使用不只一個變數也是可以的 <font color="darkorange"> 【例題】</font> 小明有a元,小華有b元,請問兩人加起來共有幾元? 以下程式示範將輸入的兩個數字加起來 ```cpp= int a, b; cin >> a; cin >> b; cout << a+b << endl; ``` 不管使用者輸入了什麼數字,這支程式都會將它們相加後印出來 由於宣告時的`a`和`b`都是宣告成**整數**型態 因此使用者只能夠輸入整數 如果你希望你的加法程式也能夠處理小數的加法 就要將`a`和`b`宣告成`float`的型態 寫題目時,可以依照題意決定要將變數宣告成什麼型態 例如上述範例,因為錢一定是整數,所以可以宣告成`int`型態就好 > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Zero Judge a002: 簡易加法 ](https://zerojudge.tw/ShowProblem?problemid=a002) <!-- > - [ ] [Green Judge a005: 矩形面積 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a005) --> ## <font color='darkblue'> 各式運算符號 </font> - 加號`+` :和數學的加號相同 - 減號`-` :和數學的減號相同 - 乘號`*` :和數學的乘號相同 - 除號`/` :如果是整數除法,就只留下商;如果是小數除法,則是保留一些位數的小數,例如 - `5 / 2` 結果會是`2` - `5.0 / 2.0` 結果會是`2.5` - 模`%`:除法取餘數,例如 - `5 % 2` 結果會是`1` - `10 % 5` 結果會是`0` - `7 % 4` 結果會是`3` - 括號`()`:和數學的括號相同,括號內的部分優先算。 - 如果要用括號包括號的話,同樣也是用這種小括號,例如`((1+2)*(3+4))*5` <font color="darkorange"> 【例題】</font> 小明有m個10元硬幣和n個1元硬幣,請問小明總共有多少錢? 以下程式將示範此運算 ```cpp= int m, n ; cin >> m ; cin >> n ; cout << m*10+n << endl ; ``` <!-- > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a006: 時間換算(一) ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a006) --> <font color="darkorange"> 【例題】</font> 小明有n個1元硬幣,請問可以換成幾個10元硬幣? 剩下幾個1元硬幣? 以下程式將示範此運算 ```cpp= int n ; cin >> n ; cout << n/10 << " " << n%10 << endl ; ``` <!-- > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a007: 時間換算(二) ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a007) --> <font color="darkorange"> 【例題】</font> 小明到美國玩,發現溫度計顯示的是華氏溫度。請問華氏的x度是攝氏的幾度? 以下程式將示範此運算 ```cpp= float f; cin >> f; cout << (f-32)*5/9 << endl; ``` 由於答案可能出現**小數**,所以要宣告成`float`的型態來處理 <!-- > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a008: 溫度轉換 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a008) --> <font color="darkorange"> 【例題】</font> 以下程式將示範如何將一個4位數拆成個位、十位、百位、千位 ```cpp= int n; cin >> n; cout << n%10 ; cout << (n/10)%10 ; cout << (n/100)%10 ; cout << (n/1000)%10 ; ``` ## <font color='darkblue'> 多步驟的運算 </font> 有時候,要處理的問題可能會非常複雜 光是用一個式子表示答案,會讓程式看起來非常亂,且容易寫錯 <font color="darkorange"> 【例題】</font> 甲有n支鉛筆,乙的鉛筆是甲的2倍再多3支,丙的鉛筆是乙的3倍再少1支,丁的鉛筆比丙還要少5支,請問甲乙丙丁總共有幾支? 以下程式示範非常繁雜的寫法 ```cpp= int ja ; cin >> ja; cout << ja+(ja*2+3)+((ja*2+3)*3-1)+(((ja*2+3)*3-1)-5) << endl; ``` 哇咧,真的是太雜了 就算要化簡還要自己用筆算 萬一跑出來的結果不如預期,也很難檢查出自己哪邊寫錯 如果能夠宣告好幾個變數 分別存甲、乙、丙、丁的數量 看起來就會清楚明瞭很多 像是: ```cpp= (注意 這程式還不完整喔 直接拿去執行的話會跑出怪東西!!) int ja ; int yee ; int bing ; int ding ; cin >> ja; cout << ja + yee + bing + ding ; ``` 問題是,要怎麼讓電腦知道**乙是甲的兩倍多三支**、**丙是乙的三倍少一支**,**丁比丙少五支**呢? 乙丙丁的數量是藉由甲的數量運算而來,又不是讓使用者輸入的 到底該怎麼讓`yee`、`bing`、`ding`這三個變數存入正確的值呢? ## 給值 現在要來介紹一個新的符號:`=` 雖然形狀長得像數學的「等號」,但它和數學的等號沒有關係 它所代表的意思是「變成」、「代入」、「存入」的意思 例如 ```cpp= int a ; a = 3 ; cout << a << endl; ``` 如此一來,不需要`cin>>a`,也不需要叫使用者輸入`3` 就直接讓`a`這個變數變成`3`這個數字了 可以利用`cout`印出來看看,是否真的會印出`3` 當然,也可以利用運算式存入變數,例如 ```cpp= a = 2*3 ; ``` 這麼一來`a`這個變數就會是`6`這個數字 也可以將另一個變數的值拿來使用,例如 ```cpp= a = 3 ; b = a+1 ; a = 999 ; ``` 這麼一來`b`這個變數就會是`4`這個數字 就算後來`a`變成`999`了,也不會影響到`b` 也可以拿自己原本的值來使用,例如 ```cpp= a = 3 ; a = a+1 ; ``` 如此一來`a`就會變成`4` <font color="darkorange"> 【例題】</font> 甲有n支鉛筆,乙的鉛筆是甲的2倍再多3支,丙的鉛筆是乙的3倍再少1支,丁的鉛筆比丙還要少5支,請問甲乙丙丁總共有幾支? 以下程式示範清楚簡單的寫法 ```cpp= int ja ; int yee ; int bing ; int ding ; cin >> ja; yee = ja*2+3 ; bing = yee*3-1 ; ding = bing-5 ; cout << ja + yee + bing + ding << endl ; ``` <!-- > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a010: 年齡推算 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a010) --> ## 懶人寫法 如果一個變數一開始就有值的話 可以在宣告的時候就直接指定 例如 ```cpp= int a ; a = 5 ; ``` 可以寫成 ```cpp= int a = 5 ; ``` 當變數運算會用到自己原本的舊值時,有較快速的寫法,例如 ```cpp= a = a+1 ; b = b-5 ; c = c*3 ; d = d/(a+b) ; ``` 可以寫成 ```cpp= a += 1 ; b -= 5 ; c *= 3 ; d /= (a+b) ; ``` 請注意運算符號跟等於之間不能有空格 另外,如果變數後面接的運算元是1的話 還可以這樣寫 例如 ```cpp= a = a+1 ; b = b-1 ; ``` 可以寫成 ```cpp= a++ ; b-- ; ``` 請注意兩個加號或兩個減號之間不能有空格 > 上一章:[變數與輸入](https://hackmd.io/s/HJtZXMpqb) > 下一章:[if條件判斷](https://hackmd.io/s/HyuwnlMoZ) > 回目錄:[國立科學園區實驗中學C++程式語言自學講義](https://hackmd.io/s/B18yT_i5Z)