搭配green judge解題系統
Special thanks to 台中女中sagit老師 <(_ _)>
上一章:四則運算
下一章:while迴圈
回目錄:國立科學園區實驗中學C++程式語言自學講義
條件選擇,是藉由判斷條件
以選擇接下來要不要執行某一段程式
條件選擇的用途非常廣泛
且非常需要邏輯思考能力
因此同學在解題的時候或許可以搭配紙筆打草稿來輔助思考
【例題】
輸入一個整數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
【例題】
輸入一個整數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>0和n<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++程式語言自學講義