發信人: 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;
    }

這段替代的程式,就請各位好好想想,好好看看了。