第2章 C++基础(3)

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;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容