# ch5.1. 條件判斷(二): switch 條件判斷 >作者:柯筑苓、楊椀婷 >搭配[green judge解題系統](http://www.tcgs.tc.edu.tw:1218/) >Special thanks to [台中女中sagit老師](http://www.tcgs.tc.edu.tw/~sagit/index.htm) --- >下一章:[ch5.2. 條件判斷(二):條件運算子 ?= 條件判斷](https://hackmd.io/s/H1c2peEn7) >回到目錄:[2018 國立科學園區實驗中學高一資訊課程講義](https://hackmd.io/s/Hktk4-2Dm) --- ## <font color='darkblue'>前言</font> 在上一章中,我們學到,如果要判斷多重條件 常會使用的是巢狀 if 條件判斷 但如果我們沒有良好的縮排習慣 就會很難看出哪個 if 和哪個 else 是一對的 可能會導致程式邏輯出錯 例如: ```cpp= if(n>=60) if(n>=90) cout<<"GREAT"; else if(n>=80) cout<<"GOOD"; else cout<<"SOSO"; else cout<<"FAIL"; ``` 如果改成使用 switch 條件判斷的語法 就可以避免程式邏輯出錯 也能讓多選一的情況簡化 使程式簡潔好讀。 ## <font color='darkblue'>Switch 條件判斷語法</font> ``` switch(運算式) { case 選擇值1: //動作1 break; case 選擇值2: //動作2 break; case 選擇值3: //動作3 break; ... case 選擇值n: //動作n break; default: //動作0 } ``` 要注意的是 1. ==選擇值==(case後面接的東西)只能是==字元或整數常數==,如果是字元要加上單引號,例如 ```cpp= case 'A': ``` 2. 「break;」表示離開這個switch,接著執行 switch 大括弧後的指令 3. 「default」表示預設值,也就是當沒有這個switch 中沒有一個 case 的選擇值符合運算式的值時執行,「default」可有可沒有。 ## <font color='darkblue'>執行流程</font> 1. 判斷括弧中的運算式的運算結果 2. 根據運算的運算結果,檢查是否符合執行 case 後面的選擇值 3. 如果有某個 case 的選擇值符合,執行該 case 所包含的敘述,直到執行至 break 才離開這個 switch 條件判斷 4. 如果沒有一個 case 的選擇值符合,就會執行 default 之後所包含的敘述,執行完就會離開。但如果沒有定義default的敘述,則直接跳離switch 敘述 <font color="red">要注意該加上break的地方要加上</font>,以免程式邏輯出錯 ## <font color='darkblue'>範例 1 </font> <font color = "orange">【例題】</font> >輸入一個整數n, >如果是 1, 就印出「Mon」 >如果是 2, 就印出「Tue」 >如果是 3, 就印出「Wed」 >如果是 4, 就印出「Thu」 >如果是 5, 就印出「Fri」 >其餘的情況, 就印出「Wrong」 如果用巢狀 if 的架構 我們可以寫成這樣 ```cpp= if(n==1) cout<<"Mon"; else if(n==2) cout<<"Tue"; else if(n==3) cout<<"Wed"; else if(n==4) cout<<"Thu"; else if(n==5) cout<<"Fri"; else cout<<"Wrong"; ``` 這程式碼如果沒有良好的縮排,可能會看不懂 但如果寫成 switch 條件判斷的形式 ```cpp= switch(n) { case 1: cout<<"Mon"; break; case 2: cout<<"Tue" break; case 3: cout<<"Wed"; break; case 4: cout<<"Thu"; break; case 5: cout<<"Fri"; break; default: cout<<"Wrong"; } ``` 這個程式碼就比較清楚好懂了 當然要用甚麼方式寫,還是以自己了解、順手為主 ## <font color='darkblue'>延伸應用 </font> 執行流程的第 3 點有提到「執行至 break 才離開這個 switch 條件判斷」 這句話表示如果一個 case 要結束前沒有加上「break;」 就會把下面的幾個case的指令也執行了, 直到遇到某個 case 的「break;」或 switch 的右大括號 假如上面的範例1,如果每個case後都沒有加「break;」 ```cpp= switch(n) { case 1: cout<<"Mon"; case 2: cout<<"Tue" case 3: cout<<"Wed"; case 4: cout<<"Thu"; case 5: cout<<"Fri"; default: cout<<"Wrong"; } ``` 如果 n 的值為 4的時候 會印出 ``` ThuFriWrong ``` 因為沒有「break;」,程式不知道什麼時候該結束這個 case 所以就會把後面的case也都執行了 但這個特性也是我們可以利用的 <font color = "orange">【例題】</font> >輸入一個整數n,代表月份 >如果是1、2月,印出"寒假" >如果是3~6月,印出"下學期" >如果是7、8月,印出"暑假" >如果是9~12月。印出"上學期" 用switch的條件判斷,我們可以寫成 ```cpp= switch(n) { case 1: cout<<"寒假"; break; case 2: cout<<"寒假" break; case 3: cout<<"下學期"; break; case 4: cout<<"下學期"; break; case 5: cout<<"下學期"; break; case 6: cout<<"下學期"; break; case 7: cout<<"暑假"; break; case 8: cout<<"暑假"; break; case 9: cout<<"上學期"; break; case 10: cout<<"上學期"; break; case 11: cout<<"上學期"; break; case 12: cout<<"上學期"; break; default: cout<<"Wrong"; } ``` 雖然一目瞭然,但這個程式太長了! 但如果利用不寫「break;」的特性 我們可以把程式改寫成這樣 ```cpp= switch(n) { case 1: case 2: cout<<"寒假" break; case 3: case 4: case 5: case 6: cout<<"下學期"; break; case 7: case 8: cout<<"暑假"; break; case 9: case 10: case 11: case 12: cout<<"上學期"; break; default: cout<<"Wrong"; } ``` 程式看起來就更簡單了! ## <font color='darkblue'>補充閱讀 </font> <font color='blue'>Q: 也許有人會問,既然我都會用 if 寫條件判斷了,為何還要學寫 switch 的方式?</font> 因為兩者的<font color='red'>執行效率不同</font> 如果==純綷比對數字或字元==的話,建議<font color='red'>使用switch</font> 因為它只會在一開始的switch括號中取出變數值一次 然後將這個值與下面所設定的case比對, 但如果我們使用 if 的話,每次遇到條件式時,都要取出變數值 以上面的範例為例,如果使用if 的方式寫 ```cpp= if(n==1) cout<<"Mon"; else if(n==2) cout<<"Tue"; else if(n==3) cout<<"Wed"; else if(n==4) cout<<"Thu"; else if(n==5) cout<<"Fri"; else cout<<"Wrong"; ``` 當 n = 5 時,一共要取出 n 的值 5 次 但如果使用 switch 的方式寫 ```cpp= switch(n) { case 1: cout<<"Mon"; break; case 2: cout<<"Tue" break; case 3: cout<<"Wed"; break; case 4: cout<<"Thu"; break; case 5: cout<<"Fri"; break; default: cout<<"Wrong"; } ``` 只有在第一行的 switch (n) 取出 n 的值一次,執行效率較佳 但如果是 <font color='red'>複和條件 </font> (也就是同時要判斷兩個以上的條件,更簡單的說就是用到 `&&` 和 `||` 這時候就無法用switch 這個方法,而要用 if 的方式來寫了 --- >下一章:[ch5.2. 條件判斷(二):條件運算子 ?= 條件判斷](https://hackmd.io/s/H1c2peEn7) >回到目錄:[2018 國立科學園區實驗中學高一資訊課程講義](https://hackmd.io/s/Hktk4-2Dm)