###### tags: `FoShiShi` # 迴圈 ## What 用迴圈的結構 **重複去做特定的事情,直到停止事件成立** :::success 就像生活中要**重複一直做的事情** 例: 一直呼吸直到死亡 一直滑手機直到睡著 ::: --- ## When 當要對一個**幾乎相同的事情**做**多次的執行**時 或者搭配[**`陣列`**](https://chrislaiisme.github.io/FoShiShi/array)做使用 你不會想要寫這種東西的: ```cpp= int a = 0; a += 1; a += 2; a += 3; a += 4; a += 5; a += 6; a += 7; a += 8; a += 9; a += 10; ... ``` 所以這種時候我們需要迴圈 --- ## How ### 迴圈寫法 #### for 語法如下: ```cpp= for(A; B; C) { D; } ``` 順序: 1. A:**初始化**,可以在這裡**宣告東西、將東西設定初始值** 2. B:**條件式**,使迴圈**一直執行直到此條件不滿足** 3. D:**要做的事**,就是要做的事,**在迴圈停止前將重複執行** 4. C:**漸進式**,可以**對對條件有差的變數做操作,讓迴圈能夠終止** 5. 回到 2. 例: ```cpp= for(int i = 0; i < 5; i ++ ) { cout << i << " "; } // 輸出:0 1 2 3 4 ``` --- #### while 語法如下: ```cpp= while(A) { B; } ``` 順序: 1. A:**條件式**,使迴圈**一直執行直到此條件不滿足** 2. B:**要做的事**,就是要做的事,**在迴圈停止前將重複執行** 3. 回到 1. 例: ```cpp= int a = 5; while(a > 0) { cout << a << " "; a -- ; } // 輸出:5 4 3 2 1 ``` --- #### do while 語法跟`while`有部分一樣 語法如下: ```cpp= do { B; } while(A) ``` 跟`while`不一樣的地方在於,`do while`會先做一次操作才去判斷是否執行下一次 順序: 1. B:**要做的事**,就是要做的事,**在迴圈停止前將重複執行** 2. A:**條件式**,使迴圈**一直執行直到此條件不滿足** 3. 回到 1. 例: ```cpp= int a = 5; do { cout << a << " "; a -- ; } while(a > 10) // 輸出:5 ``` ---- ### 迴圈內操作 #### break 跳出**一層**迴圈 例: ```cpp= for(int i = 0; i < 5; i ++ ) { if(i == 3) { break; } cout << i << " "; } // 在 i == 3 時跳出for迴圈 // 輸出:0 1 2 ``` --- #### continue **直接執行下一次迴圈** 例: ```cpp= for(int i = 0; i < 5; i ++ ) { if(i == 3) { continue; } cout << i << " "; } // 在 i == 3 時直接執行下次for迴圈 // 輸出:0 1 2 4 5 ``` :::warning `break`跟`continue`都是對`迴圈`做操作, 必須**至少包在一層迴圈裡**才能執行 ::: --- ### 巢狀迴圈 就是在迴圈中包迴圈 :::info 因為`C++`中的程式碼是由上執行到下 所以越裡面的迴圈會在執行時跑過越多次 ::: 例: ```cpp= for(int i = 0; i < 2; i ++ ) { for(int j = 0; j < 2; j ++ ) { cout << i * 10 + j << " "; } } // 輸出:0 1 10 11 ``` 其中的引數也可以互相引響 很神奇(而且很雜) 例: ```cpp= for(int i = 0; i < 5; i ++ ) { for(int j = 1; j < 5; j ++ , i -- ) { for(int k = 5; k > 0; k -- , j += 2) { if(k > 5) j -- ; if(j % 2 == 1) i += 2; if(i % 2 == 1) j ++ ; cout << i * 5 + j - k << " "; } } } // 輸出:6 19 32 45 58 ``` --- ## 實際應用 ### 題目1 輸入一數`N` 請輸出`1 ~ N`中所有`< 25`的數字 :::spoiler solution 用`for`,如果`i == 25`就`break` ```cpp= #include<iostream> using namespace std; int main() { int N; cin >> N; for(LL i = 1; i <= N; i ++ ) { if(i == 25) { break; } cout << i << " "; } cout << endl; } ``` 或也可以直接判斷`i`是否`< 25` ```cpp= #include<iostream> using namespace std; int main() { int N; cin >> N; for(LL i = 1; i <= N && i < 25; i ++ ) { cout << i << " "; } cout << endl; } ``` ::: ### 題目2 輸入一數`N` 請輸出`1 ~ N`中所有**個位數字不是`3`** 的數字 :::spoiler solution 用`for`,如果`i % 10 == 3`就`continue` ```cpp= #include<iostream> using namespace std; int main() { int N; cin >> N; for(LL i = 1; i <= N; i ++ ) { if(i % 10 == 3) continue; cout << i << " "; } cout << endl; } ``` :::
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up