算一算
讓變數裡的值變成新的值。 · ⏱ 約 25 分鐘
你會學到三件事
- 怎麼改掉一個變數裡的值
- 為什麼
score = score + 5 在數學上是錯的,在程式裡是對的
- 整數相除會把小數丟掉,而
%、sqrt、pow 各自拿回一塊
開始之前
前三課的變數,值都是一開始就決定好、之後不再變。
這一課要讓它變。
🟢 先把編輯器打開,跟著下面一起做:跟著做
一、換掉裡面的值
照著打上這一段。同一個名字,裝的東西換掉了:
1int main() {2 int score = 95;3 score = 100;4 cout << "分數是 " << score << endl;5 return 0;6}
score = 100; 這一行前面沒有 int。
| 寫法 |
意思 |
有 int |
「造一個新的位子叫 score」 |
沒 int |
「那個已經存在的 score,換成 100」 |
同一個名字只能造一次位子,但可以換無數次內容。
積木盤上那顆叫「把 … 設成 …」——換內容的時候用它,不是宣告的那一顆。
二、= 不是「等於」
把 score = 100; 那一塊的內容換掉——整支程式現在長這樣:
1int main() {2 int score = 95;3 score = score + 5;4 cout << "分數是 " << score << endl;5 return 0;6}
印出來還是 分數是 100——而那一行的意思完全不同。
用數學的眼睛看,score = score + 5 是在說「一個數等於它自己加五」,
而那不可能成立。
在程式裡,= 不是「等於」,是「放進去」。這一行要從右邊往左邊讀:
score = score + 5
↑ ↓
└─────────┘
② 再放回去 ① 先算這一邊:95 + 5 = 100
⚠️ 順序是先右後左。 只要記住這一件事,這種寫法就不再奇怪了:
count = count + 1; 計數器加一
total = total + n; 累加
它們之後會一直出現。
三、除法有兩半:商和餘數
100 分要平分給 3 個人,每人幾分?剩幾分?
在那塊「印出」底下再接兩塊「印出」。整支程式現在是:
1int main() {2 int score = 95;3 score = score + 5;4 cout << "分數是 " << score << endl;5 cout << "每人 " << score / 3 << " 分" << endl;6 cout << "剩下 " << score % 3 << " 分" << endl;7 return 0;8}
跑起來是:
分數是 100
每人 33 分
剩下 1 分
100 / 3 印出 33,不是 33.33。
因為 score 和 3 都是整數,C++ 認為「整數除以整數,結果也是整數」,
於是把小數點後面直接丟掉。那不是四捨五入:7/2 是 3,9/2 也是 4。
而被丟掉的那一塊,% 拿得到——那就是餘數。
🔴 這兩個一起看才完整:/ 拿走了幾個整份,% 拿走剩下多少。
待會的做一個:找零錢整題就靠這兩個。
四、次方與開根號
五種運算裡沒有「次方」,也沒有「開根號」。
而 ^ 在 C++ 裡不是次方,它是另一件事,這一課用不到。這兩個要另外叫。
再接兩塊「印出」上去。整支程式現在是:
1int main() {2 int score = 95;3 score = score + 5;4 cout << "分數是 " << score << endl;5 cout << "每人 " << score / 3 << " 分" << endl;6 cout << "剩下 " << score % 3 << " 分" << endl;7 cout << "開根號是 " << sqrt(score) << endl;8 cout << "10 的 2 次方是 " << pow(10, 2) << endl;9 return 0;10}
跑起來多了兩行:
開根號是 10
10 的 2 次方是 100
100 開根號剛好是 10,而 10 的 2 次方又回到 100——它們是一對相反的動作。
積木盤上它們在「運算」裡:一顆寫著「… 的 … 次方」,
另一顆是一個下拉,預設是 abs(絕對值),要自己選成 sqrt(平方根)。
⚠️ 它們回傳的是小數(double),不是整數。
而 sqrt(100) 印出 10 而不是 10.0,是因為 cout 會把沒有小數的那些省略
——那是印出來的樣子,不是它裡面裝的東西。試試 sqrt(2),它會印 1.41421。
🟢 而程式最上面那一行 #include <cmath> 你不用自己打:
拖出那顆積木,上面那一行會自己出現。看一下下面那支完整的程式,第一行就是它。
完成的樣子
上面那一疊積木,加上它自己補在最上面的三行,整個檔案是:
這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。
1#include <cmath>2#include <iostream>3using namespace std;4int main() {5 int score = 95;6 score = score + 5;7 cout << "分數是 " << score << endl;8 cout << "每人 " << score / 3 << " 分" << endl;9 cout << "剩下 " << score % 3 << " 分" << endl;10 cout << "開根號是 " << sqrt(score) << endl;11 cout << "10 的 2 次方是 " << pow(10, 2) << endl;12 return 0;13}
把積木打散,自己排回去:排回去:把剛才那支程式的積木排好
換你了
接第 4 課的輸入:讀進一個數字,印出它的兩倍和除以 3 的餘數。
裁判餵 14 進去,印出來要長這樣:
兩倍是 28
餘數是 2
到編輯器做這一題:練習:兩倍與餘數
做一個
讀進一個金額,印出要給幾張 500、100、50、10、5、1(六行,由大到小)。
提示:/ 拿張數,% 拿剩下的。⚠️ 裁判用的是 1688。
🔴 做完想一件事:如果硬幣只有 3 元和 5 元,要湊 11 元,
從大的開始拿會發生什麼?先拿 5、5,剩 1,湊不出來,而 3+3+5 明明可以。
「每次都拿最大的」這個做法在台幣上剛好對,而它不是永遠對的。
到編輯器做這一題:做一個:找零錢
補充:五種運算
上面用到 +、/、%,而整數能做的一共五種:
int a = 7, b = 2;
cout << a + b << endl; // 9
cout << a - b << endl; // 5
cout << a * b << endl; // 14
cout << a / b << endl; // 3 ← 商,小數被丟掉
cout << a % b << endl; // 1 ← 餘數
想要 3.5 而不是 3,其中一邊要是小數:7.0 / 2。
⚠️ % 對小數不能用,而它比你現在想的有用得多:
判斷奇偶(n % 2)、取個位數(n % 10)都靠它。
這一課你做了什麼
- 你用不帶型態的
score = ... 換掉了變數的值
- 你知道
= 要從右邊讀到左邊,不是數學的等號
- 你讓同一支程式一路長大:宣告 → 改值 → 商與餘數 → 次方與開根號
- 你知道
100 / 3 是 33,而 % 拿得到那個被丟掉的 1
- 你看過積木替你補上
#include <cmath>
如果卡住了
| 你看到 |
多半是因為 |
說 score 重複宣告 |
第二行也寫了 int。換值不用再寫型態 |
| 除法結果少了小數 |
兩邊都是整數。讓其中一邊變成 7.0 |
% 那行報錯 |
對 double 用了 %。取餘數只有整數能用 |
| 印出的還是舊的值 |
那一行寫在 cout 的後面了。程式是由上往下跑的 |
在編輯器打開這一課 →