C語言簡介:迴圈

本教學面向新手,故教學內容多為基礎知識,倘若您希望學習進階內容,本文並不符合您的需求。

本文為C語言簡介系列第三篇文章,前一篇文章為C語言簡介:條件判斷

傳說中,薛西弗斯被處罰永遠把一顆石頭推上山頂,但是每次石頭到達頂部後又會滾回山腳,所以薛西弗斯必須再次將石頭推回山頂,但是石頭又會滾回山腳…
薛西弗斯必須重複做這件枯燥乏味的事直到天荒地老…
要是薛西弗斯有學過迴圈(loop)就不一樣了 當我們遇到極為相似、要重複執行的內容時,就可以不用像薛西弗斯一樣,重複寫一模一樣的程式、一直做一模一樣的事了!

for迴圈

先來簡單介紹一下 for 的語法

for (<初始值>; <條件式>; <遞增、遞減等>) {
<若滿足條件要執行的程式>
}

印出1到10之間所有整數

如果我們要印出1到10之間的所有整數,我們可以用 for 迴圈來做到。
以下提供範例程式。

for_one_to_ten.c
1
2
3
4
5
6
7
#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
printf("%d\n", i);
}
return 0;
}

如果在 for 迴圈外使用 printf("%d", i),其值會是多少呢?



沒錯!會報錯!為什麼呢?因為這裡的 i 的生命週期只限於迴圈內部!當離開了 for 迴圈,i 就已經是不可使用的變數了喔。這是所謂的區域變數 (Local Variable)

試試看

請試印出從11到20之間所有整數。

雙層for迴圈

雙層for迴圈可以有許多應用,例如當我們要列印出一張九九乘法表,因為有2個變數(被乘數乘數),最直覺的做法是用雙層 for 迴圈控制2個變數。
九九乘法表參考解答如下

multiplication_table.c
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= 9; j++) {
printf("%d * %d = %d\t", j, i, i * j);
}
printf("\n");
}
return 0;
}

註:第5行的 \t 的作用在C語言簡介:基本輸入輸出有說明。

試試看

將第五行的

5
printf("%d * %d = %d\t", j, i, i * j);

ij 的順序顛倒過來,輸出結果會長怎樣?

試試看

利用雙層 for 迴圈結構,在螢幕上印出如下所示的星星三角形

*
**
***
****
*****

while迴圈

以下是 while 迴圈的語法

while (<條件>) {
<要執行的程式>
}

直到EOF

如果有在寫online judge的題目的話應該有看過一句話叫做

輸入直到EOF

那什麼是輸入直到EOF?
EOF (End of File) 表示檔案結尾,在許多不確定輸入資料數的題型中可以看到。
在C語言,我們會利用

int n;
while (scanf("%d", &n) != EOF) {
// do something
}

來實作。他的意思是只要沒有碰到EOF,我就持續讀這個整數變數 n 並執行迴圈內的程式。

當我寫出

while (scanf("%d", &n) != EOF)

就表示只要我的 scanf() 函數回傳的不是 EOF,我就一直執行迴圈內的內容。

do-while迴圈

do-while迴圈長得跟while迴圈很像,語法如下:

do {
<要執行的程式>
} while(<條件>);

注意!別忘了分號!
do-while 迴圈跟 while 迴圈最大的差別是,do-while 迴圈會先執行程式才去檢查條件來決定是否再執行一次迴圈。

回到薛西弗斯

上面我們提到薛西弗斯必須永無止境的推石頭,如果從程式的角度來看,我想這更像是無限迴圈的行為(?
而我們可以不必讓我們的程式重複同一件事直到天荒地老!只要設定正確的條件式,就能事半功倍,我們不僅不用自己重複做枯燥乏味的相同的動作,也不用擔心迴圈會無限執行到世界毀滅的那天!

結語

以上就是C語言迴圈簡介。
倘內容有誤或仍有疑問,歡迎在下方留言區留言!