C語言中文網 目錄

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

 當循環體中的語句多于一條時,要用 {} 把這些語句括起來形成一條復合語句,如下所示。

while(Exp_cntrl)
{
    Statement_1;
    Statement_2;
}

當循環體為一條簡單語句時,可以省略 {},即:

while(Exp_cntrl)
    Simple_Statement;//循環體

while 循環的執行流程為,首先判斷循環控制表達式 Exp_cntrl 的值,當該表達式的值為邏輯真(非 0)時,會一直執行循環體,直到表達式的值為邏輯假(0)才結束循環。

while 循環流程圖如圖 1 所示。


圖 1

通常把循環控制表達式 ExP_cntrl 中含有的變量,稱為循環控制變量。為了避免程序陷入死循環,必須要有能改變循環控制變量的語句,使循環控制表達式 Exp_cntrl 的值趨于邏輯假,以便使循環趨于終止。

【例 1】統計輸出 100 以內的所有奇數之和。

分析:本題是重復執行“把 100 以內的當前奇數 1、3、5、7,… 累加求和”的相似操作,故采用循環結構。循環算法的關鍵是要確定循環條件表達式和循環體。

循環控制變量及初始條件確定:由題意可知,奇數 i 作為循環控制變量,初值為第一個奇數,即 i=1。另外,還有求和變量 sum=0。

循環條件表達式的確定:循環控制變量 i 為 [1,100] 間的奇數。故循環條件表達式為 i<=100。

循環體確定:該題循環體中包含以下兩部分操作。
  • 把當前奇數變量 i 累加到求和變量 sum 中,即 sum+=i;
  • 為計算當前奇數的下一個奇數做準備,也就是控制變量的增量部分,即 i+=2。

流程圖如圖 2 所示。


圖 2 流程圖

實現代碼如下:
#include<stdio.h>
int main (void){
    int sum=0,i=1; //i初始為第一個素數
    while (i<=100) //循環執行的判斷條件
    {
        sum+=i;
        i+=2; //控制變量的增量
    }
    printf("sum=%d\n",sum);
    return 0;
}
運行結果為:
sum=2500

需要說明的是,必須在零的基礎上進行累加,故 sum 需要初始化為 0,否則將是無意義的隨機值。循環控制條件不必刻意去思考最后一個奇數是否包含 100,讓程序根據奇數的定義及相鄰奇數的差值自行計算確定 100 以內的最后一個奇數。

do-while循環

do-while 循環的格式如下。

do{
    Statement _1;
    Statement _2;
}while(Exp_cntrl);//分號不可丟

當循環體為一條簡單語句時,可以省略 {},即:

do
    Simp1e_Statement;//循環體
while(Exp_cntrl);

注意,在 do-while 結構中,while 括號后的分號不能丟。

do-while 循環的執行流程是:首先無條件地執行一次循環體,然后再根據循環控制表達式的值來判斷是否繼續執行循環體。若為真,則繼續執行;若為假,則停止執行,退出 do-while 循環。也就是說,do-while 循環至少執行一次循環體。

do-while 循環和 while 循環的主要差別是:前者至少執行一次循環體,后者有可能一次也不執行循環體。

do-while 循環的執行流程圖,如圖 3 所示。


圖 3 do-while 循環流程圖

do-while 循環主要用在一直進行嘗試性的操作,直到滿足條件為止的情景。

【例 2】編程實現猜數字游戲,假設謎底為 0?10 的整數,猜謎者每次輸入一個整數,直到猜對為止。

分析:本題屬于先輸入所猜數字才能判斷是否猜中,如果猜中,游戲結束,如果沒猜中,繼續猜,直到猜中為止。故該題符合 do-while 循環的使用場景。

實現代碼為:
#include<stdio.h>
int main (void){
    int pwd=7,gs; //pwd:謎底
    printf ("\tGames Begin\n");
    do{
        printf("Please guess (0~10):");
        scanf("%d",&gs);
    }while(gs!=pwd);
    printf ("\tSucceed!\n");
    printf ("\tGaines over\n");
    return 0;
}
運行結果:
        Games Begin
Please guess (0~10):3
Please guess (0~10):5
Please guess (0~10):8
Please guess (0~10):7
        Succeed!
        Gaines over

while和do-while的等價關糸

在多數情況下,while 循環和 do-while 循環是等價的,如下例所示。

【例 3】計算表達式 1-1/2+1/3-1/4+1/5-----1/100 的值。

分析:通過觀察可以發現,該表達式是把分母從 1 開始到 100 為止的所有數據項:1、-1/2、1/3、…、-1/100 累加求和。也就是說先判斷分母是否小于等于 100,如果是,再組建該項,并把該項累加到求和變量上。符合循環條件前置的特點,故可選擇 while 循環實現。

實現代碼:
#include<stdio.h>
int main (void)
{
    double s=0.0, item;
    int sign=1,n=1; //n:分母
    while(n<=100)
    {
        item=sign*(1.0/n); //組建當前項,注意1.0的作用
        s+=item; //累加當前項
        sign*=-1; //改變下一項的符號位
        n++; //改變下一項的分母
    }
    printf("sum=%lf\n",s); //double的格式控制符為%lf
    return 0;
}
運行結果:
sum=0.688 172

再次分析:由于事先知道求和變量 s 中至少包含一項 1,故第一次累加的分母判斷條件可以去掉,從第二項開始,首先判斷分母是否小于等于 100,再組項,然后累加。故該例子也符合循環條件后置的情況,所以本例也可以使用 do-while 循環,實現求該表達式的值。

實現代碼為:
#include<stdio.h>
int main (void)
{
    double s=0.0,item;
    int sign=1,n=1;
    do
    {
        item=sign*(1.0/n); //n:分母
        s+=item; //組建當前項,注意1.0的作用
        sign*=-1;
        n++;
    }while(n<=100);
    printf("sum=%lf\n",s);
    return 0;
}
運行結果為:
sum=0.688172

注意,每一項的組建均是:分數值(分子與分母相除的結果)與符號位相乘的結果,盡管在本例中寫成 term=sign*1.0/n; 同樣能得到正確結果,但不提倡這種寫法。建議分數值表示部分顯式加上括號,即:item=sign*(1.0/n); 這是一種規范的寫法,這樣可避免因編譯器的差異而造成結果不確定的情況,即增強了代碼的可移植性。

另外,參考代碼 item=sign*(1.0/n); 中的 1.0 如果誤寫成 1,即 item=sign*(1/n); 則輸出錯誤結果:sum=1.000 000。原因是除了第一項 n 為 1 時,1/n=1 外,其余當 n≥2 時,1/n 分子、分母同為整數值,結果為取整,故從第二項開始每一項的結果均為 0。

while 和 do-while 的不等關糸

并不是所有的 while 循環都可等價替換為 do-while 循環結構。當 while 循環第一次循環條件就不滿足時,此時不能把該 while 循環轉換為 do-while 循環。如例 4 所示。

【例 4】分析如下兩段代碼的輸出結果,總結 while 循環和 do-while 循環的差異。

實現代碼 1:
#include<stdio.h>
int main (void)
{
    int s=0,i=15;
    while(i<=10)
    {
        s+=i;
        i++;
    }
    printf ("s=%d\n",s);
    return 0;
}
實現代碼 2:
#include<stdio.h>
int main (void)
{
    int s=0,i=15;
    do
    {
        s+=i;
        i++;
    }while(i<=10);
    printf("s=%d\n",s);
    return 0;
}
分析:
實現代碼 1:使用 while 循環結構,循環判斷條件前置,先判斷 i 是否滿足小于等于 10 時,如果滿足,則把 i 累加到 3 上;否則,循環結束。本例中i初始為 15,不滿足 i 小于等于 10,故循環體一次也不執行。s 為 0。

實現代碼 2:使用 do-while 循環結構,循環判斷條件后置,先無條件執行一次循環體,即先把 i 的初始值 15 累加到 s 上,i 自增 1 變為 16,然后判斷 i 的值 16 是否小于等于 10,結果為假,故循環終止。s 的值為 15。

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

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

底部Logo