4 程序流程结构

C/C++支持的三种程序运行结构:顺序结构选择结构循环结构

  • 顺序结构:类似于Python的运行结构,程序按顺序执行,不发生跳转
  • 选择结构:依据条件是否满足,有选择的执行相应功能
  • 循环结构:依据条件是否满足,循环多次执行某段代码

4.1 选择结构

4.1.1 if语句

作用: 执行满足条件的语句

其主要有三种形式:

  • 单行格式if语句
  • 多行格式if语句
  • 多条件的if语句
  1. 单行格式if语句:if(条件){ 条件满足执行的语句 }
image-20240815105723851

示例:

int main()
{
    //单行if结构
    //让用户输入一个分数,如果大于600,则输出"恭喜"
    //1. 用户输入分数
    int score = 0;
    cout << "请输入一个分数"<<endl;
    cin >> score ;
    //2. 打印用户分数
    cout << "您的分数为:"<<score<<endl;
    //3.判断
    if(score > 600) //if条件语法后没有分号!!!
    {
        cout<<"恭喜"<<endl;
    }
 
    system("pause");
    return(0);
}

Important

if条件后面不要加分号

  1. 多行格式if语句:if(条件){ 条件为真执行的语句 }else{ 条件不满足执行的语句 }
image-20240815111900335

示例:

int main()
{
    //多行格式if
    //提示用户输入分数,如果分数大于600,则输出"恭喜",若没有大于600,则输出"别放弃"
    int score = 0;
    cout <<"请输入一个分数"<<endl;
    cin >> score;
    cout << "您的分数为"<< score <<endl;
    //执行判断
    if(score > 600) //大于600的情况
    {
        cout << "恭喜"<<endl;
    }
    else //小于600的情况
    {
        cout << "别放弃"<<endl;
    }
    system("pause");
    return(0);
}
  1. 多条件的if语句:if(条件1){满足条件1执行的语句}else if(条件2){满足条件2执行的语句}... else{都不满足执行的语句}
image-20240815120226742
int main()
{
    //多条件的if语句
    //1.输入分数
    int score = 0;
    cout << "请输入一个分数"<<endl;
    cin >> score;
    cout << "您的分数是" << score << endl;
    //2.条件判断(大于600)
    if (score >= 600)
    {
        cout << "恭喜"<<endl;
    }
    else if (score >= 500)//这里不能写(500 < score < 600)
    {
        cout << "别放弃"<<endl;
    }
    else if (score >= 400)
    {
        cout << "还可以"<<endl;
    }
    else
    {
        cout << "别摆烂辣!"<<endl;
    }
    
    system("pause");
    return(0);
}

嵌套if语句:在if语句中再嵌套一个if语句

案例要求:

  • 在上个代码的基础上,根据分数再细化
  • 大于700为特等,大于650为一等,大于600为优秀
int main()
{
    //多条件的if语句
    //1.输入分数
    int score = 0;
    cout << "请输入一个分数"<<endl;
    cin >> score;
    cout << "您的分数是" << score << endl;
    if (score >= 600)
    {
        cout << "恭喜"<<endl;
        if (score >= 700) //嵌套的if语句
        {
            cout << "特等"<<endl;
        }
        else if (score >= 650)
        {
            cout << "一等"<<endl;
        }
        else
        {
            cout << "优秀"<<endl;
        }
    }
    else if (score >= 500)//这里不能写(500 < score < 600)
    {
        cout << "别放弃"<<endl;
    }
    else if (score >= 400)
    {
        cout << "还可以"<<endl;
    }
    else
    {
        cout << "别摆烂辣!"<<endl;
    }
    
    system("pause");
    return(0);
}

4.1.2 三目运算符

**作用:**通过三目运算符实现简单的判断

语法:表达式1 ? 表达式2 : 表达式3

解释:

如果表达式1的值为真,执行表达式2,并返回表达式2的结果;

如果表达式1的值为假,执行表达式3,并返回表达式3的结果;

示例:

int main()
{
    //三目运算符
    int a =30;
    int b =20;
    int c =0;
    c=(a > b ? a : b);
    cout << c <<endl;
 
    //在C++中,三目运算符返回的是变量,可以继续赋值
    (a > b ? a:b)=100; //a和b做大小比较,较大的变量被赋值为100
    system("pause");
 
    return(0);
}

4.1.3 switch语句

执行多条件分支语句

语法:

switch(表达式)
    
{
    case 结果1 : 执行语句;break;
        
    case 结果2 : 执行语句;break;
        
    ...
        
	default : 执行语句;break;
}    

示例:

int main()
{
    //给电影评分
    //9-10 经典
    //7-8 非常好
    //5-6 不错
    // <5 不好
 
    cout << "请给电影打分"<<endl;
    int score = 0;
    cin >> score ;
    cout << "您的打分为"<<score<<endl;
    switch (score)
    {
    case 10 :
        cout << "经典"<<endl;
        break; //退出当前分支
    case 9 :
        cout << "经典"<<endl;
        break;
    case 8 :
        cout << "非常好"<<endl;
        break;
    case 7 :
        cout << "非常好"<<endl;
        break;
    case 6 :
        cout << "一般"<<endl;
        break;
    case 5 :
        cout << "一般"<<endl;
        break;
    default:
        cout << "不好"<<endl;
        break;
    }
    system("pause");
 
    return(0);
}

记得要写break;

缺点:switch判断的时候只能是整型或字符型,不可以是一个区间

优点:结构清晰,执行效率高(速度快)

4.2 循环结构

4.2.1 while循环语句

**作用:**满足循环条件,执行循环语句

语法:while(循环条件){循环语句}

image-20240816112429354

解释:只要循环条件为真,就执行循环语句

示例:

int main()
{
    //在屏幕中打印0-9这10个数字
    
    int num = 0;
    while (num < 10)
    {
        cout << num <<endl;
        num++;
    }
    system("pause");
 
    return(0);
}

如果while 后条件为(1),则为无限循环,要避免死循环的出现

练习:猜数游戏

int main()
{
    //添加随机数种子
    srand((unsigned int)time(NULL));    
    int num2 = rand()%100 + 1 ; 
    //cout << num22 <<endl;
    int val = 0;
    cout << "请输入一个数开始猜数游戏"<<endl;
    while (val != num2)
    {
        cin >> val ;
        if (val > num2 )
        {
            cout << "猜大辣,再来一次吧"<<endl;
        }
        else if (val < num2)
        {
            cout << "猜小辣,再来一次吧"<<endl;
        }
        
    }
    cout << "厉害,对辣"<<endl;
 
    system("pause");
    return(0);
}

4.2.2 do…while循环

**作用:**满足循环条件,执行循环语句

语法:do{循环语句}while(循环条件);

Note

与while不同的是,do…while会先执行一次循环语句,再判断循环条件

image-20240817090944732

示例:

int main()
{
    //do while 循环
    int num =0;
    do
    {
        cout << num <<endl;
        num++;
    } while (num < 10);
    system("pause");
    return(0);
 
}

**练习案例:**水仙花数

  • 水仙花数是一个三位数,它的每个位上的三次幂之和等于它本身
  • 例:1^3^+5^3^+3^3^=153
//注意:要有#include<cmath>
int main()
{
    //定义初始值,其中fnum3,2,1分别代表百十个位,这个三位数要和初始值fnum相等
    int fnum1 = 0;
    int fnum2 = 0;
    int fnum3 = 1;
    float fnumt = 0;
    int fnum = 100;
    do
    {
        
        fnum++;
        fnum1++;
        //三位数输出,个十百位分别输出
        if (fnum1 - 1  == 9)
        {
        fnum1 = 0;
        fnum2++;
        }
        if (fnum2 - 1 == 9)
        {
        fnum2 = 0;
        fnum3++;
        }
        if (fnum3 - 1 == 9)
        {
            fnum3 = 0;
        }
        
        fnumt = pow(fnum1,3) + pow(fnum2,3) + pow(fnum3,3);
        if ( fnumt == fnum)
        {
            cout <<"水仙花"<< fnum << endl;
        }
        // cout << fnum << endl;
        // cout << fnumt << endl;
        // cout <<"个位"<< fnum1 << endl;
        // cout <<"十位" <<fnum2 << endl;
        // cout <<"百位" <<fnum3 << endl;
     
    } while (fnum < 1000);
    system("pause");
    return(0);
 
}

Important

如何获取一个三位数的个十百位?

  • 例:153
  • 个位:153%10 = 3 对数字取模于10可以获得个位
  • 十位:153/10 = 15 15 % 10 = 5 C++中整除只留整数部分即 (153/10)%10
  • 百位:153/100 = 1

示例:

int main()
{
    int num = 100;
    do{
        num++;
        if(num == pow(num%10,3)+pow((num/10)%10,3)+pow(num/100,3))
        {
            cout << num <<endl;
        }
    }while(num < 999);
 
    system("pause");
    return(0);
}

4.2.3 for 循环

**作用:**满足循环条件,执行循环语句

语法:for(起始表达式;条件表达式;末尾循环体){循环语句;}

  • 起始表达式不参加循环
  • 条件表达式确定循环条件
  • 一次循环执行后执行末尾循环体

示例:

int main()
{
    for (int i = 0; i < 10; i++)
    {
        cout << i <<endl;
    }
    
    system("pause");
    return(0);
}

Note

对for(a;b;c){d}来看,执行顺序如下

  1. 先执行一次 a
  2. 判断 b
  3. 若b为真,重复2,3,4,5;否则退出循环
  4. 执行 d
  5. 执行 c

for 循环结构简单,比较常用

**练习案例:**敲桌子

  • 输出1~100,若该数个位含有7,或10位含有7,或该数字是7的倍数,则我们输出敲桌子,其余数字直接打印
int main()
{
    for (int i = 0; i < 100; i++)
    {
        if (i%10 == 7)
        {
            cout << "敲桌子" <<endl;
        }
        else if ((i/10)%10 == 7)
        {
            cout << "敲桌子" <<endl;
        }
        else if ( i%7 == 0 )
        {
            cout << "敲桌子" <<endl;
        }
        else
        {
            cout << i <<endl;
        }        
    }
}

Note

if比较语句中我们可以用逻辑运算符来提高if语句的精确性

比如上面的示例中多个if便可以写成if(i % 10 == 7 || i%7==0 || (i/10)%10==7 )

4.2.4 嵌套循环

  • 在循环体中再次嵌套循环,用于解决实际问题

示例

int main()
{
    for (int i = 0; i < 10 ; i++) //外层循环
    {
        for (int j = 0; j < 10; j++) //内层循环
        {
            cout << "*";
        }
        cout << endl;
    }
 // 外层走一次,内层走一周   
    
    system("pause");
    return(0);
}

**案例:**乘法口诀表

  • 打印九九乘法表
int main()
{
    //九九乘法表,实际上就是 行 X 列 = 数字,即将行和列表示出来即可
    for (int i = 0; i < 10; i++) // i 代表 行
    {
        for (int j = 1; j < i+1 ; j++) // j 代表 列 
        {
            cout << j <<"X"<< i <<"="<<i*j<<" ";
        }
        cout << endl;
    }   
    system("pause");
    return(0);
}

输出呈现:

image-20240819110404712


4.3 跳转语句

4.3.1 break 语句

**作用:**跳出选择结构循环结构

break使用的时机:

  • 出现在switch语句中,终止case并跳出switch
  • 出现在循环语句中,作用是跳出当前循环语句
  • 出现在嵌套循环中,作用是跳出最近的内层循环语句

示例1:

int main()
{
    for (int i = 0; i < 10 ; i++)
    {
        cout << i << endl;
        if (i == 5)
        {
            break;
        }
        
    } 
    system("pause");
    return(0);  
}

示例2

int main()
{
    for (int i = 0; i < 10 ; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (j == 5)
            {
                break;
            }
            cout << "*";
        }
        cout<< endl; 
    } 
    system("pause");
    return(0);  
}

4.3.2 countinue 语句

**作用:**在循环语句中,跳过本次循环中余下的未执行的代码,继续执行下一次循环

示例:

int main()
{
    for (int i = 0; i <= 100; i++)
    {
        if (i%2 == 0)
        {
            continue;
        }
        
        cout << i << endl;
    }
    system("pause");
    return(0);  
}
  • 实现了0~100奇数的输出

4.3.3 goto 语句

**作用:**可以无条件跳转语句

语法:goto 标记

  • 标记一般用纯大写英文表示
  • goto 语法尽量不要经常使用,以免造成代码逻辑混乱
  • 标记定义 T: