在C++语言中,循环有两大类:while循环和for循环。while循环下面有一个do-while循环。
循环的逻辑如下图所示:
我们可以先来写一个while循环:要求对小于10的正整数进行求和。
我们可以用while循环来写出一段如下所示的代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int count, num;
count = 0;
num = 0;
while (num<10){
count = count + num;
num ++;
}
cout << count << endl;
return 0;
}
运行的结果为:
45
或者问题也可以复杂一点:要求输入两个正整数,对两个正整数之间的数(包括两个正整数)进行求和:
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int small,big,count;
count = 0;
cin >> small >> big;
while (small <= big){
count = count + small;
small ++;
}
cout << count << endl;
return 0;
}
while循环可能会一次都不会执行,当条件被测试且结果为假时,会跳过循环主体,直接执行紧接着 while 循环的下一条语句。如果循环被执行,那么while循环的条件需要被循环的主体进行改变,如此才会出现while循环被终止的情况,否则会进入无限死循环当中。
while循环常见的一个问题是:输入一个正整数n,要求打印出来斐波那契数列的前N项。
斐波那契数列的定义可以参考下图:
代码如下所示:
#include<iostream>
using namespace std;
typedef long long ll;
int main(){
int n;
cin >> n;
ll t1 = 0,t2 = 1,t3;
while(n--){
cout << t1 << ' ';
t3 = t1 + t2;
t1 = t2;
t2 = t3;
}
return 0;
}
do-while循环不常用,do-while循环和while循环的区别在于:do-while循环会先对代码进行一次执行,然后再进行while语句的判断:
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a = 10;
// do 循环执行
do
{
cout << "a 的值:" << a << endl;
a = a + 1;
}while( a < 20 );
return 0;
}
运行的结果为:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
通常情况之下,我们只使用while循环。
在C++语言中,最常用的还是for循环,for循环更加的适合编写和阅读:
假设我们要求求0~100之间的3的倍数的和,我们可以写如下所示的一个代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int i = 0;
int sum = 0;
for (i; i <= 100; i++){
if (i%3 == 0){
sum += i;
}
}
cout << sum << endl;
return 0;
}
求得结果为:
1683
break关键词可以用来强制从循环中退出:
我们可以写一段如下所示的代码:
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a = 10;
// do 循环执行
do
{
cout << "a 的值:" << a << endl;
a = a + 1;
if( a > 15)
{
// 终止循环
break;
}
}while( a < 20 );
return 0;
}
运行的结果为:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 15
需要注意:如果使用的是嵌套循环(即一个循环内嵌套另一个循环),break 语句会停止执行最内层的循环,然后开始执行该块之后的下一行代码。
与break对应的关键词为continue,continue会跳过需要执行的语句并且直接进入对下一个循环的判断:
代码如下所示:
#include <iostream>
using namespace std;
int main ()
{
// 局部变量声明
int a = 10;
// do 循环执行
do
{
if( a == 15)
{
// 跳过迭代
a = a + 1;
continue;
}
cout << "a 的值:" << a << endl;
a = a + 1;
}while( a < 20 );
return 0;
}
打印的结果为:
a 的值: 10
a 的值: 11
a 的值: 12
a 的值: 13
a 的值: 14
a 的值: 16
a 的值: 17
a 的值: 18
a 的值: 19
可以发现当a=15的时候,代码被跳过了没有执行。
同样的,我们也刻意让for循环中嵌套for循环:查找0~100之间的质数:
#include <iostream>
using namespace std;
int main ()
{
int i, j;
for(i=2; i<100; i++) {
for(j=2; j <= (i/j); j++) {
if(!(i%j)) {
break; // 如果找到,则不是质数
}
}
if(j > (i/j)) {
cout << i << " 是质数\n";
}
}
return 0;
}
运行的结果为:
2 是质数
3 是质数
5 是质数
7 是质数
11 是质数
13 是质数
17 是质数
19 是质数
23 是质数
29 是质数
31 是质数
37 是质数
41 是质数
43 是质数
47 是质数
53 是质数
59 是质数
61 是质数
67 是质数
71 是质数
73 是质数
79 是质数
83 是质数
89 是质数
97 是质数
循环的一个典型的问题是打印菱形:
代码可以如下所示:
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
if(i<(n+1)/2)//判断是否在上面的三角形
{
for(int j=0;j<(n-1)/2-i;j++) cout<<" ";
for(int j=0;j<i*2+1;j++) cout<<"*";
}
else
{
for(int j=0;j<i-(n-1)/2;j++) cout<<" ";
for(int j=0;j<(n-i)*2-1;j++) cout<<"*";
}
cout<<endl;
}
}
输入7,打印的结果为:
*
***
*****
*******
*****
***
*