2.4 循环结构
在程序设计中,可能需要多次重复执行同一代码块。
循环:为了解决某一问题或计算某一结果,在满足特定条件下,重复执行同一组操作。
- 循环类型(语句)
while语句:当给定条件为真时,重复执行语句块。
在执行循环体之前判断条件。
do...while语句:在循环体结尾时判断条件,和while语句类似。
for语句:多次执行一个语句序列,简化管理循环变量的代码。
嵌套循环:在循环体内使用一个或多个循环。
(1)while语句
适合
条件驱动场景:不知道什么时候结束,但是知道什么时候开始。
//基本语法
while(条件表达式){
//循环体/代码块(条件表达式为真时执行)
}
特点:
先判断条件表达式的真假,再执行循环体;
循环变量需要在while外部定义和初始化;
循环体内部通常需要更新循环变量,否则会变成无限循环。
- 示例代码:输出1-5
#include<iostream>
using namespace std;
int main(){
//while语句基本使用-输出1-5
//cout<<"1"<<"2"<<"3"<<"4"<<"5"<<"6"<<endl;
int i=1;//循环变量
while (i<=100)
{
cout<<i<<endl;
i++;//i=i+1
}
return 0;
}
- 示例代码:计算一个数的位数
#include<iostream>
using namespace std;
int main(){
//while语句基本使用-计算一个数的位数
int num=0,count=0;
cout<<"请输入一个整数:"<<endl;
cin>>num;
while (num>0)
{
num/=10;//num=num/10
//每次/10去掉最后一位数
count++;//计数器
}
cout<<"这是一个"<<count<<"位数!"<<endl;
return 0;
}
(2)do...while语句
do...while和while很像,但是有一个关键区别:
do...while是先执行,后判断。
//基本语法
do{
//循环体/语句块;
}while(条件表达式);
注意:
do...while()后面一定要加上分号;
至少执行一次循环体,哪怕条件一开始就为假;
执行完一次之后,再判断条件表达式是否为真,决定是否继续;
适合需要先输入再判断的场景。
- 示例代码:输出1-5
#include<iostream>
using namespace std;
int main(){
//do...while
int i=1;
do
{
cout<<i<<endl;
i++;
} while (i<=5);
return 0;
}
- 示例代码:猜数字
#include<iostream>
using namespace std;
int main(){
//do...while
//1-10
int target=8;
int guess;
//int i=1;
do
{
cout<<"请输入1-10中的一个整数:"<<endl;
cin>>guess;
if (guess>target)
{
cout<<"大了!"<<endl;
}else if (guess<target)
{
cout<<"小了!"<<endl;
}else{
cout<<"恭喜你,猜对了!"<<endl;
}
//i++;
} while (guess!=target);
return 0;
}
(3)for语句
适合
已知循环次数的场景。
//基本语法
for(表达式1;表达式2;表达式3){
循环体;
}
表达式1:初始化(循环变量)
表达式2:条件(判断条件表达式是否为真)
表达式3:更新(改变循环变量的值)
注意:
三个表达式用分号;隔开,两个分号缺一不可(表达式可以空着)。
执行流程
a.初始化:只执行1次;
b.条件判断:如果为真,进入循环体;如果为假,直接退出循环;
c.更新循环变量的值;
d.回到步骤2,再次判断。
初始化(1次)-->判断-->循环体-->更新-->判断-->循环体-->更新......
-示例代码:输出1-10
#include<iostream>
using namespace std;
int main(){
//for
for (int i = 1; i <= 10 ; i++)
{
cout<<i<<endl;
}
return 0;
}
- 示例代码:1-100求和
#include<iostream>
using namespace std;
int main(){
//for
int sum=0;//注意:定义变量同时进行初始化
for (int i = 1; i <= 100 ; i++)
{
sum+=i;//sum=sum+i;
}
cout<<"1-100求和的结果为:"<<sum<<endl;
return 0;
}
(4)嵌套循环
一个循环体内再嵌套一个循环结构,常用作矩阵等。外层循环控制
行,内层循环控制列。
-示例代码:嵌套循环输出
#include<iostream>
using namespace std;
int main(){
//嵌套循环
for (int i = 1; i <= 3; i++)
{//外层循环 控制行
for (int j = 1; j <= 4; j++)
{//内层循环 控制列
cout<<"第"<<i<<"行"<<"第"<<j<<"列"<<" ";
}
cout<<endl;
}
return 0;
}
-示例代码:输出九九乘法表
#include<iostream>
using namespace std;
int main(){
//嵌套循环
for (int i = 1; i < 10; i++)
{//外层循环 行
for (int j = 1; j <= i; j++)
{//内层循环 列
cout<<j<<"*"<<i<<"="<<i*j<<" ";
}
cout<<endl;
}
return 0;
}
- 示例代码:输出等腰三角形
#include<iostream>
using namespace std;
int main(){
//嵌套循环
int n=8;//输出多少行
for (int i = 1; i <= n; i++)
{//外层循环 行
for (int j = 1; j <= n-i; j++)
{//内层循环 空格
cout<<" ";
}
for (int k = 1; k <= 2*i-1; k++)
{//*
cout<<"*";
}
//输出换行
cout<<endl;
}
return 0;
}
循环跳转控制
有时候想要提前结束循环的运行,或者跳过某些情况,需要用到两个关键字
break、continue.
- break
作用:立刻终止当前循环,直接跳出循环体,执行循环后面的代码。
- 示例代码
#include<iostream>
using namespace std;
int main(){
//从1-1000中找出第一个能同时被7和9整除的数
for (int i = 1; i <= 1000 ; i++)
{
if (i % 7 == 0 && i % 9 ==0)
{
cout<<"找到第一个能同时被7和9整除的数,是:"<<i<<endl;
break;
}
}
return 0;
}
- continue
作用:跳过本次循环剩余代码,直接进入下一轮条件判断,不终止循环。
- 示例代码
#include<iostream>
using namespace std;
int main(){
//从1-100输出所有的奇数
for (int i = 1; i <= 100 ; i++)
{
if (i % 2 == 0)
{
continue;
}
cout<<i<<endl;
}
return 0;
}
- 循环选择
已知循环次数,选for;
条件驱动,可能一次都不执行,选while;
至少需要执行一次,选do-while;
遍历数组、字符串,选for;
不断读取输入直到满足条件为止,选while或do-while。
常见错误
- 死循环
#include<iostream>
using namespace std;
int main(){
//忘记改变循环变量的值
int i=10;
while (i>0)
{
cout<<i<<endl;
i--;
//i++;
}
return 0;
}
- 循环执行时差一次
#include<iostream>
using namespace std;
int main(){
int i=1;
while (i<5)
{//【注意:】i<5和i<=5的区别
cout<<i<<endl;
i++;
}
return 0;
}
do-while末尾漏写
分号;编译报错;
continue放在自增/自减语句前导致死循环;
break仅跳出一层循环,无法一次性跳出多层。
练习
找出所有3位数中的水仙花数
水仙花数(阿姆斯特朗数):一个3位数,每一位上数字的立方和等于该数本身。
例:153=1^3 + 5 ^3 + 3^3
#include<iostream>
using namespace std;
int main(){
//找出所有3位数中的水仙花数
for (int i = 100; i <= 999; i++)
{
int bai=i/100;
int shi=i/10%10;
int ge=i%10;
//【注意】在C++中 ^ 不表示指数运算 是按位异或
if (bai*bai*bai+shi*shi*shi+ge*ge*ge==i)
{
cout<<"是水仙花数:"<<i<<endl;
}
}
return 0;
}