發信人: ax.bbs@bbs.ee.nthu.edu.tw. (athena), 信區: test
標 題: 星星流講座 0019
發信站: ☆清華電機☆ (Thu May 18 02:16:19 1995)
轉信站: star
星星流講座 0019 C 語言教室
第 4 講 之 4 基本的流程控制
Topic: while and do-while
前面講了一個收銀機的程式,我們使用的是 if-else 和 goto 的組合。
事實上,使用 goto 是不好的做法,為什麼呢?因為一個程式裡如果濫
用 goto 的話,程式的結構性很容易被破壞。至於為什麼 goto 會破壞
結構性的問題,我們以後再提,你只需要記住:不到最後關頭,絕不輕
用 goto 就可以了。
我們現在來介紹消去 goto 最常用的方法:使用 while 或 do-while 迴
圈 (loop)。看看下面的流程圖和程式片段:
□ 要求操作員輸入收銀金額 ←┐
↓ │是
◇ 檢查金額是否小於應收貨款 ─┘
label1:
printf ("Total: %f\nCash = ? ", sum);
scanf ("%f", &cash);
if (cash < sum)
goto label1;
請你看看流程圖,這兩個步驟中間形成了一個循環 (cycle),這個循環成
立的條件是 cash < sum。這個時候我們可以用 while 來取代上面的 if
敘述:
printf ("Total: %f\nCash = ? ", sum);
scanf ("%f", &cash);
while (cash < sum)
{
printf ("Total: %f\nCash = ? ", sum);
scanf ("%f", &cash);
}
while 迴圈的用法是:
while (條件運算式)
當條件成立時所要執行的程式區塊或敘述式
它的意思是在條件成立時,重複不斷地執行緊接在它後面的程式區塊或敘
述式,直到條件不成立為止。上面的例子中,由於我們並不能確保一開始
cash < sum 會成立,所以必須先執行一次輸入的動作,這是因為 while
執行迴圈是先檢查條件是否成立,若是才執行。
像我們的例子中,迴圈內的東西需要先被執行一次,再來檢查條件是否成
立,這個時候就可以使用 do-while 來簡化程式了:
do
{
printf ("Total: %f\nCash = ? ", sum);
scanf ("%f", &cash);
} while (cash < sum);
do-while 迴圈和 while 最大的不同點,就是 do-while 會先把程式區塊
做一遍,然後再去檢查條件是否成立。為了加強各位的印象,我們把另一
個分支的流程圖和程式列出如下:
□ 輸入一數字並加總 ←┬───┐
↓ │ 是 │
◇ 數字是否小於 0?┘ │否
↓否 │
◇ 數字是否為 0 ? ────┘
label1:
if (input != 0)
{
scanf ("%d", &input);
if (input > 0)
sum += input;
if (input > 0)
sum += input;
goto label1;
}
它可以改進成以下比較好的寫法:
while (input != 0)
{
do
{
scanf ("%d", &input);
} while (input < 0);
sum += input;
}
這段替代的程式,就請各位好好想想,好好看看了。