{%hackmd @hlc23/text_highlight %} # C++ 流程控制 --- ## 目錄 1. <span class=keyword>if / else / else if </span> 2. <span class=keyword>while</span> 3. <span class=keyword>for</span> 4. <span class=keyword>break</span> 5. <span class=keyword>continue</span> --- ## <span class=keyword>if</span> ---- 當條件(<span class=condition>condition</span>)成立(<span class=true>True</span>)時,執行裡面的程式碼 ```cpp= if (condition){ // do something } ``` 可以簡單理解成 <span class=keyword>如果</span><span class=condition>條件成立</span>, <span class=keyword>就</span>`___` ---- ## <span class=keyword>else</span> 需與 <span class=keyword>if</span> 一起使用 ```cpp= if (condition){ // do something } else{ // do another something } ``` 可以簡單理解成 <span class=keyword>如果</span><span class=condition>條件成立</span>, <span class=keyword>就</span>`___`, <span class=keyword>否則</span>`___` ---- ## <span class=keyword>else if</span> 需與 <span class=keyword>if</span> 一起使用 ```cpp= if (condition1){ // do something } else if (condition2){ // do another something } ``` 可以簡單理解成 <span class=keyword>如果</span><span class=condition>條件1成立</span>, <span class=keyword>就</span>`___` <span class=keyword>或是 如果</span><span class=condition>條件2成立</span>, <span class=keyword>就</span>`___` ---- 如果`{}`中的程式碼只有一句 則大括號可以省略 ---- <span class=sample>sample</span> ```cpp if (true) cout<<"hello world"; ``` ---- ### 所以<span class=condition>條件</span>要放什麼 ? --- 能生出布林值的東西 ---- 記得<span class=re_op>關係運算子</span>與<span class=l_op>邏輯運算子</span>嗎 那就對了 ---- ## 三個放一起 ---- ## <span class=sample>sample</span> ```cpp= int n = 4; if (n==1)cout<<"n=1"; else if (n==2)cout<<"n==2"; else if (n==3)cout<<"n==3" else cout<<"n != {1, 2, 3}"; ``` <span class=keyword>else if</span> 可以有無數個 但<span class=keyword>else</span>可有可無但只能有一個且只能放在最後 ---- ### 小結論 <span class=keyword>if</span> 語法結構: <span class=keyword>if</span> + $n$個 <span class=keyword>else if</span> + $0\sim1$個 <span class=keyword>else</span> ---- ### 小試身手 [ZJ a003. 兩光法師占卜術](https://zerojudge.tw/ShowProblem?problemid=a003) ---- #### [參考答案](/WjaXcEpBTbepEuOU5-jMuA) --- ## <span class=keyword>while</span> ---- 重複執行直到<span class=condition>條件</span>不成立 ```cpp= while (condition){ // do something } ``` 可以簡單理解成 只要<span class=condition>條件</span>成立就`___` ---- ## <span class=sample>sample</span> ```cpp= int n=0; while (n>3) cout<<"*"; ``` 請問以上的程式會輸出幾個 * ---- ## <span class=sample>sample</span> ```cpp= int n=0; while (n<3){ cout<<"*"; n++; } ``` 請問以上的程式會輸出幾個 * --- ## <span class=keyword>for</span> ---- <span class=keyword>for</span>迴圈的語法稍微複雜些 ```cpp= for (init; condition; increment){ // do something } ``` 1. for迴圈的開始會先進行<font color=#edbd3a>初始化(init)</font> 2. 接著判斷<span class=condition>條件(condition)</span>是否成立 2-1. 如果成立就執行區塊中的程式碼 2-2. 執行<font color=#a141e8>遞增(increment)</font> 2-3. 回到 2. 3. 若<span class=condition>條件(condition)</span>不成立 結束迴圈 ---- ![](https://i.imgur.com/NqWPHts.png) ---- ## <span class=sample>sample</span> ```cpp= for (int i=1; i<6; i++) cout<<i; ``` 依剛剛講的流程 思考看看輸出會是多少 ---- ### 輸出為 12345 ---- ## <font color=#edbd3a>初始化(init)</font>與<font color=#a141e8>遞增(increment)</font> --- <font color=#edbd3a>初始化</font>可用來定義只做用在迴圈中的變數 <font color=#a141e8>遞增</font>通常用來改變該變數的值但不一定是增加 這兩個可以不用存在 ---- ## <span class=sample>sample</span> ```cpp= int i=3; for ( ; i>0;) cout<<i--; ``` 有沒有很像前面講的某個語法 ---- 當<span class=keyword>for</span>迴圈沒有<font color=#edbd3a>初始化</font>與<font color=#a141e8>遞增</font>的部份時 可以當<span class=keyword>while</span>迴圈使用 ###### ~~怎麼不直接寫while就好~~ ---- ### 巢狀迴圈 簡單說就是在一個迴圈當中還有好幾層的迴圈 ```cpp= for (int i=0; i<10; i++){ for (int j=0; j<10; j++){ // do something } } ``` ---- ## <span class=sample>sample</span> ```cpp= for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) cout << "*"; cout << endl; } ``` --- 請推測輸出為何 ---- `***` `***` `***` `***` ---- ## 牛刀大試 [Zerojudge c013. 00488 - Triangle Wave](/P6P6O0iLT-qUAKvOBRBfbQ) ---- ### [c013. 00488 - Triangle Wave](/P6P6O0iLT-qUAKvOBRBfbQ) --- ## <span class=keyword>break</span> <span class=keyword>break</span>在英文中有++打破++ ++打斷++的意思 在C++中用於跳出一個迴圈 ---- ### <span class=sample>sample</span> ```cpp= int n=0; while (n<10){ cout<<n; if (n==2) break; n++; } ``` 試問輸出值為何 ---- ### 解答 --- 012 ---- ### 小試身手 [Zerojudge a004. 文文的求婚](https://zerojudge.tw/ShowProblem?problemid=a004) ---- ### [a004. 文文的求婚](/aidMGHcUTSeFjHzT2JAdfA) --- ## <span class=keyword>continue</span> <span class=keyword>continue</span>用於++直接進入下一次迴圈++ ---- ## <span class=sample>sample</span> ```cpp= for (int i=0; i<5; i++){ if (i==3) continue; cout<<i; } ``` --- output: 0124 ---- ## <span class=sample>sample</span> ```cpp= for (int i=10; i>0; i--){ if (i%4 == 0) continue; if (i == 3) break; cout<<i; } ``` --- 想想看輸出為何 ---- ### 解答 --- 109765 --- ### 補充: <span class=keyword>switch</span> ###### 因為我比較少用所以是補充 ---- <span class=keyword>switch</span> 用於判斷++單一條件++且多個分支的狀況 用於比對一個<span class=obj>物件</span>的值是否為特定值 ---- 語法 ```cpp= switch (expression) { case constant1: // do something break; // optional case constant2: // do something break; // optional ... default: // optional // do something } ``` 比對表達式(expression)的值是否為特定值(<span class=keyword>case</span>),若有其中一項<span class=keyword>case</span>符合, 則執行往下所有程式碼直到<span class=keyword>break</span>或是<span class=keyword>switch</span>結束 ---- <span class=keyword>switch</span> + $1\sim n$ 個 <span class=keyword>case</span> + $0\sim 1$個<span class=keyword>default</span> <span class=keyword>case</span>、<span class=keyword>default</span>中至少包含一個<span class=keyword>break</span> ---- ## <span class=sample>sample</span> --- ```cpp= int n=2; switch (n%3){ case 1: cout<<"n%3 = 1"; break; case 2: cout<<"n%3 = 2"; break; default: cout<<"n%3 = 0"; break; } ``` ---- ## <span class=sample>sample</span> ```cpp= int n = 1; switch (n){ case 0: cout<<0; case 1: cout<<1; case 2: cout<<2; default: cout<<"=="; } ``` --- 想想看輸出為何 ---- #### 12== ---- 試使用<span class=keyword>switch</span>再完成一次 [Zerojudge a003. 兩光法師占卜術](https://zerojudge.tw/ShowProblem?problemid=a003) ---- ```cpp= #include<iostream> using namespace std; signed main(){ int M, D; cin>>M>>D; switch ((M*2+D)%3){ case 0: cout<<"普通"; break; case 1: cout<<"吉"; break; case 2: cout<<"大吉"; break; } return 0; } ```
{"metaMigratedAt":"2023-06-17T22:59:53.521Z","metaMigratedFrom":"YAML","title":"C++(2) 流程控制","breaks":true,"contributors":"[{\"id\":\"8ffbb050-25e2-4983-835c-57980efb4f41\",\"add\":7537,\"del\":893}]"}
   changed 2 years ago 282 views