--- 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 就是最好的例子` 語法格式: ![](https://i.imgur.com/RVFvSye.png) ``` 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]