--- GA: G-RZYLL0RZGV --- ###### tags: `大一程設` `東華大學` `東華大學資管系` `基本程式概念` `資管經驗分享` 程式設計師一輩子的工具 - 迴圈 for/while/do-while === [TOC] ## 前言 迴圈可以說是程式設計師在開發時不可或缺的工具,迴圈能夠讓我們反覆執行一段程式,直到條件失敗或是我們終止這個迴圈,讓他不再執行。 舉個實例,大家在玩遊戲時,除非你關閉遊戲,不然遊戲會一直執行,而一直執行這件事就是依靠迴圈。又或是今天你想算出 1 累加到 100 為多少,你也可以依靠迴圈幫你累加。 像這樣: ```cpp= int main(){ int ans = 0; for(int i = 1; i <= 100; i++){ ans += i; // 答案是 5050 } } ``` 當然腦筋動得快的同學會說,這麼麻煩,直接梯形公式不就可以了嗎?幹嘛還要用到這個迴圈? 確實,這是最正確的思維,可是今天若只單純地用梯形公式,我們的程式會被限縮,他就只能這做這件事,但今天一個迴圈可能會做的事不只這一件,甚至是要利用其中的值來為我們做其他的運算,比方說,程式執行加到第 30 次的時候要印出,今天天氣真好,那就不可能用梯形公式做出來。 ```cpp= int main(){ int low = 1, upper = 100; int ans = 0; ans = (low+upper)*(upper+low-1)/2; //也是 5050 //但能做的事非常限縮 for(int i = 1; i <= 100; i++){ ans += i; // 答案是 5050 if(i == 30) cout << "今天天氣真好\n"; if(i % 2 == 0) cout << "我是偶數次\n"; else cout << "我是奇數次\n"; } //用迴圈的話我們能夠額外做很多事 } ``` 這就是**為什麼要學習迴圈**,**因為程式能夠做擴充,而且能夠增加易讀性**,真的是非常方便的工具,請一定要學起來。 ## for `tips: 很早就說過,程式語言很多事情語法是固定的沒有為什麼, for 就是最好的例子` 語法格式:  ``` for(初值; 條件; 步進){ //迴圈細節 } ``` 解釋: * **初值** * 迴圈要從哪個值開始 * **條件** * 當初值經過迴圈一次次的改變,違反條件的時候迴圈結束,若滿足條件則繼續執行 * **步進** * 初值每次增加多少 範例: 就以剛才 1 累加到 100 為例,我們來了解迴圈的運作。 ```cpp= int main(){ int ans = 0; for(int i = 1; i <= 100; i++){ ans += i; // 答案是 5050 } } ``` * 初值為 1 * 條件為當 i <= 100 就會執行迴圈內容,若否則不會結束迴圈 * 步進 i++,i 值每次加 1 | 次數 | ans | i值 | | ---- |:----------------:|:---:| | 1 | ans = 0 + 1 | 1 | | 2 | ans = 1 + 2 | 2 | | 3 | ans = 3 + 3 | 3 | | 4 | ans = 6 + 4 | 4 | | 5 | ans = 10 + 5 | 5 | | 6 | ans = 15 + 6 | 6 | | 7 | ans = 21 + 7 | 7 | | 100 | ans = 4950 + 100 | 100 | 這邊可能會比較疑惑的點是 ans 的地方,ans 會被反覆的更改,而我們講過「=」代表的是指派,所以每次會把上一次的值指派給 ans,把舊的蓋過去。 ## while while 也是迴圈的一種,我們等等會來談談兩者的使用時機,我們先來看看 while 是什麼。 語法格式: ``` 初值 while(條件){ /*while 迴圈內容 * * * * */ 步進 } ``` 我們同樣用累加到 100 作為範例。 ```cpp= int main(){ //初值 int low = 1, upper = 100; int ans = 0; while(low <= 100){ // 條件 ans = ans + low; // 迴圈細節 low++; // 步進 } } ``` 而這裡的初值、條件、步進與 for 完全相同,所以其實我們可以得到一個小結論,只要能用 for 寫的迴圈,就一定可以用 while 寫,因為只有一些語法的不同而已。 **while的注意事項:** * 初值要在進入 while 迴圈前先被指派,**不能放在迴圈內** * **放在迴圈內的話每一次都會被更新為初值喔** * 通常步進一定會放在最後 (當然要看你的需求怎麼設計,也有可能不會滿足這件事) ## do-while do-while 與 while 只有一點小差別,我們先看 do-while 的語法。 語法格式: ``` 初值 do{ /* 迴圈細節 */ 步進 }while(條件); ``` **do-while 與 while 的差異在於,do-while 一定會執行迴圈一次,而 while 有可能不會執行,只要不滿足條件。** 所以在 do 的這個範圍內代表的就是 while 的程式細節,只是我一定會先執行一次。所以可以看你遇到的需求適合用哪一種迴圈就使用哪一種。 舉個小例子,因為疫情都需要實名制,若是兩人或以上同行可以選擇只留下一個人的資料,但你不能不留資料(就表示一定要執行一次),透過這樣的思維,我們可以寫下如下的程式。 ```cpp= int main(){ char keep = ' '; string name = ""; string the_phone_last_three_word = ""; cout << "請留下以下的資料哦" << endl; do{ cout << "你的大名?" << endl; cin >> name; cout << "請輸入您的手機末三碼" << endl; cin >> the_phone_last_three_word; cout << "還要繼續輸入嗎?\n" << "要繼續請輸入 y \n" << "若不用請輸入任意字元終止 \n"; cin >> keep; }while(keep == 'y'); cout << "程式結束"; return 0; } ``` 因為一定會執行一次,所以當程式執行時 8-17 行一定會執行一次,當 19 行的條件成立,再從 8 執行到 17 行,周而復始,直到條件不成立為止。 你會發現,用 do-while 有可能甚至不用初值,完全端看需求是什麼,相信這個例子能夠更幫大家了解 do-while 的內容。 ## for、while 的使用時機 兩個都是迴圈,能夠做到的事也相同,究竟差在哪裏呢? 就是使用時機,透過上面的例子我們可以發現,使用 for 的時候我們會先明訂我們會做幾次,但 while 卻不會,這也就是兩者的最大使用差異。 何時用 for ? * **當你知道明確的執行次數時** 何時用 while ? * **當不知道明確的執行次數時** > 結論:兩種你都要會 > [name=orange] ## 補充 - 遞增與遞減 `++`、`--` 相信在看迴圈時 `++`、`--` 這兩個運算子影響了不少人,雖然你明確的知道了他就是往上 +1,但其實它沒有想像中那麼簡單哦。 ### 放前與放後,兩者大不同 | 前置式 | 後置式 | |:--------------------:|:----------------------:| | 先做`++` `--` 再取值 | 先取值,再做 `++` `--` | | `++i` `--i`| `i++` `i--` | 相信這樣看一定看不懂,我們直接舉例, ```cpp= int main(){ int A = 5, B = 5; int x = A++; int y = ++B; cout << x << endl; // 5 cout << y << endl; // 6 cout << A << endl; // 6 cout << B << endl; // 6 } ``` 透過上面的表格,我們理解前置式跟後置式的差異,所以第三行後置式,先做取值再做 +1,所以我們先把 A 指派給變數 x,再把 A 做 +1 的動作,因此 x 會印出 5,A 會印出 6。 那前置式就同理可證。先做 +1 再指派。 ## 無窮迴圈 無窮迴圈常常發生在遊戲開發中,因為你總不希望玩遊戲玩到一半忽然關掉吧。 for 跟 while 都有無窮迴圈的樣子,學過 if-else,你們覺得應該會長什麼樣子呢? * for ``` for(;true;) { } 又或是 for(;;) { } ``` * while ``` while(true){ } ``` 這邊看的出來,當條件恆成立的時候,我們就會一直執行迴圈內的內容,但是無窮迴圈不可能不終止掉的,你玩遊戲也會有想結束的時候,如果今天一個無窮迴圈沒有設立終止條件,你的電腦是會當機的。所以接下來我們來談談下面的關鍵字。 ## 不要再執行了!迴圈終止工具 break、continue 在談到迴圈,不可避免一定要提這兩個保留字,因為他是能夠幫我們終止迴圈的好幫手,我們馬上來談談。 | break | continue | |:------------:|:----------------------------:| | 完全終止迴圈 | 終止這一次的迴圈,執行下一次 | 舉個例子 * break ```cpp= int main(){ int a = 0; while(true){ a++; cout << a << endl; if(a>10)break; } } ``` 我相信應該不難理解吧!當 a > 10的時候,這個迴圈就會結束。 * continue ```cpp= int main(){ int a = 0; while(true){ a++; if(a % 2 == 0) continue; cout << a << endl; if(a>100)break; } } ``` 這應該也不難理解,當 a 是偶數的時候會進入第一個 if 判斷式,因為遇到 continue,所以第 6 行開始都不執行了,直接從第 3 行再來執行,因為 while(true) 條件必成立,就再執行下一次。 > 可以把程式碼 run 在自己的電腦上看看結果是什麼 > 你覺得 a 最後一個是印出 99 還是 101 呢? > 答案可能不如你所想喔 > [name=orange]
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.