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语句以外,所有的过程化语句的末尾是没有分号的,而分号都属于大括号内的语句或者语句块。
过程化语句是一个程序的骨骼。程序的大多数功能都要依赖过程化语句来实现。因此,掌握并且能够灵活运用过程化语句对程序设计来说非常重要。在以后的章节中,我们还会继续学习过程化话语句一些更多的使用方法。