在前面,完整的介绍了顺序结构的相关语句和分支结构语句的使用,但是在程序设计中,只单纯的使用这两种结构是不能够发挥出计算机的强大功能的,还要结合循环结构,让所设计的程序可以简单的处理重复性代码或类似性代码。
循环是C++程序设计基础部分的重要部分,也是程序设计的精要所在,请读者一定仔细研读,以求达到最好的学习效果。
一、while循环
在C/C++中,while循环是最基础的一个。他的拓展性强,结构简单,易掌握。
while语句的标准格式:
while (表达式)
{
语句
}
在“( )”中的表达式,要求返回一个BOOL类型的值,当这个值为TRUE(非0)时,即表达式成立时,将重复运行“{}”内的若干语句。因此,while又称为“当型”循环。
【例15】算1+2+3+……+100的和
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,sum=0;
i=1;
while (i<=100)
{
sum=sum+i;
i++;
}
cout<<"sum="<<sum<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
在【例15】中,是使用计数性质的while循环,所以要给计数器一个初始值,即i=1;而循环的次数要由循环的条件决定,即while后面“( )”里的表达式返回的逻辑值,在【例15】中是i<=100;而所谓计次就是循环一次计数一次,也就是让i每运行一次而变化一次的i++语句。这样,当i变化成101时,条件不满足了,就不能再进入循环,循环也就结束了。
需要注意的是,在语法上,和if语句一样,如果括号内的语句多于一句,则“{}”是不能够省略的;而在只有一句语句时,则可以省略“{}”符号。在while( )语句面是没有“;”的,如果出现“;”,则代表while需要循环的语句只有一个空语句,而真正需要循环的部分却不会进行循环。
以上两点是在编程中最最容易犯的错误,在写程序的过程中,一定要注意。
【例16】条件型while循环
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,sum;
i=0;sum=0;
while (sum<=5050)
{
i++;
sum=sum+i;
}
sum=sum-i;i--;
cout<<sum<<endl<<i<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
在【例16】中,并不是根据循环变量i的变化范围而决定整个循环的次数的,而是根据算出的和(sum值)来决定是否继续运行。这种情况就是根据某种条件,而非计数变量的变化范围而决定while循环的循环次数。
二、do-while循环
在do-while循环中,也有一个“while”,所以,do-while循环只是while循环的“变形”版。即while循环是将判断表达式放在循环语句的前面来进行判断,而do-while语句是将判断表达式放在循环运行一次之后。所以在while语句中,如果“( )”中的表达式不成立,则循环语句一次都不会运行;而do-while语句是将条件表达式放在循环的最后边,所以,即使do-while循环的条件第一次就无法满足,do-while循环中的语句也会被执行一次,才能退出循环。
【例17】用do-while计算1+2+3+……+100的和
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,sum;
i=1;sum=0;
do
{
sum=sum+i;
i++;
}
while (i<=100);
cout<<"sum="<<sum<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
从程序的整体来看,do-while循环和while循环做出来的程序整体感觉是一致的。所以只要注意一下它“先执行后判断”的这个特性,应用的方式是几乎一样的。
在这里需要强调的是,因为do-while结构的形式,所以造就了do-while的一个特殊的应用就是密码检测。
【例18】密码验证
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int pass,i,password;
i=1;
password=686868;
do
{
cout<<"Please input the password"<<endl;
cin>>pass;
i++;
}
while (pass!=password&&i<4);
if (pass!=password)
cout<<"error!"<<endl;
else
cout<<"Welcome!"<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
这个程序实现的功能是,可以输入三次密码,当密码正确或者超过三次后,循环将结束,再根据输入密码的内容,对输出的内容做出调整。
三、for语句循环
前面介绍的两种循环都是基于while结构的,即当条件成立时持续循环,当条件不成立时,退出循环。而for循环语句,有更加严禁的语句结构和完善的处理机制。
for循环的基本结构如下:
for (变量初始化;循环条件;循环后处理)
{
语句
}
在形式上可以把for语句的结构划成4部分:第一部分就是变量初始化部分,这个部分只能执行一次,在这里将对循环里将用到的变量进行初值化。第二部分是循环条件,当循环条件成立时则循环不停执行。第三部分是执行的语句部分,这部分就是循环条件成立时需要执行的语句。第四部分就是在第三部分执行后,所做的处理。这四部分中,只有第一部分会执行一次,后三部分都是反复执行的,只有当第二部分循环条件不成立时,才停止循环。
【例19】计算1+2+3+……+100的和
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,sum;
for (i=1,sum=0;i<=100;i++)
{
sum=sum+i;
}
cout<<sum<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
同样是计算1+2+3+……+100的和,与while与do-while语句相比for循环的结构更加紧凑清晰。只要理解清楚for语句的四个部分的内容和执行顺序,就可以轻松驾御for循环结构。
【例20】质数的判断
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int shu;
int i;
cin>>shu;
for (i=2;i<shu;i++)
{
if (shu%i==0)
break;
}
if (i==shu)
cout<<"质数";
else
cout<<"合数";
cout<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}
对于一个输入的数,判断其是否为质数,这是一道很传统的题目。按照质数的定义,只有1和它本身两个约数的整数定义为质数。在进行判断时,我们的依据也是如此。如果能够找到除了1和它本身以外的约束就足以证明它是约束,而如果证明在2到这个整数减1的这个范围之内都没有这个数的约数的话,则可以证明它是质数。
在【例20】的循环中,循环的范围是2到shu-1,但是由于后处理部分的原因,i在循环结束时的值是shu。所以如果i的值为shu时,就可以肯定这个正在判断的数是质数。
循环和if语句的结合是处理很多问题的最简单起点。
四、循环的嵌套
在循环中,单纯的循环语句只能处理简单的问题,而对于更多较复杂的问题就需要循环的嵌套使用以达到更好的应用效果。图形打印是一个很常见的题目,下面举例说明循环的嵌套使用。
【例21】打印图形
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,j;
int shu=1;
for (i=1;i<=5;i++)
{
for (j=0;j<i;j++)
{
cout<<shu;
}
cout<<endl;
}
system("PAUSE");
return EXIT_SUCCESS;
}
在【例21】中,第一个for循环被称为外循环,而这个循环里面嵌套的for循环被成为内循环。这个例题是典型的双重循环结构。外循环控制打印的行数,而内循环控制每行打印几个数。在内循环每完全结束一次后即外循环执行一次,输出一个换行,准备打印下一行。
【例22】找出1到100间的所有质数
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int i,j;
bool f;
for (i=2;i<=100;i++)
{
f=true;
for (j=2;j<i;j++)
{
if (i%j==0)
{
f=false;
break;
}
}
if (f)
cout<<i<<" ";
}
system("PAUSE");
return EXIT_SUCCESS;
}
在【例22】中,内循环部分的实质和【例20】几乎一致,只不过增加了一个bool类型的变量f。这个f值的默认状态是true,而整个内循环列出了可能是约数的所有情况。一旦发现除1和它本身的约数后,就立即可以确定这个数不是质数,就可以使用break语句退出内循环。在判断f的值后,输出判断后是质数的数字。