---
# System prepended metadata

title: loop 迴圈
tags: [程設班講義]

---

# 簡介
迴圈的目的是進行<font color="#EB6E41">大量的重複運算</font>，符合條件便會<font color="#EB6E41">執行其內容直至條件不符合</font>。

# for迴圈
## 流程圖
<center>
<img src="https://i.imgur.com/oFlGJ0z.png" width = "450px"/>
</center>

## 語法
```cpp=
for(A初始運算式; B條件式; C控制運算式){
    D迴圈內程式;
}
```

### A初始運算式
進入迴圈後第一個執行的程式，只會執行一次，在這可執行任何命令，通常是設定一個變數。

::: warning
通常我們初始變數都是設定為`0`，原因是要配合後續`Array`的課程，除非是特殊的使用條件才會使用其他數字。(ex.九九乘法表)
:::

### B條件式
在執行完`A`或是`C`後都會進行的一次，<font color="#EB6E41">判斷判斷式不限制，只要可以回傳`true`或是`false`就好</font>，判斷為`true`就會繼續執行`D`，反之為`false`就結束迴圈，再進行迴圈後的程式碼，<font color="#EB6E41">通常是對`A`內設定的判斷操作。</font>

### C控制運算
每當運行完`D`就會執行，<font color="#EB6E41">通常是對`A`內設定的變數進行操作</font>。

### D迴圈內運算式
每當`B`條件式為`true`時就會執行。

## 運用
```cpp=
int n = 10,sum = 0;
for(int i = 1; i <= n; i++){
    sum += i; 
}
cout << sum << '\n';  //輸出55也就是1加到10的和。
```
:::info
:::spoiler 上述程式的執行過程。
int n = 10, sum = 0;
int i = 1;

i <= n  (現在i為1) --> sum += i  (現在sum為1) --> i++  (現在i為2)。

i <= n  (現在i為2) --> sum += i  (現在sum為3) --> i++  (現在i為3)。

i <= n  (現在i為3) --> sum += i  (現在sum為6) --> i++  (現在i為4)。

i <= n  (現在i為4) --> sum += i  (現在sum為10) --> i++  (現在i為5)。

i <= n  (現在i為5) --> sum += i  (現在sum為15) --> i++  (現在i為6)。

i <= n  (現在i為6) --> sum += i  (現在sum為21) --> i++  (現在i為7)。

i <= n  (現在i為7) --> sum += i  (現在sum為28) --> i++  (現在i為8)。

i <= n  (現在i為8) --> sum += i  (現在sum為36) --> i++  (現在i為9)。

i <= n  (現在i為9) --> sum += i  (現在sum為45) --> i++  (現在i為10)。

i <= n  (現在i為10) --> sum += i  (現在sum為55) --> i++  (現在i為11)。

cout << sum = 55
:::

## 特殊用法
### 省略初始值
說是省略，其實是把初始值移出去。
```cpp=
int sum = 0;
int i = 1 ;
for(; i <= 13 ; i++) {
    sum += i;
}
```
### 省略判斷式
由於沒有判斷式，`sum` 會一直累加，此為無限迴圈。
```cpp=
int sum = 0;
for(int i = 1 ; ; i++) {
    sum += i;
}
```

### 省略變化量
由於沒有變化量，`i` 的值不變，`i <= 13` 永遠成立，`sum` 會一直累加，此為無限迴圈。
```cpp=
int sum = 0;
for(int i = 1 ; i <= 13 ; ) {
    sum += i;
}
```

### 省略全部
跟上述規則一樣，此為無限迴圈。
```cpp=
int sum = 0 ;
for(;;){
   sum ++
}
```

# while迴圈
## 流程圖
<center>
<img src="https://i.imgur.com/3XfCidV.png" width = "450px"/>
</center>

## 語法
```cpp=
while(A條件式){
    B迴圈內程式
}
```


### A條件式
當條件式為`true`時，就會進入迴圈，反之為`false`時就會離開迴圈，再進行迴圈後的程式碼。判斷式也是不限制，只要可以回傳`true`或是`false`就好。

### B迴圈內程式
當條件式為`true`後，進入迴圈，當迴圈內的程式執行完成後，就會再回到`A`條件式進行判斷。

## 運用
::: warning
`while`和`for`概念是一樣的。
```cpp=
int i = 0;
while(i < 10){
    cout << i << '\n';
    i++;
}
```
```cpp=
for(int i = 0; i < 10 ; i++){
    cout << i << '\n';
}
```
這兩個意思是一樣的，但這種情況我們通常都用for。
:::

有時可以看到題目寫本題<font color="#EB6E41">有t筆測資時，就可以用`while`</font>。


```cpp=
int t;
cin >> t;
while(t--){  //當t減到0時while就會結束。
    //解題code
}
```
也有可能看到題目會寫<font color="#EB6E41">多筆輸入，這時也可以用`while`</font>。
```cpp=
while(cin >> n){  //當程式執行成功也會回傳true。
    //解題code
}
```


:::info
:::spoiler 上述程式的執行過程。
int n = 10, sum = 0;
int i = 1;

i <= n;  (現在i為1) --> sum += i; --> i++  (現在i為2)。

i <= n;  (現在i為2) --> sum += i; --> i++  (現在i為3)。

i <= n;  (現在i為3) --> sum += i; --> i++  (現在i為4)。

i <= n;  (現在i為4) --> sum += i; --> i++  (現在i為5)。

i <= n;  (現在i為5) --> sum += i; --> i++  (現在i為6)。

i <= n;  (現在i為6) --> sum += i; --> i++  (現在i為7)。

i <= n;  (現在i為7) --> sum += i; --> i++  (現在i為8)。

i <= n;  (現在i為8) --> sum += i; --> i++  (現在i為9)。

i <= n;  (現在i為9) --> sum += i; --> i++  (現在i為10)。

i <= n;  (現在i為10) --> sum += i; --> i++ (現在i為11)。

cout << sum = 55
:::

# continue&break
## continue
當執行到此程式，就回到最上面的迴圈，不會執行接下來的迴圈內程式。

例如for就是回到`C`控制運算式，也就是我們平常寫`i++`的地方，而`while`就是回到`A`條件式。
```cpp=
#include<iostream>
using namespace std;
int main(){
    for(int i = 1; i <= 10; i++){
        if(i % 2 == 0){
            continue;    //如果判斷i是偶數，就回到i++，不執行cout。
        }
        cout << i << '\n';
    }
}
```
## break
當執行到此程式，就會離開迴圈直接執行迴圈後的下一行程式。

# 例題
###### 有什麼題目沒提到或有新增的煩請留言告知。
[a011: 加減乘除](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a011)

[a004: 經濟大恐荒](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a004)

[a005: 獨角蟲進化計算器](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a005)

[a025: 文文的求婚--續集 (n 行版)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a025)

[a026: 文文的求婚--續集 (0 尾版)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a026)

[a027: 文文的求婚--續集 (EOF 版)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a027)

[a028: 文文的求婚--續集 (Case 版)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a028)

[a030: 電腦教室](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a030)

[a036: 我也愛偶數](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a036)

[a037: 我也愛偶數 (swap 版)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a037)

[a038: 我不說髒話](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a038)

[a040: 文文的求婚 (三)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a040)

[a059: pB 升職蛤蠣](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a059)

[a128: 斗漏! 蒙斯塔卡都!](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a128)

[a142: 肥宅快樂水...再...再一口](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a142)

[a134: 判斷質數](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a134)

[a163: 健康檢查前的檢查](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a163)

[a175: 水仙花數](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a175)

[a180: 複習複習複習考](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a180)

[a191: Rex 看牙1](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a191)

[a192: Rex 看牙2](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a192)

[a193: Rex 看牙3](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a193)

[a198: 可以出題啦!](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a198)

[a200: 排列組合符號計算練習](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a200)

[a207: 倒三角形](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a207)

[a256: FAIRY WOOBANG](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a256)

[a363: 同學，再借我一張衛生紙。](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a363)

[a365: 客家主管](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a365)

[a379: 端盤子](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a379)

[a382: 安安採南瓜](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a382)

[a396: Cerulean Crescent's Debut](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a396)

[a503: 顯示1到N的連加過程及結果](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a503)

[a540: Hello World!](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a540)

[a542: Big Chocolate](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a542)

[a558: 佛祖絕對不輸的宗教之戰 1](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a558)

[a616: 平方和](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a616)

[a692: H. 空間向量](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a692)

[a839: 排球考試](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a839)

[a844: 高歌離席](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a844)

[a881: Only WAH purposely](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a881)

[a906: BanG Dream ! It's MyGO!!!!!](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a906)

[a918: 別再亂取變數了yuriyuriyuri(3)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=a918)

[b150: 六芒星](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=b150)

[b151. 在程設班締造出美好的回憶 !(easy version)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=b151)

[b152: 我要成為幾何大師 !](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=b152)

[b159: 超躁的復旦工人!](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=b159)

[b160: 趕作業](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=b160)

[b170: Pote Liu 冒險外傳 (1)](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=b170)

- [b173: 寶可夢賽跑](https://dandanjudge.fdhs.tyc.edu.tw/ShowProblem?problemid=b173)

###### 都看到這了難道不按個愛心支持一下嗎?
