迴圈敘述 - while
一、while 敘述的語法
有時候,我們需要讓電腦重複執行某些指令,直到某個條件成立為止,這種語法稱為迴圈敘述。在 C 語言中的迴圈敘述有三種,分別是 for、while、do-while,我們先來看看 while 的語法:
while (條件式) 指令一;
上面的語法是當條件式成立時,程式會重複執行指令一,每執行完指令一之後,便再檢查一次該條件式是否成立,如果成立,則繼續執行迴圈內的指令(也就是指令一),而如果條件式不成立了,則離開這個迴圈,執行下一行指令。上面的語法,如果我們希望條件成立的時候能執行一堆指令,可以用一對大括號把它們包起來,如:
while (條件式) {
指令一;
指令二;
指令三;
}
而在迴圈敘述中,我們可以使用 break 指令讓它強制離開迴圈,或是用 continue 指令來忽略下面的指令而繼續下一次的迴圈,例如:
a = ( rand()%100 ) + 1;
b = 0;
while ( b!=a ) {
scanf("%d", &b);
if( b > 100 ) continue;
if( b <= 0 ) break;
if( b > a ) printf("Too big!\n");
if( b < a ) printf("Too small!\n");
}
if( b==a ) printf("Bingo!\n");
else printf("Give up!!\n");
上面的例子,當我們輸入一個大於 100 的數字時,程式遇到 continue,便直接跳回 while 的第一行,而當我們輸入一個小於等於 0 的數字時,程式執行到 break,便強制跳出這個迴圈,而跳到迴圈的下一行 if 的地方。
二、猜數字遊戲(改良版)
上一頁我們寫了一個可以猜三次的猜數字遊戲,接下來,我們利用 while 迴圈將這個程式改良成可以一直猜到對為止,整個程式如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int a, b;
srand(time(NULL));
a=(rand()%100)+1;
b=0;
while(a!=b) {
printf("1 - 100 =>");
scanf("%d", &b);
if(b>a) printf("Too Big!\n");
if(b<a) printf("Too Small!\n");
}
printf("Bingo!\n");
}
上面在 while 的前一行我們寫 b=0 是因為程式一開始 b 是一個亂數,為了避免 b 的值剛好和 a 相等,所以我們把它設定成 0。這個程式之前要猜三次,便要寫三次的程式碼,現在改用 while 之後,便只要寫一次的程式碼,整個程式變得比較短,而且也比較容易看得懂。接下來,我們再將這個程式改良,讓它可以顯示目前猜的次數,因此我們要多一個變數 c 來記錄目前猜到第幾次,下面的程式針對修改的部分改用黃色來表示:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main()
{
int a, b, c;
srand(time(NULL));
a=(rand()%100)+1;
b=0;
c=0;
while(a!=b) {
c=c+1;
printf("%d. 1 - 100 =>", c);
scanf("%d", &b);
if(b>a) printf("Too Big!\n");
if(b<a) printf("Too Small!\n");
}
printf("Bingo! You Spend %d times.\n", c);
}
三、練習:
四、補充 ─ do-while 敘述的語法
接下來我們看到 do-while 的語法:
do {
指令一;
指令二;
指令三;
} while (條件式);
我們可以看到,其實 while 和 do-while 的語法非常像,唯一的不同是, while 是先檢查條件是否成立,成立才執行下面的指令,而 do-while 是先執行那些指令,再去檢查條件是否成立。以我們剛才猜數字的例子來說,其實用 do-while 是比較合適的,各位也可以試著把它改用 do-while 看看。
只不過以一般程式設計師來說,用 while 的次數比用 do-while 來得高,而且其他非 C 的程式語言,有些只有 while 語法而沒有 do-while 的語法,所以我們教學時以 while 為主,而同學們可以自行判斷使用 while 還是使用 do-while。(有句話說,一招半式闖江湖,只會 while 而不會 do-while,程式還是寫得出來,不過多學一個語法也是不錯的。)