無痛入手 C++:基礎系列5 - 條件判斷

2024/04/26閱讀時間約 19 分鐘

幾乎所有程式語言都有條件判斷的語法,目的是為了讓電腦依照不同的情況做出不同的事情。​

If 判斷式

最簡單的形式如下:

if (條件式)
陳述​

意思是當條件式為真的時候,就執行陳述

條件式可以是 true/false,也可以是比較運算或邏輯運算的運算結果。總之,電腦會判斷 if 後面的判斷式為真還是假。執行看看下面的程式:

#include <iostream>
using namespace std;

int main() {
bool x = true;
if (x)
cout << "This is true!\n";
if (10 < 3)
cout << "10 < 3?\n";
if (3/2 == 1)
cout << "Do you know why?\n";
if (!x)
cout << "Lier!\n";
return 0;
}

應該會出現:

This is true!
Do you know why?

實際上,判斷式也可以放別的資料型態的變數/值,或是算術運算的結果。這是因為電腦會自動將其他資料型態的資料轉型成布林值的型態。這邊舉比較常用的例子。

整數: 0 會被轉型成 false,其他則為 true。
浮點數: 0.0 會被轉型成 false,其他則為 true。

也就是說,你可以用更簡短的程式來判斷算數運算的結果是否為 0。
舉例來說,下列的程式會判斷 x 和 y 是否皆為 0:

int x, y;
cin >> x >> y;

if (!x && !y)
cout << "Both x and y are 0.";


假如 if 有超過一行的陳述,就必須用大括號把陳述通通包起來,如:

if (true) {
cout << "First statement.\n";
cout << "Second statement.\n";
cout << "Third statement.\n";
}


Else 判斷式

每個 if 判斷式後面都可以接一個 else 判斷式,假如 if 的判斷式為假,電腦就會執行 else 的陳述。同樣的,如果陳述超過一行的話,需要用大括號包起來。如:

// Example 1
int x;
cin >> x;

if (x > 0)
cout << "x > 0\n";
else
cout << "x <= 0\n";


// Example 2
string str;
cout << "What programming language are you learning?\n";
cin >> str;
if (str == "C++") {
cout << "yes!!!\n";
}
else {
cout << str << "??\n";
cout << "Am I a joke to you?\n";
}

通常 if 跟 else 會同時使用大括號,或同時不使用。C++ 並不會強制你這樣做,這只是大家寫程式的習慣而已。

注意: if 跟 else 的陳述只會有一個會被執行到。假如 if 的判斷式為真,在執行完對應的陳述後,電腦就會跳過 else 的部分,繼續執行下去


下面是一些 if、else 的範例程式。

範例1: 輸入一個數,印出它的絕對值:

int num;
cin >> num;
if (num < 0)
cout << -num;
else
cout << num;

範例2: 輸入兩個相異的數,印出比較大的數:

int x, y;
cin >> x >> y;
if (x > y)
cout << x;
else
cout << y;

範例3: 輸入兩個非 0 的數,判斷它們之間是否存在倍數關係:

int x, y;
cin >> x >> y;
if (x > y)
cout << (x % y == 0);
else
cout << (y % x == 0);


else if 判斷式

在 if 跟 else 之間可以插入一個或多個 else if 來進行更細緻的判斷。else if 跟 if 一樣也具有判斷式跟陳述,程式結構如下:

if (判斷式1)
陳述1
else if (判斷式2)
陳述2
​else if (判斷式3)
陳述3
else
陳述4​

電腦會從 if 開始逐一判斷,一旦遇到判斷式為真的 if 或 else if,就會執行對應的陳述,執行完後就會跳過所有其他的判斷式和陳述。也就是說,只會有一個陳述被執行到。

下面的程式會判斷兩個數字誰比較大,或是一樣大:

int x, y;
cin >> x >> y;
if (x > y)
cout << x << " > " << y;
else if (x < y)
cout << x << " > " << y;
else
<< x << " = " << y;

下面的程式會依照分數的高低,給予對應的回答:

int grade;
cout << "What is your grade?\n";
cin >> grade;

if (grade >= 90)
cout << "wow! good job!\n";
else if (grade < 90 && grade >= 60)
cout << "Not bad!\n";
else
cout << "Oops!\n";


巢狀判斷式

if、else if 和 else 其實也是陳述的一種,因此你可以在 if、else if 或 else 的陳述中,加入更多 if、else if 和 else! 這種架構稱為「巢狀」(nested)。

下面的程式會判斷兩個數字誰比較大,或是一樣大:

int x, y;
cin >> x >> y;
if (x > y)
cout << x << " > " << y;
else {
if (x < y)
cout << x << " < " << y;
else
cout << x << " = " << y;
}

這個例子跟前面 else if 判斷式的第一個範例是相同的,差別只在這個寫法比較醜~ 如果可以的話盡量使用 else if,程式看起來會比較整齊好讀。

下面是另一個更醜的程式: 除了會依照分數的高低,還會依照社會的刻板印象給予回答。使用不同的輸入組測試看看 (僅作為教學用途,通常不會把程式寫得這麼醜)。
注意: 輸入資料給布林變數的時候,要輸入 1 (真) 或是 0 (假),輸入 true 或 false 的話會被當成字串。

int grade;
bool isAsian;
cout << "What is your grade?\n";
cin >> grade;
cout << "Are you Asian?\n";
cin >> isAsian;

if (grade >= 90) {
if (isAsian)
cout << "This is your job!\n";
else
cout << "wow! good job!\n";
} else if (grade < 90 && grade >= 60) {
if (isAsian)
cout << "No dinner tonight!\n";
else
cout << "Not bad!\n";
} else {
bool ​isLegal;
cout << "Is abandoning kids legal in your country?\n";
cin >> isLegal;
if (isAsian && !isLegal)
cout << "I wish i can abandon you, but its illegal!\n";
else if (isAsian)
cout << "(your abandoned...no response...)\n";
else
cout << "Oops!\n";
}

可以在 if、else if、else 的大括號中撰寫各式各樣的陳述,包含宣告新的變數。在上面的例子中,最外層的 else 在大括號內宣告了 isLegal

可以利用這個手法將變數宣告在它被使用的地方附近,假如 isLegal 宣告在 isAsian 的下面一行,會讓讀程式碼的人需要掃描更大的區域才能理解程式的行為。

注意: 大括號還具有劃分「可視範圍」的作用,變數被宣告以後,只能被相同範圍 (同一組大括號內) 或是目前範圍中的其他範圍 (目前的大括號內的其他大括號) 內的陳述使用
以上述的程式來說,23 行的 cin 和宣告在 21 行的 isLegal 屬於相同的範圍,所以可以使用 isLegal。而 24 行的陳述所屬的範圍在第 2 行的 isAsian 所屬的範圍之內,所以可以使用 isAsian。這部分的內容在之後會專門寫一篇來解釋。

同樣的程式,也可以寫成下面的形式: 把是不是亞洲人的這個判斷拉到最外層的判斷式,內層的判斷式則是依照不同的分數給出不同的回應。雖然還是很醜,但應該比上面的好讀一些。

int grade;
bool isAsian;
cout << "What is your grade?\n";
cin >> grade;
cout << "Are you Asian?\n";
cin >> isAsian;

// Asian part
if (isAsian) {
if (grade >= 90)
cout << "This is your job!\n";
else if (grade < 90 && grade >= 60)
cout << "No dinner tonight!\n";
else {
bool ​isLegal;
cout << "Is abandoning kids legal in your country?\n";
cin >> isLegal;
if (!isLegal)
cout << "I wish i can abandon you, but its illegal!\n";
else
cout << "(your abandoned...no response...)\n";
}
} else { // non Asian part
if (grade >= 90)
cout << "wow! good job!\n";
else if (grade < 90 && grade >= 60)
cout << "Not bad!\n";
else
cout << "Oops!\n";
}


switch 條件判斷

switch 跟 if、else if、else 很類似,結構如下:

switch(變數或運算式) {
case1:
陳述1-1;
陳述1-2;
break;
case2:
陳述2-1;
陳述2-2;
break;
default:
陳述3-1;
陳述3-2;
}

電腦會拿 switch 小括號內的變數或運算式的結果,去比對每個 case 後面的值,如果相等的話,就會執行 case 下面的陳述。每個 case 都可以有多個陳述。
如果沒有任何 case 的值匹配的話,就會執行 default 的陳述。

注意到每個 case 的最後一個陳述下面,有一個特殊的陳述: break;
執行到 break 的時候,電腦就會跳到 switch 外面,剩下的都不會被執行到。

下面的程式會依照 x 的值印出對應的字串。由於每個 case 中都加了 break,因此不論 x 的值為何,每次執行的時候都只會有一行字串被印出來。

int x = 0;
cin >> x;
switch(x) {
case 1:
cout << "One\n";
break;
case 2:
cout << "Two\n";
break;
case 3:
cout << "Three\n";
break;
default:
cout << "Default\n";
}

假如匹配到的 case 中沒有 break 的話,在執行完那個 case 的陳述後,電腦會繼續往下執行下一個 case 的陳述,直到遇到 break 或是執行完所有 switch 中的陳述 (包含 default 的陳述)。
下面的程式將上個例子的 break 全部拿掉了,輸入不同的值觀察結果:

int x = 0;
cin >> x;
switch(x) {
case 1:
cout << "One\n";
case 2:
cout << "Two\n";
case 3:
cout << "Three\n";
default:
​ cout << "Default\n";
}

假如要在 case 的陳述中宣告變數且初始化的話,必須用大括號把變數宣告以及會使用到變數的陳述包起來,如:

int x = 0;
cin >> x;
switch(x) {
case 1:
{
int y = 0;
cin >> y;
cout << "One plus " << y << '\n';
}
break;
case 2:
cout << "Two\n";
break;
case 3:
cout << "Three\n";
break;
default:
​ cout << "Default\n";
}



總結

這篇介紹了兩種條件判斷的寫法: if、else if、else 以及 switch。

if、else if、else:

  1. 電腦在遇到 if、else if 的時候,會檢查條件式,如果為真的話就會執行對應的陳述,執行完後就會跳過所有後面的條件式以及陳述。如果所有的條件式皆為假,就會執行 else 的陳述。
  2. 如果有多行陳述的話,需要用大括號 {} 包起來。
  3. 大括號內可以撰寫各種陳述,包含宣告新的變數。
  4. 整數 0 和浮點數 0.0 會被自動轉型成布林值的假,其他數值則會被轉型為真。

switch:

  1. 電腦會拿變數或運算結果的值去配對不同的 case,配對到以後就會執行對應的陳述。
  2. 執行到 break 的話,電腦會跳出 switch,從 switch 外面的第一行程式繼續執行。如果沒有遇到 break,電腦會繼續往後執行,直到遇到 break 或是執行完 switch 內的所有陳述。
  3. 假如要在 case 的陳述中宣告變數且初始化的話,必須用大括號把變數宣告以及會使用到變數的陳述包起來。

習題

  1. 下列的兩個例子差別在哪? 什麼時候需要加 else,什麼時候不需要呢?
// Example 1
if (x > y)
cout << "x > y\n";
else
cout << "x <= y\n";

// Example 2
if (x > y)
cout << "x > y\n";
cout << "x <= y\n";
  1. 輸入一個月份,並依照月份印出是哪個季節。用 if、else if、else 以及 switch 各寫一個版本。
  2. 輸入一個數字,並判斷該數字是否可以被 2、3、5 整除,並分別印出對應的字串,舉例來說: 假如輸入 4 的話,應該要印出 can be divided by 2;假如輸入 15 的話,應該要印出 can be divided by 3 以及 can be divided by 5;依此類推,假如輸入 60 的話,就是三個都要印出來。


應用

猜拳遊戲


1會員
12內容數
程式設計 & 電腦系統 & 系統軟體
留言0
查看全部
發表第一個留言支持創作者!