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