Try   HackMD

Ch4 if條件判斷

搭配green judge解題系統
Special thanks to 台中女中sagit老師 <(_ _)>

上一章:四則運算
下一章:while迴圈
回目錄:國立科學園區實驗中學C++程式語言自學講義

條件與選擇

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

條件選擇,是藉由判斷條件
以選擇接下來要不要執行某一段程式

條件選擇的用途非常廣泛
且非常需要邏輯思考能力
因此同學在解題的時候或許可以搭配紙筆打草稿來輔助思考

if 如果

【例題】

輸入一個整數n,如果n小於0,則印出"Negative!"

輸入數字n以及印出"Negative!",我們都學過了
若不需判斷n是否小於0的話,程式可以寫成

int n ; cin >> n; cout << "Negative!" << endl ;

這樣的程式,不管輸入什麼樣的數字,都會印出"Negative!"
但現在希望只有在n<0的情況下才印出"Negative!"
這時就會需要使用到if

使用if的方法

if後面接一個小括弧,並且將要判斷的事情放入小括弧內
後面再接一個大括弧,裡面放入條件符合時才要執行的程式
例如

if(n<0) { cout << "Negative!" << endl ; }

這樣一來,只有n<0的時候,才會執行cout << "Negative!" << endl ;這個動作

判斷式

除了上面舉例的小於之外
數字之間總共有6種可以判斷的關係
使用的符號如下

意義 小於 大於 小於或等於 大於或等於 等於 不等於
符號 < > <= >= == !=

判斷符號的兩側,可以放常數、變數、運算式
例如
n == 10
a < b
50 >= a
a+b+c != n+10

else 否則

【例題】

輸入一個整數n,如果n小於0,則印出"Negative!";否則就印出"Natural!"

我們已經知道,如果在符合「n小於0」這個條件時要印出"Negative!"
程式可以寫成:

int n ; cin >> n ; if(n<0) { cout << "Negative!" << endl; }

如果還想要在不符合「n小於0」這個條件時印出"Natural!"
就會需要用到else(否則)

使用else的方法

else出現的時機就是
不符合某個判斷條件時才要執行的程式
所以它一定要接在某個if後面

if的區塊寫完後
直接接上一個else
後面再接一個大括弧,裡面放入條件不符合時才要執行的程式
請記得if的區塊和else的區塊之間絕不能放任何程式
(除了無意義的空行或空白以外)

剛才判斷負數或自然數的例題
正確的程式可以寫成

int n ; cin >> n ; if(n<0) { cout << "Negative!" << endl; } else { cout << "Natural!" << endl; }

上述這邊的else,指的就是「不符合n<0

無論如何,else一定要接在if的敘述後面
且只要else出現,指的就是接在它前面的if不發生的情況

【學生練習題】

同時判斷多個條件

【例題】

輸入一個整數n,如果n大於0且n小於100,則印出"Good!"

用數學式子來表達的話會寫成if(0<n<100)
但程式必須將n>0n<100分成兩次判斷
這兩個條件若要同時符合,可以用而且的符號來連接

意義 而且(and) 或是(or)
符號 && ||
利用而且或是的符號,可以將兩個以上的判斷式連接起來
例如
n>0 && n<100 代表「n大於0,而且n又小於100」才算符合
`n<0 n>50

而且或是同時使用時
也可以使用括弧來表達判斷的先後順序
例如
(n>0 && n<100) || n==200 代表n介於0到100之間或是n等於200時符合
(a==1 || a==2) && (b==3 || b==4) 代表a是1或2,且b是3或4時,符合
同學可以自行思考看看
如果判斷的先後順序不一樣了,符合條件的狀況有哪裡不一樣

剛才例題中的程式可以寫成

int n; if(n>0 && n<100) { cout << "Good!" << endl; }

【學生練習題】

懶人寫法:省略大括弧

如果大括弧內的程式只有一行
就可以將大括弧省略
例如

if(n>0 && n<100) { cout << "Good!" << endl; }

可以寫成

if(n>0 && n<100) cout << "Good!" << endl;

或是

if(n>0 && n<100) cout << "Good!" << endl;

換不換行、縮不縮排都可以
謹記,唯有大括弧內只有一行程式時,才可以省略

組合技:多個相互獨立的條件判斷

【例題】

期中考有3道題目
正確答案分別是t1、t2、t3
學生的答案分別是s1、s2、s3
第一題答對可以得30分
第二題答對可以得30分,
第三題答對可以得40分
輸入正確答案與學生的答案,請問學生總共可以得幾分?

在這個例子中,總共有三個要判斷的條件
且三次判斷都是獨立的,互不影響
因此只要依序把if寫上去就好
以下為範例程式

int score; score=0; int t1, t2, t3; int s1, s2, s3; cin >> t1 >> t2 >> t3 ; cin >> s1 >> s2 >> s3 ; if(s1==t1) score = score + 30; if(s2==t2) score = score + 30; if(s3==t3) score = score + 40; cout << score << endl;

隨著學到的東西變多,程式也變得愈來愈長了
寫出自己看得順眼的排版也變得愈來愈重要

【學生練習題】


【例題】

輸入三個數字,請輸出最大的數字
範例程式如下

int a, b, c ; cin >> a ; cin >> b ; cin >> c ; int max ; max = a ; if(b>max) max = b ; if(c>max) max = c ; cout << max << endl;

要找出最大的數字,可以先假設a是最大的
然後逐一檢查b與c
若是b比目前的最大數字大,則將最大數字改成b
若是c比目前的最大數字大,則將最大數字改成c

就算有兩個數字一樣大,例如6,5,6
反正最後輸出的都會是6
究竟是第一個6還是第三個6,完全無所謂

【學生練習題】

組合技:多個互相關聯的條件判斷

【例題】

如果今天出太陽,那就去菜市場;否則就不去
去了菜市場以後,如果蘋果的價格低於50,那就買蘋果;否則就不買
題目輸入sun和apple
若sun為1,代表出太陽,否則代表沒有出太陽
apple代表蘋果的價格

在本案例中,「判斷蘋果要不要買」這件事只有在「出太陽」的情況下才要做,因此可以使用「if包if」的寫法
例如

int sun, apple ; cin >> sun >> apple ; if(sun==1) { if(apple<50) cout << "Buy apple" << endl; else cout << "Do not buy apple" << endl; } else cout << "Not sunny" << endl;

【學生練習題】

閏年判斷的模板

int n; cin>>n; if(n%4==0){ //n是4的倍數 if(n%100==0){ //n是100的倍數 if(n%400==0){ //n是400的倍數 } else{ } } else{ } } else{ }

【例題】

六福村小人國實施聖誕方案,如果出生的月份是12月,則可以得到「超級優惠」,如果出生的日期是奇數,可以得到「一般優惠」,如果出生的月份等於出生的日期,可以得到「小優惠」
優惠不能重複使用,只能選最優惠的
輸入月分和日期,請輸出他可以使用的最好優惠

int month, date; cin >> month >> date ; if(month==12) cout << "super discount"; else { if(date%2==1) cout << "normal discount"; else { if(month==date) cout << "small discount"; else cout << "no discount"; } }

如果else裡面是直接接另一個判斷
可以直接把else的大括弧拿掉
將裡面的if接在else的後面
例如上一題可以寫成

int month, date; cin >> month >> date ; if(month==12) cout<"super discount"; else if(date%2==1) // 如果前一個不符合,但這個符合 cout<<"normal discount"; else if(month==date) // 如果前面兩個都不符合,但這個符合 cout<<"small discount"; else // 如果前面三個都不符合 cout<<"no discount";

雖然第二個else看似接在第二個if的後面
但因為第二個if也是接在第一個else的後面
因此第二個else所代表的是「第一個不符合、第二個也不符合」

【學生練習題】

組合技:多種條件判斷,保證只會符合其中一種

這其實是最簡單的條件判斷了
完全不需考慮同時有兩個條件符合的情形
怎麼寫都會對

【例題】

輸入一個數字n
若n等於1,則輸出"One"
若n等於2,則輸出"Two"
若n等於3,則輸出"Three"
若n等於4,則輸出"Four"

這題可以直接用獨立判斷寫成

int n; cin >> n; if(n==1) cout << "One" << endl; if(n==2) cout << "Two" << endl; if(n==3) cout << "Three" << endl; if(n==4) cout << "Four" << endl;

雖然他總共會判斷4次
但是可以確定它不可能同時符合兩個條件
所以就算沒有使用else也不需擔心

但若題目多加了這個條件

如果n不是1也不是2也不是3也不是4,則輸出"What the F?"

當然也可以直接在程式後面加上這個判斷

if(n!=1 && n!=2 && n!=3 && n!=4) { cout << "What the F?" << endl; }

但如果嫌麻煩,想直接用else來解決的話
若直接把else接在if(n==4)的後面,像是

if(n==1) cout << "One" << endl; if(n==2) cout << "Two" << endl; if(n==3) cout << "Three" << endl; if(n==4) cout << "Four" << endl; else cout << "What the X?" << endl;

那麼這個else代表的就會是「n不等於4」
所以就算n是1或2或3
這支程式也會印出"What the X?"

如果要讓else代表的是「上述通通不符合」
可以複習一下剛才學生補交作業那題的作法
這邊也直接提供範例程式

if(n==1) cout << "One" << endl; else if(n==2) cout << "Two" << endl; else if(n==3) cout << "Three" << endl; else if(n==4) cout << "Four" << endl; else cout << "What the X?" << endl;

只要讓每一次判斷都代表著「因為前面都不符合所以我才來判斷這個」
就可以使最後一個else代表「前面通通都不符合」

【學生練習題】

int n; cin>>n; if(n>=90){ } else if(n>=80){ } else if(n>=70){ } else if(n>=60){ } else{ }

上一章:四則運算
下一章:while迴圈
回目錄:國立科學園區實驗中學C++程式語言自學講義