C語言中文網 目錄

do while循環,C語言do while循環詳解

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 = %f\n", x1, x2);
        }
        else if (0 == delta)
        {
            x1 = x2 = (-b) / (2*a);
            printf("有唯一解, x1 = x2 = %f\n", 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 主要用于人機交互,在其他地方都用得很少。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo