Semorphe

算一算

讓變數裡的值變成新的值。 · ⏱ 約 25 分鐘

你會學到三件事

  1. 怎麼改掉一個變數裡的值
  2. 為什麼 score = score + 5 在數學上是錯的,在程式裡是對的
  3. 整數相除會把小數丟掉

開始之前

前三課的變數,值都是一開始就決定好、之後不再變。 這一課要讓它

一、換掉裡面的值

int main() {
    int score = 95;
    score = 100;
    cout << "分數是 " << score << endl;
    return 0;
}

score = 100; ——注意這一行前面沒有 int

| 有 int | 「造一個新的位子叫 score」 | | 沒 int | 「那個已經存在的 score,換成 100」 |

同一個名字只能造一次位子,但可以換無數次內容。

積木盤上那顆叫「把 … 設成 …」——換內容的時候用它,不是宣告的那一顆。

二、= 不是「等於」

現在把它改成:

int score = 95;
score = score + 5;

用數學的眼睛看,score = score + 5 是在說「一個數等於它自己加五」—— 那不可能成立。

而在程式裡,= 不是「等於」,是「放進去」。這一行要從右邊往左邊讀:

score  =  score + 5
   ↑         ↓
   └─────────┘
   ② 再放回去      ① 先算這一邊:95 + 5 = 100

⚠️ 順序是先右後左。 只要記住這一件事,這種寫法就不再奇怪了:

count = count + 1;   // 計數器加一
total = total + n;   // 累加

它們之後會一直出現。

三、五種運算,和一個陷阱

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   ← ⚠️ 不是 3.5
cout << a % b << endl;   // 1   ← 餘數

7 / 2 印出 3,不是 3.5

因為 ab 都是 int,C++ 認為「整數除以整數,結果也是整數」, 於是把小數點後面直接丟掉(不是四捨五入——7/239/2 也是 4)。

想要 3.5,其中一邊要是小數:

double c = 7.0 / 2;   // 3.5

%取餘數,只有整數能用。它比你現在想的有用得多—— 判斷奇偶(n % 2)、取個位數(n % 10)都靠它。

四、開根號與次方

五種運算裡沒有「次方」,也沒有「開根號」——^ 在 C++ 裡不是次方 (它是另一件事,這一課用不到)。這兩個要另外叫:

#include <cmath>

cout << pow(2, 10) << endl;   // 1024   ← 2 的 10 次方
cout << sqrt(16) << endl;     // 4      ← 16 開根號

積木盤上它們在「運算」裡:一顆寫著「… 的 … 次方」, 另一顆是一個下拉,選 sqrt(平方根)

⚠️ 它們回傳的是小數double),不是整數。所以:

cout << sqrt(16) << endl;     // 4      ← 剛好整除,看起來像整數
cout << sqrt(2) << endl;      // 1.41421

🔴 而 sqrt(16) 印出 4 而不是 4.0,是因為 cout 會把沒有小數的那些省略 ——那是印出來的樣子,不是它裡面裝的東西。

⚠️ 要用它們,程式最上面要有 #include <cmath>。 🟢 而在積木這一邊你不用管:拖出那顆積木,上面那一行會自己出現。

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1#include <iostream>2using namespace std;3int main() {4    int score = 95;5    score = score + 5;6    cout << "分數是 " << score << endl;7    return 0;8}
95變數score變數score5+"分數是 "變數score換行0回傳印出設成宣告int(整數)變數score=定義函式 回傳型別int(整數)main使用命名空間std引入函式庫iostream(輸入輸出)1234567

換你了

接第 4 課的輸入:讀進一個數字,印出它的兩倍除以 3 的餘數

輸入:14
兩倍是 28
餘數是 2

到編輯器做這一題:練習:兩倍與餘數

做一個

讀進一個金額,印出要給幾張 500、100、50、10、5、1(六行,由大到小)。

提示:/ 拿張數,% 拿剩下的。⚠️ 裁判用的是 1688

🔴 做完想一件事:如果硬幣只有 3 元和 5 元,要湊 11 元, 從大的開始拿會發生什麼?(先拿 5、5,剩 1,湊不出來——而 3+3+5 明明可以。) 「每次都拿最大的」這個做法在台幣上剛好對,而它不是永遠對的

到編輯器做這一題:做一個:找零錢

這一課你做了什麼

如果卡住了

你看到 多半是因為
score 重複宣告 第二行也寫了 int。換值不用再寫型態
除法結果少了小數 兩邊都是整數。讓其中一邊變成 7.0
% 那行報錯 double 用了 %。取餘數只有整數能用
印出的還是舊的值 那一行寫在 cout後面了。程式是由上往下跑的
在編輯器打開這一課 →