if 條件(選擇結構)

2012/10/27 謝碧景(c)編製更新

學習目標

一、單向選擇

    • 當條件式為 true(真)時,就執行大括號內的成立敘述區塊,當條件式為 false(假)時,則跳開大括號成立敘述區塊,往下繼續執行。

    • 敘述區塊可為一列或多列,若僅一列敘述,則{}符號可省略;亦即{}內之敘述若為兩個(含)敘述以上,則{}符號不可省略

【格式一】【if...】

if (條件式)

{

成立敘述;

}

  • 單向選擇流程圖:

*註:條件式可搭配 比較運算子(<、>、<=、>=、==、!=) 或 邏輯運算子(&&、||、!) 使用。

◆範例1:會員密碼輸入判斷。(檔名:if-ex1.cpp)

執行2次結果:

*註:列9→密碼為12345,若輸入的密碼正確,就執行10-13列敘述,若密碼錯誤則直接跳至列14結束程式。

二、雙向選擇

    • 當條件式為 true(真)時,就執行成立敘述區塊,當條件式為 false(假)時,則執行不成立敘述區塊。

    • 敘述區塊可為一列或多列,若僅一列敘述,則{}符號可省略;亦即{}內之敘述若為兩個(含)敘述以上,則{}符號不可省略

    • 【格式二】【if...else...】

【格式二】【if...else...】

if (條件式)

{

成立敘述;

}

else

{

不成立敘述;

}

  • 雙向選擇流程圖:

*註:條件式可搭配 比較運算子(<、>、<=、>=、==、!=) 或 邏輯運算子(&&、||、!) 使用。

◆範例2:成績判斷,成績若在60分(含)以上,輸出“及格",低於60分,則輸出“不及格"。(檔名:if-ex2.cpp)

執行2次結果:

*註1:列9→輸入的成績若大於或等於60分以上,成立時執行列10-12敘述,輸出“及格";不成立時執行列14-16,輸出“不及格,請加油!"。

*註2:同例以【三元運算子】設計,程式如下:列9→sc成績變數若大於或等於60分以上,則輸出“及格",否則輸出“不及格,請加油!"。(檔名:if-ex2-2.cpp)

三、多向選擇

(一)格式:【if...else if...else】 (以三個條件式為例)

if (條件式1)

{程式區1;}

else if (條件式2)

{程式區2;}

else if (條件式3)

{程式區3;}

else

{程式區else;}

  • 多向選擇流程圖:

*註:條件式可搭配 比較運算子(<、>、<=、>=、==、!=) 或 邏輯運算子(&&、||、!) 使用。

◆範例3:若成績大於60(含)分印出「及格」,否則印出「不及格」;但成績需在0~100分,否則印出「輸入錯誤」。(檔名:if-ex3.cpp)

執行2次結果:

*註:敘述區塊內可為一列或多列敘述,若僅一列敘述,則 {} 符號可省略。

(二)格式:【switch...case】

switch...case 跟 if...else if...else 一樣,都是多向選擇的指令,但 運算式 及 case 值必須為整數字元,不能為浮點數。

switch (運算式 或 變數)

{

case 值1:

敘述1;

break;

case 值2:

敘述2;

break;

...........

default:

敘述;

}

  • 多向選擇流程圖:

註:

1.運算式 或 變數,當值等於 case 的值就執行相對應之敘述,每個 case 最後一行若加上 break,可讓程式跳離switch。若省略break程式不會跳離switch,而會繼續往下執行其他的case。當所有 case 值都不相等時,就執行 default後的敘述,亦可省略 default: 整個敘述區塊。case區塊若包含多個敘述,不需用大括號框住。

2.每一個case值必須不同,多個case值可連續在一起如下【範例4】case 2: case 3: case 4:相同於 case 2 ... 4:用三個點 ...表示範圍,注意_第一個值之後一定要空一格,不能直接打三個點,否則錯誤。

範例4:輸入月份(月份為一個正整數),判斷此月份在四季(春、夏、秋或冬)中的哪一季 ?(檔名:switch_if-ex4.cpp)【提示:春2~4月,夏5~7月,秋8~10月,冬11~12月以及1月

*註:列11-13變數m值為 2或 3或 4,都會顯示春季。相同於case 2 ... 4:

執行次結果:

§實作練習

題1:輸入一整數,並求其絕對值 。【流程圖:單向雙向參閱:比較運算子】方法2:數學函數方法3: 運用三元運算子。(檔名:if-1.cpp)

題2: 輸入一正整數,判斷為奇數(odd)或偶數(even)。【流程圖:單向雙向

【提示:% 運算子→求餘數;方法1→單向選擇,方法2→雙向選擇( 檔名:if-2.cpp)

    • 【進階題】輸入兩正整數,判斷此二數是否為一個奇數與一個偶數。【流程圖:雙向多向【提示:&&(且)、||(或)→邏輯運算子( 檔名:if-2-1.cpp)

題3: 輸入一個整數,請判斷這個整數為兩位數整數(請考慮10~99 與 -10~-99 兩種狀況)。【流程圖【提示:&&(且)、||(或)→邏輯運算子( 檔名:if-3.cpp)

    • 三角形的三邊長一定滿足任兩邊邊長和大於第三邊。輸入三根木條,長度分別為a、b、c時,這三根木條能不能拼成一個三角形。流程圖
      【提示:如果 ...(條件1) 且 ...(條件2) 且 ...(條件3),則這三根木條能組成三角形。條件參閱:邏輯運算子例:5 3 4(Yes)、3 5 3(Yes)、4 7 3(No)

題4:輸入一整數分數,判斷成績的分佈(80~100列為甲、60~79列為乙、0~59為丙、否則成績非0~100)。【流程圖】(檔名:if-4.cpp)

題5: 輸入身高及體重,求個人BMI值(輸出:請四捨五入至小數點下2位)?並判斷體位標準與否?

【提示1:BMI=體重/(身高*身高),身高以公尺(M)為單位,體重以公斤(KG)為單位 。】

BMI<18.5 ,請輸出“體重過輕”。

18.5≦BMI≦23 ,請輸出“標準體重”。

23<BMI<25 ,請輸出“體重過重”。

BMI≧25 ,請輸出“肥胖家族”。 【流程圖】( 檔名:if-5.cpp)

【提示2:引入#include <iomanip> 函式庫,可運用 cout<<fixed<<setprecision(n)<<變數; 較精確輸出結果。參閱:變數→資料型別


  • 【進階題】學校上課時間為 7:30 到 17:00 (24小時制)。輸入某時間,請判斷是上學時間(請輸出「At School」)或放學時間(請輸出「Off School」)。【摘自:d066:上學去吧!ZeroJudge

題6:輸入月份(月份為一個正整數),判斷此月份在四季(北半球→春、夏、秋、冬)中的哪一季 ?(檔名:if-6.cpp) 【提示:陽曆(即國曆)→春:3~5月,夏:6~8月,秋:9~11月,冬:12~2月流程圖

  • 【進階題】百貨周年折扣戰,購物金額折扣如下:

10,000(含)以上→打 9.5 折

20,000(含)以上→打 9 折

30,000(含)以上→打 8.5 折

40,000(含)以上→打 8 折

題7:輸入一個整數,請判斷此數是否為5或7的倍數,所有情況均需輸出。【流程圖】( 檔名:if-7.cpp)

題8:輸入三數,找出最大值與最小值。【流程圖】( 檔名:if-8.cpp) 參閱:三元運算子

題9:判斷平年及閏年。【提示:閏年的規則wiki→西元年份除以400 餘數為0,或者除以4 餘數 為0 且除以100 餘數不為0,則為閏年。】【流程圖→延伸:高中生程式解題系統 Online Judgea004:文文的求婚】( 檔名:if-9.cpp)

題10: 輸入一字元,判斷輸入的字元是英文小寫或大寫字母或數字。【方法1(參閱 ASCII符號表)】 ( 檔名:if-10.cpp)

if (ch>='a' && ch<='z') 可判斷字元是否介於 a~z 英文字母小寫

if (ch>='A' && ch<='Z') 可判斷字元是否介於 A~Z 英文字母大寫

if (ch>='0' && ch<='9') 可判斷字元是否介於 0~9 數字

【方法2(參閱:輸入字元函式)輸入字元函式 getchar()由鍵盤輸入字元,待按Enter鍵後系統只取第一個字元。getchar()函數,定義在stdio.h標頭檔】

題11:[找錢問題]小明用1000元買東西,求剩餘最多可找多少張500元、100元的鈔票及50、10、5、1元硬幣各幾個(以幣值最大者兌換)。 ( 檔名:if-11.cpp)