流程结构

145 阅读7分钟

一、选择结构

选择结构:依据条件是否满足,有选择的执行相应功能。

1.1 if 语句

一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。

  • 语法
if(boolean_expression)
{
   // 如果布尔表达式为真将执行的语句。
}
  • 示意图

  • 代码示例
#include <iostream>

int main() {

    int score = 0;

    std::cout << "请输入您的分数: " << std::endl;

    std::cin >> score;

    if (score > 60) {
        std::cout << "很好,及格了!" << std::endl;
        // 请输入您的分数: 
        // 61
        // 很好,及格了!
    }

    return 0;
}

1.2 if...else 语句

一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。

  • 语法
if (boolean_expression) {
  // 如果布尔表达式为真将执行的语句。
} else {
  // 如果布尔表达式为假将执行的语句。 
}
  • 示意图

  • 代码示例
#include <iostream>

int main() {

    int score = 0;

    std::cout << "请输入您的分数: " << std::endl;

    std::cin >> score;

    if (score > 600) {
        std::cout << "考上了不错的大学。" << std::endl;
        // 请输入您的分数: 
        // 650
        // 考上了不错的大学。
    } else {
        std::cout << "只考上了一般的大学。" << std::endl;
        // 请输入您的分数:
        // 480
        // 只考上了一般的大学。
    }

    return 0;
}

1.3 嵌套 if

if 语句中,可以嵌套使用 if 语句,达到更精确的条件判断。

  • 语法
if( boolean_expression 1)
{
   // 当布尔表达式 1 为 true 时执行。
   if(boolean_expression 2)
   {
      // 当布尔表达式 2 为 ture 时执行。
   }
}
  • 代码示例
#include <iostream>

int main() {

    int score = 0;

    std::cout << "请输入您的分数: " << std::endl;

    std::cin >> score;

    if (score > 0) {
        if (score < 60) {
            std::cout << "分数不及格。" << std::endl;
            // 请输入您的分数: 
            // 58
            // 分数不及格。
        } else {
            std::cout << "分数及格了。" << std::endl;
            // 请输入您的分数:
            // 60
            // 分数及格了。
        }
    } else {
        std::cout << "分数输入异常。" << std::endl;
        // 请输入您的分数:
        // -1
        // 分数输入异常
    }
    
    return 0;
}

1.4 if...else if...else

一个 if 语句后可跟一个可选的 else if ... else 语句,这可用于测试多种条件。

  • 语法
if (boolean_expression 1) {
  // 当布尔表达式 1 为 true 时执行。
} else if (boolean_expression 2) {
  // 当布尔表达式 2 为 true 时执行。
} else if (boolean_expression 3) {
  // 当布尔表达式 3 为 true 时执行。
} else {
  // 以上都不满足执行的语句。
}
  • 代码示例
#include <iostream>

int main() {

    int score = 0;

    std::cout << "请输入考试分数:" << std::endl;

    std::cin >> score;

    if (score > 600) {
        std::cout << "我考上了一本大学" << std::endl;
    } else if (score > 500) {
        std::cout << "我考上了二本大学" << std::endl;
    } else if (score > 400) {
        std::cout << "我考上了三本大学" << std::endl;
    } else {
        std::cout << "我未考上本科" << std::endl;
    }

    return 0;
}

1.5 三目运算符

三目运算符可以实现简单的判断。

  • 语法
// 表达式1 ? 表达式2 :表达式3
expression 1 ? expression 2 : expression 3

// 如果表达式1的值为真,执行表达式2,并返回表达式2的结果;
// 如果表达式1的值为假,执行表达式3,并返回表达式3的结果。  
  • 代码示例
#include <iostream>

int main() {

    int a = 100;
    int b = 200;
    int max = 0;

    max = a > b ? a : b;
    std::cout << max << std::endl;
    // 200

    return 0;
}
  • if 语句比较,三目运算符优点是短小整洁,缺点是如果用嵌套,结构不清晰,会增加理解的难度

1.6 switch 语句

用于执行多条件分支语句。

  • 语法
switch(expression){
    
    case constant-expression  :
       statement(s);
       break; // 可选的
    
    case constant-expression  :
       statement(s);
       break; // 可选的
  
    // 您可以有任意数量的 case 语句
    default : // 可选的
       statement(s);
}
  • 代码示例
#include <iostream>

int main() {
    int score = 0;
    std::cout << "请输入电影评分(满分10分):" << std::endl;
    std::cin >> score;
    
    switch (score) {
        case 10:
        case 9:
            std::cout << "优秀。" << std::endl;
            break;
        case 8:
        case 7:
            std::cout << "还不错" << std::endl;
            break;
        case 6:
        case 5:
            std::cout << "一般" << std::endl;
            break;
        default:
            std::cout << "不怎么样" << std::endl;
            break;
    }

    return 0;
}
  • 注意事项
    • switch 语句中表达式类型只能是整型或者字符型。
    • case 里如果没有 break,那么程序会一直向下执行
  • 总结:与 if 语句比,对于多条件判断时,switch结构清晰,执行效率高,缺点是 switch 不可以判断区间

二、循环结构

2.1 while 语句

只要给定的条件为真,while 循环语句会重复执行一个目标语句。

  • 语法
while(condition)
{
   statement(s);
}
  • 代码示例
#include <iostream>
#include <random>

int main() {

    // 创建一个 1~ 10 的随机数。
    // 使用随机设备作为种子
    std::random_device rd;
    // 使用 Mersenne Twister 引擎。
    std::mt19937 gen(rd());
    // 定义要生成随机数的范围。
    std::uniform_int_distribution<int> dis(1, 10);
    // 生成随机数。
    int system_num = dis(gen);

    // 接收用户输入。
    int input_number = 0;
    while (input_number != system_num) {
        std::cout << "请输入一个数(10以内):" << std::endl;
        std::cin >> input_number;
        if (input_number == system_num) {
            std::cout << "恭喜你,猜对啦!" << std::endl;
        } else {
            std::cout << "差一点点,请继续猜数!" << std::endl;
        }
        std::cout << "\n" << std::endl;
    }

    return 0;
}
  • 注意:在执行循环语句时候,程序必须提供跳出循环的出口,否则出现死循环。

2.2 do...while 语句

不像 forwhile 循环,它们是在循环头部测试循环条件。do...while 循环是在循环的尾部检查它的条件。

do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环。

  • 语法
do
{
   statement(s);

}while( condition );
  • 代码示例
#include <iostream>

int main() {

    int num = 0;

    do {
        
        std::cout << num << std::endl;
        // 0
        // 1
        // 2
        // 3
        // 4
        // 5
        // 6
        // 7
        // 8
        // 9
        num++;

    } while (num < 10);

    return 0;
}

2.3 for 语句

for 循环允许编写一个执行特定次数的循环的重复控制结构。

  • 语法
for ( init; condition; increment )
{
   statement(s);
}
  • init 会首先被执行,且只会执行一次。这一步可以声明并初始化任何循环控制变量。也可以不在这里写任何语句,只要有一个分号出现即可。
  • 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
  • 在执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句可以更新循环控制变量。也可以留空,只要在条件后有一个分号出现即可。
  • 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。
  • 代码示例
#include <iostream>

int main() {

    for (int i = 0; i < 5; i++) {
        std::cout << i << std::endl;
        // 0
        // 1
        // 2
        // 3
        // 4
    }
    
    return 0;
}

2.4 嵌套循环

一个循环内可以嵌套另一个循环。

  • 嵌套 for
for ( init; condition; increment )
{
   for ( init; condition; increment )
   {
      statement(s);
   }
   statement(s); 
  // 可以放置更多的语句。
}
  • 嵌套 while
while(condition)
{
   while(condition)
   {
      statement(s);
   }
   statement(s); // 可以放置更多的语句
}
  • 代码示例
#include <iostream>

int main() {

    // 利用嵌套 for 打印星形矩阵。
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            std::cout << "*" << " ";
            // * * *
            // * * *
            // * * *
        }
        std::cout << std::endl;
    }

    return 0;
}

三、跳转语句

3.1 break 语句

关键字 break 用于跳出选择结构或者循环结构。

  • 用法

    • break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。
    • 它可用于终止 switch 语句中的一个 case
    • 出现在嵌套循环中,可跳出最近的内层循环语句。
  • 代码示例

#include <iostream>

int main() {

    int n = 0;
    while (true) {
        std::cout << "n=" << n << std::endl;
        // n=0
        // n=1
        // n=2
        // n=3
        // n=4
        // n=5
        if (n == 5) {
            // n 等于 5 的时候跳出循环。
            break;
        }
        n += 1;
    }

    return 0;
}

3.2 continue 语句

在循环语句中,continue 用于跳过本次循环中余下尚未执行的语句,继续执行下一次循环。

  • 代码示例
#include <iostream>

int main() {

    for (int a = 10; a > 0; a--) {
        // 跳过偶数。
        if (a % 2 == 0) {
            continue;
        }
        std::cout << a << std::endl;
        // 9
        // 7
        // 5
        // 3
        // 1
    }

    return 0;
}
  • 注意continue 并没有使整个循环终止,而 break 会跳出循环。

3.3 goto 语句

语句允许把控制无条件转移到同一函数内的被标记的语句。

  • 注意:在任何编程语言中,都不建议使用 goto 语句。因为它使得程序的控制流难以跟踪,使程序难以理解和难以修改
  • 任何使用 goto 语句的程序可以改写成不需要使用 goto 语句的写法。
  • 语法
goto label;
..
.
label: statement;

  • 代码示例
#include <iostream>

int main() {

    std::cout << "1" << std::endl;
    // 1

    goto FLAG;

    std::cout << "2" << std::endl;
    std::cout << "3" << std::endl;
    std::cout << "4" << std::endl;

    FLAG:

    std::cout << "5" << std::endl;
    // 5

    return 0;
}
  • goto 语句一个很好的作用是退出深嵌套:
for(...) {
   for(...) {
      while(...) {
         if(...) goto stop;
         .
         .
         .
      }
   }
}
stop:
std::cout << "Error";

四、结束语

“-------怕什么真理无穷,进一寸有一寸的欢喜。”

微信公众号搜索:饺子泡牛奶