# Ch4 if條件判斷 > 搭配[green judge解題系統](http://www.tcgs.tc.edu.tw:1218/) > Special thanks to [台中女中sagit老師](http://www.tcgs.tc.edu.tw/~sagit/index.htm) \<\(\_ \_\)\> ## > 上一章:[四則運算](https://hackmd.io/s/BJ0Awp09W) > 下一章:[while迴圈](https://hackmd.io/s/Sk3nDNsiZ) > 回目錄:[國立科學園區實驗中學C++程式語言自學講義](https://hackmd.io/s/B18yT_i5Z) ## <font color='darkblue'>條件與選擇</font>  條件選擇,是藉由判斷條件 以選擇接下來要不要執行某一段程式 條件選擇的用途非常廣泛 且非常需要**邏輯思考**能力 因此同學在解題的時候或許可以搭配紙筆打草稿來輔助思考 ## <font color='darkblue'>if 如果</font> <font color='darkorange'>【例題】</font> > 輸入一個整數n,如果n小於0,則印出"Negative!" **輸入數字n**以及**印出"Negative!"**,我們都學過了 若不需判斷n是否小於0的話,程式可以寫成 ```cpp= int n ; cin >> n; cout << "Negative!" << endl ; ``` 這樣的程式,不管輸入什麼樣的數字,都會印出"Negative!" 但現在希望只有在n<0的情況下才印出"Negative!" 這時就會需要使用到`if` ### 使用`if`的方法 在`if`後面接一個**小括弧**,並且將**要判斷的事情**放入小括弧內 後面再接一個**大括弧**,裡面放入**條件符合時才要執行的程式** 例如 ```cpp=3 if(n<0) { cout << "Negative!" << endl ; } ``` 這樣一來,只有n<0的時候,才會執行`cout << "Negative!" << endl ;`這個動作 ### 判斷式 除了上面舉例的**小於**之外 數字之間總共有6種可以判斷的關係 使用的符號如下 | 意義 | 小於 |大於|小於或等於|大於或等於|等於|不等於| | -------- | -------- | -------- | -------- | -------- | -------- | -------- | | 符號 | < |>|<=|>=|==|!=| 判斷符號的兩側,可以放常數、變數、運算式 例如 `n == 10` `a < b` `50 >= a` `a+b+c != n+10` ## <font color='darkblue'>else 否則</font> <font color='darkorange'>【例題】</font> > 輸入一個整數n,如果n小於0,則印出"Negative!";否則就印出"Natural!" 我們已經知道,如果在**符合「n小於0」這個條件**時要印出"Negative!" 程式可以寫成: ```cpp= int n ; cin >> n ; if(n<0) { cout << "Negative!" << endl; } ``` 如果還想要在**不符合「n小於0」這個條件**時印出"Natural!" 就會需要用到`else`(否則) ### 使用`else`的方法 else出現的時機就是 **不符合**某個判斷條件時才要執行的程式 所以它一定要接在某個`if`後面 `if`的區塊寫完後 直接接上一個`else` 後面再接一個**大括弧**,裡面放入**條件不符合時才要執行的程式** 請記得`if`的區塊和`else`的區塊之間絕不能放任何程式 (除了無意義的空行或空白以外) 剛才判斷負數或自然數的例題 正確的程式可以寫成 ```cpp= int n ; cin >> n ; if(n<0) { cout << "Negative!" << endl; } else { cout << "Natural!" << endl; } ``` 上述這邊的`else`,指的就是「不符合`n<0`」 無論如何,`else`一定要接在`if`的敘述後面 且只要`else`出現,指的就是接在它前面的`if`不發生的情況 > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a011: 及格 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a011) > - [ ] [Green Judge a012: 奇數與偶數 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a012) ## <font color='darkblue'>同時判斷多個條件</font> <font color='darkorange'>【例題】</font> > 輸入一個整數n,如果n大於0且n小於100,則印出"Good!" 用數學式子來表達的話會寫成**if(0<n<100)** 但程式必須將**n>0**和**n<100**分成兩次判斷 這兩個條件若要**同時符合**,可以用**而且**的符號來連接 |意義|而且(and)|或是(or)| | -------- | -------- | -------- | |符號|&&|\|\|| 利用**而且**和**或是**的符號,可以將兩個以上的判斷式連接起來 例如 `n>0 && n<100` 代表「n大於0,而且n又小於100」才算符合 `n<0 || n>50 || n==30` 代表「n小於0,或是n大於50,或是n等於30」都算符合 **而且**和**或是**同時使用時 也可以使用括弧來表達判斷的先後順序 例如 `(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時**,符合 同學可以自行思考看看 如果判斷的先後順序不一樣了,符合條件的狀況有哪裡不一樣 剛才例題中的程式可以寫成 ```cpp= int n; if(n>0 && n<100) { cout << "Good!" << endl; } ``` > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a013: 成績分佈 ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a013) ## <font color='darkblue'>懶人寫法:省略大括弧</font> 如果大括弧內的程式只有一行 就可以將大括弧省略 例如 ```cpp= if(n>0 && n<100) { cout << "Good!" << endl; } ``` 可以寫成 ```cpp= if(n>0 && n<100) cout << "Good!" << endl; ``` 或是 ```cpp= if(n>0 && n<100) cout << "Good!" << endl; ``` 換不換行、縮不縮排都可以 謹記,唯有大括弧內只有一行程式時,才可以省略 ## <font color='darkblue'>組合技:多個相互獨立的條件判斷</font> <font color='darkorange'>【例題】</font> > 期中考有3道題目 > 正確答案分別是t1、t2、t3 > 學生的答案分別是s1、s2、s3 > 第一題答對可以得30分 > 第二題答對可以得30分, > 第三題答對可以得40分 > 輸入正確答案與學生的答案,請問學生總共可以得幾分? 在這個例子中,總共有三個要判斷的條件 且三次判斷都是獨立的,互不影響 因此只要依序把if寫上去就好 以下為範例程式 ```cpp= 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; ``` 隨著學到的東西變多,程式也變得愈來愈長了 寫出自己看得順眼的排版也變得愈來愈重要 > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a020: 刮刮樂兌獎(二) ](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a020) <br> <font color='darkorange'>【例題】</font> > 輸入三個數字,請輸出最大的數字 範例程式如下 ```cpp= 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,完全無所謂 > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a014: 貨比三家](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a014) ## <font color='darkblue'>組合技:多個互相關聯的條件判斷</font> <font color='darkorange'>【例題】</font> > 如果今天出太陽,那就去菜市場;否則就不去 > 去了菜市場以後,如果蘋果的價格低於50,那就買蘋果;否則就不買 > 題目輸入sun和apple > 若sun為1,代表出太陽,否則代表沒有出太陽 > apple代表蘋果的價格 在本案例中,「判斷蘋果要不要買」這件事只有在「出太陽」的情況下才要做,因此可以使用「if包if」的寫法 例如 ```cpp= 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; ``` > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a016: 閏年判斷](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a016) 閏年判斷的模板 ```cpp= 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{ } ``` <font color='darkorange'>【例題】</font> >六福村小人國實施聖誕方案,如果出生的月份是12月,則可以得到「超級優惠」,如果出生的日期是奇數,可以得到「一般優惠」,如果出生的月份等於出生的日期,可以得到「小優惠」 >優惠不能重複使用,只能選最優惠的 >輸入月分和日期,請輸出他可以使用的最好優惠 ```cpp= 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的後面 例如上一題可以寫成 ```cpp= 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所代表的是「第一個不符合、第二個也不符合」 > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a019: 刮刮樂兌獎(一)](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a019) ## <font color='darkblue'>組合技:多種條件判斷,保證只會符合其中一種</font> 這其實是最簡單的條件判斷了 完全不需考慮同時有兩個條件符合的情形 怎麼寫都會對 <font color='darkorange'>【例題】</font> > 輸入一個數字n > 若n等於1,則輸出"One" > 若n等於2,則輸出"Two" > 若n等於3,則輸出"Three" > 若n等於4,則輸出"Four" 這題可以直接用獨立判斷寫成 ```cpp= 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?" 當然也可以直接在程式後面加上這個判斷 ```cpp= if(n!=1 && n!=2 && n!=3 && n!=4) { cout << "What the F?" << endl; } ``` 但如果嫌麻煩,想直接用else來解決的話 若直接把else接在if(n==4)的後面,像是 ```cpp= 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代表的是「上述通通不符合」 可以複習一下剛才**學生補交作業**那題的作法 這邊也直接提供範例程式 ```cpp= 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代表「前面通通都不符合」 > <font color="darkgreen"> 【學生練習題】</font> > - [ ] [Green Judge a017: 成績等第](http://www.tcgs.tc.edu.tw:1218/ShowProblem?problemid=a017) ```cpp= int n; cin>>n; if(n>=90){ } else if(n>=80){ } else if(n>=70){ } else if(n>=60){ } else{ } ``` ## > 上一章:[四則運算](https://hackmd.io/s/BJ0Awp09W) > 下一章:[while迴圈](https://hackmd.io/s/Sk3nDNsiZ) > 回目錄:[國立科學園區實驗中學C++程式語言自學講義](https://hackmd.io/s/B18yT_i5Z)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up