{%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>不成立 結束迴圈
----

----
## <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}]"}