無痛入手 C++:基礎教學5 - 條件判斷

更新於 2024/05/12閱讀時間約 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 的話,就是三個都要印出來。


應用

猜拳遊戲


avatar-img
3會員
14內容數
程式設計 & 電腦系統 & 系統軟體
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
鏟薯員的窩 的其他內容
<iostream> ​在之前的文章有提到過,<iostream> 是專門處理程式的輸入 (input) 以及輸出 (output) 的函式庫。輸入輸出的對象是以電腦作為主角: 輸入指的是「把資料給電腦」,輸出指的是「從電腦那邊取得資料」。 在這個系列的文章中,程式輸入指的都是從鍵盤輸入資料給電
電腦只做一件事情: 運算。 我們所看到的任何酷酷的應用: 不論是網頁動畫、遊戲特效、甚至是 AI 說的話,全部都 是由電腦的運算結果組合而成的。 首先我們來梳理一下各個名詞之間的關聯: 1. 運算分成兩個部分: 運算子 (運算的名稱,如: 加法) 和運算元 (運算的對象,如: 8)。運算就是對資
這個系列是專門寫給 0 程式設計經驗的初學者的 C++ 教學, 無需架設環境,直接開始無痛入手 C++ ~
<iostream> ​在之前的文章有提到過,<iostream> 是專門處理程式的輸入 (input) 以及輸出 (output) 的函式庫。輸入輸出的對象是以電腦作為主角: 輸入指的是「把資料給電腦」,輸出指的是「從電腦那邊取得資料」。 在這個系列的文章中,程式輸入指的都是從鍵盤輸入資料給電
電腦只做一件事情: 運算。 我們所看到的任何酷酷的應用: 不論是網頁動畫、遊戲特效、甚至是 AI 說的話,全部都 是由電腦的運算結果組合而成的。 首先我們來梳理一下各個名詞之間的關聯: 1. 運算分成兩個部分: 運算子 (運算的名稱,如: 加法) 和運算元 (運算的對象,如: 8)。運算就是對資
這個系列是專門寫給 0 程式設計經驗的初學者的 C++ 教學, 無需架設環境,直接開始無痛入手 C++ ~
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Grass 是由一家去中心化人工智慧領域的初創公司Wynd Network,在2023年6月所推出的去中心化網路資源共享平台。
期許未來的自己能幫助更多對英文恐懼或排斥的孩子看到更多這個世界裡頭的有趣與價值。為了達到這個目標,用心準備每一堂課,在課堂中好好陪伴每一位學生學習是現在的我能努力做好的事。
Thumbnail
論語裡孔子曾說過:「未知生,焉知死?」過了五十歲之後,我反而有一種「先知死,而後生」的體悟。 最近因為一些因素,對於「死亡」的歷程必須先行預習,所以連續看了兩部日本電影:「無痛離世」跟「山中靜夫的最後尊嚴」。同樣聚焦在癌症末期的主題,同樣超級寫實的演繹了病人在世間最後辛苦的時光,讓我可以先預習癌末
Thumbnail
透過Google Authenticator轉移帳戶的功能,可以一次性提取所有TOTP密鑰,加快整合TOTP到Bitwarden的過程。整合完成後,不論是輸入帳號密碼或是輸入TOTP認證碼,都只需要Bitwarden即可搞定,在安全性和方便性取得平衡。在方便性和安全性之間取得平衡,是資安永遠的課題。
Thumbnail
在另一次快速的截肢手術中,李斯頓雖然饒過病人的睪丸,卻意外切斷助理的兩根手指。後來病人與助理雙雙死於壞疽,而一名在旁觀看這場手術的人,看見李斯頓匆忙揮舞手術刀,刀子戳破了外套,還以為李斯頓被戳死,因此嚇得休克,一命嗚呼。在麻醉劑出現之前的年代,手術就是這麼危險。
Thumbnail
  為了未來就業穩定,目前打算以成為公股銀行行員的目標邁進!打算花半年至一年的時間考取Fit(金融基測),再慢慢考一些有的沒的法定考試(好痛苦...)   先說我報名證基會2023/7/7的紙筆考試,大概從2023/6/27開始準備,準備時長10天左右。但我不能說自己是非常認真準備的學生,主要原因是
Thumbnail
大綱: 1.股利的三大迷思 2.投資中第1~3級思考 3.大部分的人虧損的原因 4.兩個最有效率的投資策略 5.單筆投資與定期定額的差別。 6.長期投資成功的關鍵是什麼? 7.已實現和未實現報酬的差異。 8.股票賣出的三大理由。 9.投資必勝九大金律。 讀書心得分成兩篇,上篇的連結 本文PODCAS
Thumbnail
大綱: 1.適合誰閱讀 2.股市秤重機 3.風險管理的兩大誤區 4.長期投資的七大優勢 5.股利是雙面刃 【無痛致富】,去年10/26號上市。作者是佛里曼投資顧問團隊(Freeman Publications),總部位於英國倫敦,提供個人專業的投資理財顧問服務,將最複雜的投資策略以易於理解的語言傳達
Thumbnail
水晶洞功效: 水晶洞又稱作是風水石,裡面充滿漂亮的晶牙、水晶花,彼此能量互相震動凝聚磁場!能夠聚財納福、避邪擋煞、吉祥平安。且晶洞本身就是源源不絕的發電廠,可以幫其他水晶淨化、消磁。 迷你晶洞擺放在辦公桌: 在工作上有貴人幫助、專注辦公、防止小人陷害、被老闆讚許、加薪升官的機會! 迷你晶洞擺放在正財
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Grass 是由一家去中心化人工智慧領域的初創公司Wynd Network,在2023年6月所推出的去中心化網路資源共享平台。
期許未來的自己能幫助更多對英文恐懼或排斥的孩子看到更多這個世界裡頭的有趣與價值。為了達到這個目標,用心準備每一堂課,在課堂中好好陪伴每一位學生學習是現在的我能努力做好的事。
Thumbnail
論語裡孔子曾說過:「未知生,焉知死?」過了五十歲之後,我反而有一種「先知死,而後生」的體悟。 最近因為一些因素,對於「死亡」的歷程必須先行預習,所以連續看了兩部日本電影:「無痛離世」跟「山中靜夫的最後尊嚴」。同樣聚焦在癌症末期的主題,同樣超級寫實的演繹了病人在世間最後辛苦的時光,讓我可以先預習癌末
Thumbnail
透過Google Authenticator轉移帳戶的功能,可以一次性提取所有TOTP密鑰,加快整合TOTP到Bitwarden的過程。整合完成後,不論是輸入帳號密碼或是輸入TOTP認證碼,都只需要Bitwarden即可搞定,在安全性和方便性取得平衡。在方便性和安全性之間取得平衡,是資安永遠的課題。
Thumbnail
在另一次快速的截肢手術中,李斯頓雖然饒過病人的睪丸,卻意外切斷助理的兩根手指。後來病人與助理雙雙死於壞疽,而一名在旁觀看這場手術的人,看見李斯頓匆忙揮舞手術刀,刀子戳破了外套,還以為李斯頓被戳死,因此嚇得休克,一命嗚呼。在麻醉劑出現之前的年代,手術就是這麼危險。
Thumbnail
  為了未來就業穩定,目前打算以成為公股銀行行員的目標邁進!打算花半年至一年的時間考取Fit(金融基測),再慢慢考一些有的沒的法定考試(好痛苦...)   先說我報名證基會2023/7/7的紙筆考試,大概從2023/6/27開始準備,準備時長10天左右。但我不能說自己是非常認真準備的學生,主要原因是
Thumbnail
大綱: 1.股利的三大迷思 2.投資中第1~3級思考 3.大部分的人虧損的原因 4.兩個最有效率的投資策略 5.單筆投資與定期定額的差別。 6.長期投資成功的關鍵是什麼? 7.已實現和未實現報酬的差異。 8.股票賣出的三大理由。 9.投資必勝九大金律。 讀書心得分成兩篇,上篇的連結 本文PODCAS
Thumbnail
大綱: 1.適合誰閱讀 2.股市秤重機 3.風險管理的兩大誤區 4.長期投資的七大優勢 5.股利是雙面刃 【無痛致富】,去年10/26號上市。作者是佛里曼投資顧問團隊(Freeman Publications),總部位於英國倫敦,提供個人專業的投資理財顧問服務,將最複雜的投資策略以易於理解的語言傳達
Thumbnail
水晶洞功效: 水晶洞又稱作是風水石,裡面充滿漂亮的晶牙、水晶花,彼此能量互相震動凝聚磁場!能夠聚財納福、避邪擋煞、吉祥平安。且晶洞本身就是源源不絕的發電廠,可以幫其他水晶淨化、消磁。 迷你晶洞擺放在辦公桌: 在工作上有貴人幫助、專注辦公、防止小人陷害、被老闆讚許、加薪升官的機會! 迷你晶洞擺放在正財