C語言-重複結構

簡介

程式在運算過程中,難免會需要做重複的事情,例如計數

在C語言裡面就提供兩種寫法讓程式可以做重複的事情

while迴圈

while迴圈的語法如下:

1
2
3
4
while(條件式){
陳述句1;
陳述句2;
}

在滿足條件式的情況下,迴圈就會不斷執行括號內的陳述句

通常用於停止條件不知道何時發生的情況下使用

例如下面這個程式,使用者什麼時候輸入小於0的數字是未知的,這時候就需要while迴圈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main(void) {
int num = 0;
printf("輸入數字(小於0則結束):");
scanf("%d", &num);
while(num > 0) {
printf("你輸入了:%d\n",num);
printf("輸入數字(小於等於0則結束):");
scanf("%d", &num);
}
return 0;
}

執行結果

輸入數字(小於0則結束):1
你輸入了:1
輸入數字(小於0則結束):0

如果在條件式內填入1,由於任何非零的數字都會判斷為True,就會形成無窮迴圈

無窮迴圈有很多應用,例如輪詢(Polling)

while迴圈分為前測式迴圈跟後測式迴圈,上面介紹的是前測式迴圈

接下來要介紹的語法是後測式迴圈

1
2
3
4
do{
陳述句1;
陳述句2;
}while(條件式);

後測式迴圈會先執行一次迴圈本體再作條件判斷,也就是說同樣條件下,結果可能不一樣

下面這個程式示範了前測式跟後測式的差別

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main(void) {
int num = 10;
while(num--){
printf("%d ",num);
}
printf("\n");
num = 10;
do{
printf("%d ",num);
}while(num--);
printf("\n");
return 0;
}

執行結果

9 8 7 6 5 4 3 2 1 0
10 9 8 7 6 5 4 3 2 1 0

前面switch有使用到break以外,break放在迴圈裡面就會使程式跳離迴圈

而除了break以外,還有continue語法

continue是忽略到目前為止之後的陳述句,直接回到條件式執行判斷

以下是範例程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
int main(void) {
int num = 0;
while(1){
printf("請輸入數字(輸入0結束):");
scanf("%d",&num);
if(num == 0)
break;
if(num % 2 == 0){
printf("%d是2的倍數\n",num);
continue;
}
else if(num % 3 ==0){
printf("%d是3的倍數\n",num);
continue;
}
printf("%d不是2跟3的倍數\n",num);
}
return 0;
}

執行結果

請輸入數字(輸入0結束):4
4是2的倍數
請輸入數字(輸入0結束):6
6是2的倍數
請輸入數字(輸入0結束):5
5不是2跟3的倍數
請輸入數字(輸入0結束):0

可以很清楚的看到輸入2跟3的倍數都會進入continue,然後直接回到迴圈的開頭

輸入0之後就離開迴圈了

for迴圈

for迴圈的語法如下:

1
2
3
4
for (初始條件; 條件式; 遞增式) {
陳述句一;
陳述句二;
}

初始條件執行完之後,每次執行完迴圈本體,檢查條件是否符合,若符合就執行遞增式,再繼續執行迴圈

讓我們看一個簡單的範例程式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main(void) {
int i;
for(i = 0; i < 10; i++)
printf("%d ", i);
printf("\n");
i = 0;
while(i<10){
printf("%d ", i);
i++;
}
printf("\n");
return 0;
}

執行結果

0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9

其實可以很明顯的看出來,for迴圈是把while迴圈裡面多個陳述句結合在一起而已

迴圈跟if-else一樣可以使用巢狀結構,下面這段程式碼是常見的九九乘法表

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

執行結果

1*1=1   1*2=2   1*3=3   1*4=4   1*5=5   1*6=6   1*7=7   1*8=8   1*9=9
2*1=2   2*2=4   2*3=6   2*4=8   2*5=10  2*6=12  2*7=14  2*8=16  2*9=18
3*1=3   3*2=6   3*3=9   3*4=12  3*5=15  3*6=18  3*7=21  3*8=24  3*9=27
4*1=4   4*2=8   4*3=12  4*4=16  4*5=20  4*6=24  4*7=28  4*8=32  4*9=36
5*1=5   5*2=10  5*3=15  5*4=20  5*5=25  5*6=30  5*7=35  5*8=40  5*9=45
6*1=6   6*2=12  6*3=18  6*4=24  6*5=30  6*6=36  6*7=42  6*8=48  6*9=54
7*1=7   7*2=14  7*3=21  7*4=28  7*5=35  7*6=42  7*7=49  7*8=56  7*9=63
8*1=8   8*2=16  8*3=24  8*4=32  8*5=40  8*6=48  8*7=56  8*8=64  8*9=72
9*1=9   9*2=18  9*3=27  9*4=36  9*5=45  9*6=54  9*7=63  9*8=72  9*9=81

參考

  1. C語言
  2. while 迴圈
  3. for 迴圈
  4. break、 continue、goto