while 循环语法形式:while(条件){需要循环执行的语句;}while 是“当”的意思。
请首先和if语句作一个比较:if(条件){条件成立时执行的语句;}二者除了关键字不一样以外,结构完全一样。
但一定要注意,在条件成立时,if语句仅仅执行一遍,而while语句则将反复执行,直到条件不再成立。
请看while循环的流程图:程序从“前面的语句”开始执行,然后进行条件判断,如果条件成立,则执行一次“每次循环执行的语句”,再后请特别注意红色部分,这是我们碰上的,第一次会往后走流程:红线就像汽车拐弯,掉头到条件处(并不包括前面的语句),然后再进行下一次的条件判断……直到某一次判断时条件不成立了,程序“继续后面的语句”。
我们用while的语法套用生活中的实际例子,可以直观地看出while的用法。
假设有一个爱哭的小娃娃,有一天她要求父母给买一条小红裙,可惜父母不同意,于是她就开始一个循环:while ( 父母不给买小红裙){我哭;}这段“代码”的意思是:当“父母不给买小红裙”,那么,小女孩就一遍一遍地哭。
这就是我们和循环流程的第一个遭遇战。
所举的例子看似直观:“小孩一遍遍地哭,直到父母给买裙”,但真正要用程序的语言来正确地表达出来,需要很多方面要考虑到,必竟,程序是严谨的。
首先,一个合适的判断是否继续的条件相当重要。
小女孩要继续哭,仅仅“父母不给买小红裙”,这显示不符合事实,想想我们小时候,再会哭,最终也有累的时候,所以,要想继续哭,我们的条件有两个:“父母不给买小红裙”并且“我还没有哭累”。
while ( 父母不给买小红裙&& 我还没有哭累){我哭;}其次,大多数情况下,条件需要被恰当地改变。
小女孩在不停地哭,那么她如何知道父母是否买了红裙呢?所以,她不能只顾哭,还得在哭的间隙观察大人是否同意买裙。
至于是否哭累,我们假设小女孩有一个疲劳度,每哭一次疲劳度加1,当疲劳度到达200时,可怜的小女孩累了……while(父母不给买小红裙&& 疲劳度< 200){我哭;我偷看爸妈是否同意买裙;疲劳度++;}例一:用while 语句实现求从1到100的累加和。
求1+2的和,我们可以写a = 1 + 2;求1加到100,我们当然可以这样写a = 1 + 2 + 3 + ... 100.不过这样写显然太累人了,要从1写到100啊!所以聪明如高斯的你,当然也知道这样写:a = (1+100) * 50;这确实是个在任何时候都值得称赞的,又快又简的方法,只是今天我们想让计算机累一点,老老实实地从1加到100。
首先用我们先学的while式的循环。
请同学们打开CB,然后新建一空白的控制台程序,在main()函数体加入下面黑体部分代码。
然后按F9运行。
查看运行结果以加深印象。
//---------------------------------------------------------------------------#include <iostream.h>#pragma hdrstop//---------------------------------------------------------------------------#pragma argsusedint main(int argc, char* argv[]){int sum = 0; //变量sum将用于存储累加和,将它初始化为0,这很重要。
int i = 1; //i是每次要加的数,它从1开始。
while ( i<= 100){sum += i;i++;}//输出累加结果:cout << "1到100的累加和为:" << sum << endl;getchar();}sum 初始为0,然后在每一遍的循环里,它都加上i,而,i则每次都在被加后,增加1。
最终,i递增到101,超过100了,这个循环也就完成了任务。
运行上面程序,输出结果为:11005050例二:用while循环实现简单的统计功能统计功能在各行业里都经常用到,比如学校学生成绩总分的统计,商店中每日销售额的统计等。
下面我们实现一个学生成绩的统计。
由于成绩中包含有80.5这样的需要小数的部分,所以我们使用实数类型。
保存,然后关闭上面的工程,然后再新建一个控制台工程。
在主函数main加入以下黑体部分的代码://---------------------------------------------------------------------------#include <iostream.h>#pragma hdrstop//---------------------------------------------------------------------------#pragma argsusedint main(int argc, char* argv[]){float sum,score;int num; //num 用于存储有几个成绩需要统计。
int i; //i 用于计数//初始化:sum = 0;i = 1;cout << "====成绩统计程序====" << endl;//用户需事先输入成绩总数:cout << "请输入待统计的成绩个数:";cin >> num;cout << "总共需要输入"<< num << "个成绩(每个成绩后请加回车键):" << endl;while ( i <= num){cout << "请输入第" << i << "个成绩:";cin >> score;sum += score;i++;}//输出统计结果:cout << "参加统计的成绩数目:" << num << endl;cout << "总分为:" << sum << endl;getchar();}//---------------------------------------------------------------------------以下是运行结果,我输入4个成绩参加统计:回车结束上面的程序。
稍作休息。
为了更直观地了解循环流程,现在我们来跟踪这段程序中的while循环。
1、首先在循环开始处设置断点(F5 功能):2、按F9运行程序,在DOS窗口提示“请输入待统计的成绩个数:”时,输入4,并回车。
3、程序将在一瞬间运行到第一步设置的断点所在行。
即while(...)这一行。
此时请鼠标挪到i 上,稍等片刻,出现提示“i=1",同样的方法可以观察num的值。
可见第一遍循环时,i = 1,num = 4,条件:i <= num 显然成立,循环得以继续。
4、按F8,程序往下运行一行,接着再按F8,程序要求输入一个成绩,请切换到DOS窗口,随便输入一个数,并回车。
回车后,程序运行到下图中蓝底的一行:5、之后,连续按F8,你将发现程序“回头”运行到while(...)这一行。
此时,i=2, i <= num 条件仍然成立,如果您想再跟踪一遍循环,请继续按F8,如果想结束跟踪,在断点行上再按一次F5以取消断点,然后按F9,程序恢复全速运行。
(程序往回走,回到while行)10.2 do ... while 循环语法形式:do{需要循环执行的语句;}while(条件);和while循环最明显的区别,就是do...while循环中,判断是否继续循环的条件,放在后面。
也就是说,就算是条件一开始就不成立,循环也要被执行一次。
请比较以下两段代码,前者使用while循环,后者使用do...while循环。
代码段一:int a = 0;while( a > 0 ){a--;}变量a初始值为0,条件a > 0 显然不成立。
所以循环体的a--;语句未被执行。
本段代码执行后,变量a值仍为0;代码段二:int a = 0;do{a--;}while( a > 0 );尽管循环执行前,条件a > 0 一样不成立,但由于程序在运行到do...时,并不先判断条件,而是直接先运行一遍循环体的语句:a--。
于是a的值成为-1,然后,程序才判断a > 0 ,发现条件不成立,循环结束。
do..while中的条件和while循环中的条件一样是:“允许继续循环的条件”,而不是“结束循环的条件”,这和Pascal语言中的do...until正好相反,学习过Pascal(Delphi)的学员可得注意。
以笔者的经验,do..while循环用得并不多,大多数的循环用while...来实现会更直观。
下面我们仅简单地将1到100的连加程序转换为用do...while实现:int sum =0;int i=1;do{sum += i;i++;}while(i<=100);例三:用do...while实现可以多次统计的程序。
在例二中,我们做了一个统计程序。
假如一个学生有三门成绩,如语文,数学,英语要统计总分,例二的程序可以方便地使用,但如果要连续统计一个班级每个学生的这三门成绩,我们就得不断地运行例二的成绩,这显然不方便。
一个同学的三门成绩需要一层循环,要不断统计多个同学各自的成绩,就需要再套上一层循环。
请看下面例子中,如何在原来的while...循环上再加一层do...while循环。
程序的思路是:统计完一遍后,就问一句是否要继续统计新同学的成绩,如果用户输入字母Y或y,表示需要统计一下位,否则,程序结束循环。
这个程序是在例二的基础上进行功能改进,以下粗体部分为新加的代码。
//---------------------------------------------------------------------------#include <iostream.h>#pragma hdrstop//---------------------------------------------------------------------------#pragma argsusedint main(int argc, char* argv[]){float sum,score;int num; //num 用于存储有几个成绩需要统计。