do while迴圈,C語言do while迴圈詳解

2020-07-16 10:04:22
do…while 迴圈不經常使用,其主要用於人機互動。它的格式是:

do
{
    語句;
}
while (表示式);

注意,while 後面的分號千萬不能省略。

do…while 和 while 的執行過程非常相似,唯一的區別是:“do…while 是先執行一次迴圈體,然後再判別表示式”。當表示式為“真”時,返回重新執行迴圈體,如此反復,直到表示式為“假”為止,此時回圈結束。

現在問一個問題:你認為 while 和 do…while 是否等價?它們是否可以相互轉換?我們前面講,while 和 for 是完全等價的,它們是可以相互轉換的。那 do…while 和 while、for 等價嗎?它們可以相互轉換嗎?

答案是“不能”。原因十分簡單,while 迴圈體內部不一定會執行,當表示式一開始就為假的時候它就不會執行。但 do…while 不管表示式開始為真還是為假,迴圈體內部都會先執行一次。

下面舉個例子,設計一個計算“一元二次方程”的程式。執行的結果是讓你輸入三個數,然後計算結果,完了之後還會問你:“您想繼續嗎?”想繼續的話可以再輸入三個數,不想繼續,輸入“N”就退出。下面就來寫這個程式:
# include <stdio.h>
# include <math.h>
int main(void)
{
    float a, b, c;  //定義一元二次方程的三個係數
    char k;  //用於後面判斷是否要繼續輸入
    double delta, x1, x2;  /*delta用來儲存b*b - 4*a*c的值;x1和x2的值分別為方程的解*/
    do
    {
        //輸入一元二次方程的三個係數a、b、c
        printf("請輸入一元二次方程的三個係數, 用回車分隔:n");
        printf("a = ");
        scanf("%f", &a);
        while(getchar() != 'n');  /*容錯處理, scanf後面都加上這一句, 作用是清空輸入緩衝區, 以防使用者亂輸入*/
        printf("b = ");
        scanf("%f", &b);
        while(getchar() != 'n');
        printf("c = ");
        scanf("%f", &c);
        while(getchar() != 'n');
        delta = b*b - 4*a*c;
        //判斷delta的值是大於零, 等於零, 還是小於零
        if (delta > 0)
        {
            x1 = (-b +sqrt(delta)) / (2*a);
            x2 = (-b -sqrt(delta)) / (2*a);
            printf("有兩個解, x1 = %f, x2 = %fn", x1, x2);
        }
        else if (0 == delta)
        {
            x1 = x2 = (-b) / (2*a);
            printf("有唯一解, x1 = x2 = %fn", x1);
        }
        else
        {
            printf("無實數解n");
        }
        //詢問是否想繼續輸入
        printf("您想繼續嗎, Y想, N不想:");
        scanf("%c", &k);  //輸入Y或者N, 表示“想”或“不想”
        while(getchar() != 'n');
    }
    while ('Y' == k);
    return 0;
}
輸出結果是:
請輸入一元二次方程的三個係數, 用回車分隔:
a = 1
b = 5
c = 6
有兩個解, x1 = -2.000000, x2 = -3.000000
您想繼續嗎, Y想, N不想:Y
請輸入一元二次方程的三個係數, 用回車分隔:
a = 2
b = 3
c = 4無實數解
您想繼續嗎, Y想, N不想:N

程式中,“while(getchar()!='n');”是 getchar() 的高階用法,作用是徹底地清空輸入緩衝區。getchar() 每次從緩衝區中取出一個字元,只要取出的字元不是迴車就一直取,這樣就將緩衝區中所有的垃圾字元都取出來了。

此外,do…while(1) 和 while(1) 雖然不等價,但是在功能上可以互換,因為反正是無限制迴圈,所以不管是先執行一次迴圈體再判斷,還是先判斷再執行迴圈體結果都一樣。但如果 while 後面的表示式不是 1,那就不能相互替換。大家看上面這個程式,do…while 中不是 do…while(1),而是 do…while('Y'==k),即只有 'Y'==k 才執行迴圈,但只有先執行一次迴圈體才知道變數 k 中儲存的是什麼,才能執行最後的 while('Y'==k),這樣就無法用 while(1) 來替代。因此 do…while 一般的使用場合為 while 後的表示式不為 1。

這就是人機互動,使用者與機器裡面的一個程式進行相互交流:機器給一個提示,使用者輸入一個值,然後機器再將結果返回給使用者,然後再給你一個提示……就這樣一步一步執行。do…while 主要用於人機互動,在其他地方都用得很少。