程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 你好,C++(21)只要天還沒黑,就一直在工地干活-4.3.1 while循環:只要…就一直…,-4.3.1

你好,C++(21)只要天還沒黑,就一直在工地干活-4.3.1 while循環:只要…就一直…,-4.3.1

編輯:C++入門知識

你好,C++(21)只要天還沒黑,就一直在工地干活-4.3.1 while循環:只要…就一直…,-4.3.1


4.3  循環控制語句

在現實世界中,有這樣一類現象:

只要油箱中的當前油量小於油箱容量100升,就一直往油箱中加油;

一直不斷地為祖國辛勤工作,只要我還活著;

公司100000位員工,每個人的工資都增加10000元;

這些現象雖然各不相同,但它們都有一個共同的特點,那就是在某個條件(只要我還活著)下,或者某個范圍(所有100000位員工)內,這些動作(辛勤工作、增加10000元工資)都是循環往復重復多次地出現。為了表達這類循環現象,C++提供了循環控制結構。又因為這些循環現象各有特點,為了准確而簡便地表達它們,C++有針對性地分別提供了while、do…while…以及for語句。

4.3.1  while循環:只要…就一直…

對於上面的第一個循環現象,我們可以用“只要…就一直…”這樣的句式來描述。在現實世界中,這種循環現象非常普遍:

只要天還沒黑,就一直在工地干活;

只要硬盤還有剩余空間,就一直往硬盤上面存儲文件。

在自然語言中,我們用“只要…就一直…”這樣的句式來表達這種在某個條件下某個動作循環發生的循環現象,與之對應地,在C++中,我們用while循環結構來表達這種循環現象。其語法格式如下:

while( 條件表達式 )
{
    循環體語句;
}

在條件表達式中,我們對某個條件進行判斷,得到表示條件成立與否的true或者false值,以此來表達這個循環是在“某個條件”下進行的。而while結構中的循環體語句,則表示會被循環執行的動作。例如,我們將“只要油箱中的當前油量小於油箱容量100升,就一直往油箱中加油”這個循環現象用while結構表達出來就是:

// 當前油量
int nL = 0;
// …
// 循環條件:當前油量小於油箱容積
while(nL < 100)
{
    nL += 1; // 循環動作:往油箱中加1升油
}

在執行的時候,while語句首先會計算條件表達式(nL < 100)的值,也就是判斷循環條件(當前油量小於油箱容量100升)是否滿足。如果其值為true,表示循環條件滿足,則進入循環執行循環體語句,完成循環動作(往油箱中加1升油);反之,則表示循環條件不再滿足,從而直接結束整個while語句的執行。當循環體語句執行完一次後,會再次計算條件表達式的值,判斷循環條件是否仍然滿足。如果滿足,則繼續進入循環執行循環體語句,開始第二次循環。如此不斷循環往復,直到條件表達式的值為false,循環條件不再滿足,整個循環才結束。可以把while理解成自然語言中的“只要”,只要循環條件滿足,就不斷執行循環體語句。當循環條件不再滿足時,就結束while循環語句。while循環語句的執行流程如圖4-3所示。

知道更多:單步調試執行程序,查看代碼執行過程

while循環語句的執行過程,要比之前介紹的if條件語句復雜的多,再加上後面我們將要學到的break和continue對執行過程的控制,這樣while循環語句的執行過程就更復雜了。稍不留意,就可能導致代碼的實際執行過程與我們的設計不符,從而使程序執行得到錯誤結果。在這種情況下,我們可以利用Visual Studio所提供的單步調試運行功能,查看while循環語句真實的執行過程,從而找到與設計預期不符的地方,進而改正錯誤,使程序按照正確的過程執行得到正確的執行結果。

所謂的單步調試執行,就是在調試狀態下,按照程序的執行流程逐條地依次執行每一條語句,而在這個過程中,我們可以清楚地看到程序的執行過程——哪一條語句先執行,哪一條語句後執行,哪一條語句被跳過而沒有得到執行——以此判斷代碼的執行過程是否與設計預期相符。同時在這個過程中,我們還可以利用Visual Studio提供的“觀察”、“變量”等工具窗口,查看各個變量的當前數值,以此判斷執行結果是否與設計預期相符。如果執行過程或者執行結果與設計預期不符,那麼這就意味著當前執行的代碼可能是程序中出現問題的地方。當程序執行出現問題,也就是所謂出現bug的時候,我們通常用這種方式來尋找出現問題的代碼位置進而對其進行修正,而這個過程也被稱為debug。

要想使用單步調試執行來查看某段代碼的執行過程,我們可以先將輸入焦點定位在這段代碼的開始位置,然後按下F9快捷鍵在當前代碼行設置一個斷點。所謂斷點,就是在程序調試執行的過程中會暫停的代碼位置。設置斷點後,按下F5快捷鍵調試執行程序,當程序執行到之前設置的斷點位置就會暫停下來,這時我們可以利用F10快捷鍵,按鍵一次就向下執行一條語句,從而可以看到整個代碼的執行過程。利用這種方式,我們就可以查看while語句的執行過程,從而對while語句的執行過程有一個更深刻更直觀的認識。

4.3.2  do…while循環:一直…只要…

前面介紹的while語句表達的“只要…就一直…”循環現象,是“先判斷循環條件後執行循環動作”。然而在現實世界中,還有另外一類循環現象。例如:

一直不斷地為祖國辛勤工作,只要我還活著;

一直接受用戶輸入數據,只要用戶輸入不為0 。

這類循環現象剛好與while語句表達的循環現象相反,總是先執行循環動作(工作、輸入數據)後判斷循環條件(還活著,輸入不為0)。在自然語言中,我們可以用“一直…只要…”這樣的句式來表達這種現象,剛好是”只要…就一直…”的倒置。與之對應地,在C++中,我們也將while語句倒置形成do…while…語句來表達這種循環現象。其語法格式如下:

do
{
    循環體語句;
}
while ( 條件表達式 );

在執行的時候,do…while循環語句首先會執行一次循環體語句,然後再利用條件表達式對循環條件進行判斷。如果條件表達式的值為true,則意味著循環條件仍然滿足,可以再次執行循環體語句,開始下一次循環;反之,則意味著循環條件不再滿足,直接結束整個循環。do…while循環語句的執行流程如圖4-4所示。

下面來看一個實際的例子。在生活中,精打細算的媽媽們總是喜歡統計每月的收支情況。用自然語言來描述這一統計過程就是:一直不斷地輸入收支數目並將其累加到收支總數,只要還有剩下的收支數目。在這裡,“還有剩下的收支數目”是do…while…的循環條件,我們用輸入的收支數目為0表示沒有剩余數目,換而言之,循環條件成了“只要收支數目不為0”。而“輸入收支數目並將其累加到收支總數”就是這個do…while…循環要反復執行的動作了。這是一個典型的“一直…只要…”循環現象,用do…while…循環結構將其表達出來就是:

// 每月收支統計程序
#include <iostream>
using namespace std;

int main()
{
    // 輸出用戶提示
    cout << "======每月收支統計程序======" << endl;
    cout << "請輸入你本月的收入(正數)和支出(負數),0表示輸入結束。" << endl;

    // 收支數目,這裡的初始值不是必須的
    int nInput = 0;
    // 收支總數
    int nTotal = 0;
    // 第一次循環,無條件執行循環動作
    // 其後的循環,要在循環條件滿足的情況下才能執行
    do
    {
          // 接受用戶輸入的收支數目並保存到nInput
          cin>>nInput;
           // 對收支進行統計,將其加和到收支總數nTotal
           nTotal += nInput;
    } while( 0 != nInput ) // 對循環條件進行判斷,以決定是否進行下一次循環

    // 輸出統計結果
    cout << "你本月的結余是:" << nTotal << endl;
    
    return 0;
}

在執行的時候,do…while…語句第一次會無條件地執行一次循環體語句,然後才執行條件判斷“while( 0 != nInput )” ,判斷收支數目nInput是否為0,也就是判斷循環條件是否依然滿足,以決定是否進入下一次循環。這時的nInput中已經是用戶第一次輸入的收支數目了,如果為0,則表示後面沒有收支數據了,“0 != nInput”的值為false,循環條件不再滿足而直接結束整個do…while…循環語句。反之,則繼續進行下一次循環,接受用戶輸入並將其累加到收支總數,然後再次判斷循環條件是否依然滿足以決定是否進行下一次循環。這個過程會不斷循環往復地進行下去,直到用戶輸入nInput為0,循環條件不再滿足為止。整個過程只需要輸入各個收支數目,程序會循環接收這些數據並進行累加統計得到結果,這可比按計算器省事多了。趕緊把這個統計程序拿去獻給老媽吧,肯定會得到一番獎賞的。

while和do…while都是用來表達循環現象的結構,且很多時候,兩者之間可以相互轉換。兩者的差別在於,while語句是先判斷循環條件後執行循環動作,而do…while…語句卻剛好是反過來,先執行循環動作後判斷循環條件。這也就意味著,do…while…語句的第一次循環可以無條件地執行,所以它更加適合於表達哪些第一次循環沒有初始條件限制的循環現象。比如在收支統計程序中第一次輸入收支數目時,任何時候任何情況都可以,沒有什麼初始條件限制。而while語句的每一次循環動作都要在循環條件滿足的前提下執行,所以它更適合於表達哪些每次循環都有前提條件的循環現象。比如,在給汽車加油時,每一次我們都需要判斷油箱是否已滿,無論是第一次還是最後一次。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved