C++的do...while語句詳解
2020-05-23 14:28:05
供稿:網友
我們已經學習了for語句的循環,并且知道for語句習慣上是用在已知循環次數的情況下的。但是,人不具有先知的能力,有些時候我們無法預知一個循環要進行幾次,那我們該怎么辦呢?
一個循環,最不可缺少的就是開始和終止。如果一個程序的循環只有開始沒有終止,那么這個程序是不會有結果的。所以,我們必須知道什么時候讓循環終止,即循環繼續或循環終止的條件。
于是,一個只包含循環繼續條件的循環語句產生了,那就是while語句,具體語法格式為:
while (循環繼續的條件)
語句塊;
while語句要比for語句簡練很多,它只負責判斷循環是否繼續。所以,我們必須人為地在語句塊中改變參數,使得循環最終能夠被終止。由于while循環是在循環語句塊之前判斷是否繼續循環,所以又被稱為“當型循環”。
下面讓我們來看一段簡單的程序:(程序5.4.1)
#include "iostream.h"
#include "iomanip.h"
int main()
{
int password;
cout <<"請設置一個四位數密碼(首位不能是0):" <<endl;
cin >>password;
int i=0;
while (i!=password)//如果密碼沒猜中就繼續猜
{
i++;
}
cout <<"破解成功!密碼是" <<i <<endl;
return 0;
}
運行結果:
請設置一個四位數密碼(首位不能是0):
1258
破解成功!密碼是1258
可能有些讀者還沒看懂,上面這段程序到底是什么意思。其實上面這段程序就是暴力破解密碼的基本原理。假設某臺電腦內設置了一個四位整數的密碼,我們就可以通過循環語句讓它不斷地去嘗試猜測,但是我們無法預知這個密碼是多少,也就無法知道循環里的語句塊要執行多少次,所以我們應該使用while循環,而循環繼續的條件就是密碼沒有被猜中。
算法時間:電腦的猜測
很多人認為,電腦沒有思維,怎么能猜測呢?其實這樣就大錯特錯了。電腦自己是無法猜測的,但是我們可以使用循環語句教它如何猜測,更確切地說是教它如何找到。這種使用循環來查找結果的方法我們稱為窮舉法。即把所有可能的結果都去試試看,如果哪個能對上號了,就是我們所要的答案。但是在使用它的時候我們要注意嚴密性,如果自己考慮時漏掉了可能的結果,那么電腦自然不會猜出完美的答案來。窮舉法在程序設計中使用十分廣泛,甚至很多人腦難以解決的問題,它都能很快地給出答案。
在實際使用中,我們發現while語句就像是只有循環條件的for語句。所以,在某些場合下,while語句和for語句是可以互相轉化的。而while語句也有著和for語句類似的嵌套,在這里不作贅述。
導火索——do
在實際生活中會有這樣的問題,比如今天是星期一,我們以一周作為一個循環,那么循環結束的條件還是“今天是星期一”。如果我們寫while (今天!=星期一),那么這個循環壓根兒就不會運行。因為“今天是星期一”不符合循環繼續的條件,已經直接使循環結束了。
其實我們只要讓第一次的循環運行起來就是了,然后再寫上while (今天!=星期一),就能達到我們的目的。如果我們把后面可以發生的循環比作能發生連鎖反應的炸藥,那么我們缺少的只是一根導火索。而在C++中,就有這么一根導火索——do。它能夠搭配while語句,使得第一次的循環一定能運行起來。它的語法格式是:
do
語句塊;
while (循環繼續的條件);
要注意,這里的while后面是有一個分號的,如果缺少了這個分號,則會導致錯誤。下面就讓我們來看一個do……while的程序:(程序5.4.2)
#include "iostream.h"
int main()
{
char inquiry;
do
{
int n;
cout <<"你要輸出幾個星號?" <<endl;
cin >>n;
for (int i=0;i<n;i++)//輸出n個星號
{
cout <<'*';
}
cout <<endl;
cout <<"還要再輸出一行嗎?(n表示不要)" <<endl;
cin >>inquiry;
}while (inquiry!='n' && inquiry!='N');
return 0;
}
運行結果:
你要輸出幾個星號?
3
***
還要再輸出一行嗎?(n表示不要)
y
你要輸出幾個星號?
2
**
還要再輸出一行嗎?(n表示不要)
y
你要輸出幾個星號?
1
*
還要再輸出一行嗎?(n表示不要)
n
在這段程序中,由for語句來控制輸出星號的個數。而do…while語句則是提供了一個用戶交流的方式,一旦用戶回答n,則退出程序。
算法時間:命令行下的人機交流
我們現在所使用的Windows系統稱為圖形用戶界面(GUI——Graphic User Interface),它是一種可以由鼠標控制的直觀的操作系統(OS——Operating System)。然而,在圖形用戶界面的操作系統被開發出來之前,我們只好在DOS環境下面對著冷冰冰的電腦,沒有好看的圖標,也沒有方便的鼠標。這種在黑乎乎的屏幕上給電腦下命令的操作模式叫做命令行(Command Line)模式。很顯然,這種模式給用戶很不友好的感覺。所以,我們在設計一個完美的命令行程序時,不僅要求它在功能上質量上的完美,還要求它能夠提供更好的人機交流。而程序5.4.2中do……while語句的用法便是高級語言中簡單而常用的提供人機交流的方法。
至此,我們學完了所有常用的的分支語句和循環語句。這些語句稱為過程化語句。我們可以發現,除了do……while語句以外,所有的過程化語句的末尾是沒有分號的,而分號都屬于大括號內的語句或者語句塊。
過程化語句是一個程序的骨骼。程序的大多數功能都要依賴過程化語句來實現。因此,掌握并且能夠靈活運用過程化語句對程序設計來說非常重要。在以后的章節中,我們還會繼續學習過程化話語句一些更多的使用方法。