【学会到精通C++】【3】程序流程控制 - 分支与循环

学会到精通C++:程序流程控制 - 分支与循环 (3/100)

本系列目标:从零基础系统学习C++,逐步深入核心概念与现代特性,最终达到精通水平
当前进度:第三篇 - 掌握程序执行流程的控制(分支与循环结构)

一、流程控制的重要性

程序的世界并非总是线性执行,我们需要根据条件做出决策,或重复执行特定任务。流程控制是编程的核心基础,它让代码具备智能决策高效处理能力。在本篇中,我们将深入探讨:

  1. 条件分支语句(if/else, switch)
  2. 循环结构(while, do-while, for)
  3. 流程控制关键字(break, continue)
  4. 嵌套控制结构

二、条件分支:程序决策的艺术

1. if 语句基础

if (condition) {
    // 条件为真时执行的代码
}

示例:判断数字正负

int num = -5;
if (num < 0) {
    std::cout << num << " 是负数" << std::endl;
}

2. if-else 语句

if (condition) {
    // 条件为真时执行
} else {
    // 条件为假时执行
}

示例:判断奇偶数

int number = 7;
if (number % 2 == 0) {
    std::cout << number << " 是偶数" << std::endl;
} else {
    std::cout << number << " 是奇数" << std::endl;
}

3. else-if 链式判断

if (condition1) {
    // 条件1为真
} else if (condition2) {
    // 条件2为真
} else {
    // 所有条件都不满足
}

示例:成绩等级划分

int score = 85;
if (score >= 90) {
    std::cout << "成绩等级: A" << std::endl;
} else if (score >= 80) {
    std::cout << "成绩等级: B" << std::endl;
} else if (score >= 70) {
    std::cout << "成绩等级: C" << std::endl;
} else if (score >= 60) {
    std::cout << "成绩等级: D" << std::endl;
} else {
    std::cout << "成绩等级: F" << std::endl;
}

4. 三元条件运算符(简洁的条件表达式)

variable = (condition) ? expression_true : expression_false;

示例

int a = 10, b = 20;
int max = (a > b) ? a : b;
std::cout << "较大的数是: " << max << std::endl;

三、switch 语句:多路分支选择

1. 基本语法结构

switch (expression) {
    case value1:
        // 代码块1
        break;
    case value2:
        // 代码块2
        break;
    // 更多case...
    default:
        // 默认代码块
}

2. 工作日判断示例

int day = 3;
switch (day) {
    case 1:
        std::cout << "星期一" << std::endl;
        break;
    case 2:
        std::cout << "星期二" << std::endl;
        break;
    case 3:
        std::cout << "星期三" << std::endl;
        break;
    case 4:
        std::cout << "星期四" << std::endl;
        break;
    case 5:
        std::cout << "星期五" << std::endl;
        break;
    case 6:
    case 7:
        std::cout << "周末" << std::endl;
        break;
    default:
        std::cout << "无效的日期" << std::endl;
}

3. switch 使用要点

  • 表达式类型:必须是整型或枚举类型(C++17起支持字符串)
  • break的重要性:防止"穿透"执行下一个case
  • case合并:多个case共享相同代码块
  • default作用:处理未匹配的情况

四、循环结构:重复执行的艺术

1. while 循环

while (condition) {
    // 循环体代码
}

示例:计算1到100的和

int sum = 0, i = 1;
while (i <= 100) {
    sum += i;
    i++;
}
std::cout << "1到100的和为: " << sum << std::endl;

2. do-while 循环

do {
    // 循环体代码(至少执行一次)
} while (condition);

示例:用户输入验证

int input;
do {
    std::cout << "请输入1-100之间的数字: ";
    std::cin >> input;
} while (input < 1 || input > 100);
std::cout << "你输入了有效的数字: " << input << std::endl;

3. for 循环(最常用)

for (initialization; condition; increment) {
    // 循环体代码
}

示例:打印乘法表

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        std::cout << j << "×" << i << "=" << i*j << "\t";
    }
    std::cout << std::endl;
}

4. 基于范围的 for 循环(C++11)

for (declaration : range) {
    // 循环体代码
}

示例:遍历数组

int numbers[] = {2, 4, 6, 8, 10};
for (int num : numbers) {
    std::cout << num << " ";
}
std::cout << std::endl;

五、循环控制关键字

1. break 语句

  • 立即终止最内层循环
  • 在switch中退出当前case

示例:查找数组中特定元素

int arr[] = {5, 3, 8, 2, 9, 4};
int target = 8;
bool found = false;

for (int i = 0; i < 6; i++) {
    if (arr[i] == target) {
        found = true;
        std::cout << "找到目标值 " << target << " 在索引 " << i << std::endl;
        break; // 找到后立即退出循环
    }
}

2. continue 语句

  • 跳过当前迭代,进入下一次循环

示例:打印1-100的奇数

for (int i = 1; i <= 100; i++) {
    if (i % 2 == 0) {
        continue; // 跳过偶数
    }
    std::cout << i << " ";
}
std::cout << std::endl;

六、综合应用:简易计算器

#include <iostream>
#include <cmath> // 用于数学函数

int main() {
    char operation;
    double num1, num2;
    bool continueCalculation = true;

    while (continueCalculation) {
        std::cout << "\n简易计算器 (支持 + - * / ^)" << std::endl;
        std::cout << "输入第一个数字: ";
        std::cin >> num1;
        
        std::cout << "输入运算符 (+, -, *, /, ^): ";
        std::cin >> operation;
        
        std::cout << "输入第二个数字: ";
        std::cin >> num2;

        switch (operation) {
            case '+':
                std::cout << "结果: " << num1 + num2 << std::endl;
                break;
            case '-':
                std::cout << "结果: " << num1 - num2 << std::endl;
                break;
            case '*':
                std::cout << "结果: " << num1 * num2 << std::endl;
                break;
            case '/':
                if (num2 != 0) {
                    std::cout << "结果: " << num1 / num2 << std::endl;
                } else {
                    std::cout << "错误:除数不能为零!" << std::endl;
                }
                break;
            case '^':
                std::cout << "结果: " << pow(num1, num2) << std::endl;
                break;
            default:
                std::cout << "无效的运算符!" << std::endl;
        }

        char choice;
        std::cout << "继续计算吗? (y/n): ";
        std::cin >> choice;
        continueCalculation = (choice == 'y' || choice == 'Y');
    }

    std::cout << "感谢使用计算器!" << std::endl;
    return 0;
}

七、常见错误与调试技巧

  1. 无限循环:忘记更新循环变量

    // 错误示例:缺少i++导致无限循环
    int i = 0;
    while (i < 10) {
        std::cout << i << " ";
        // 忘记 i++;
    }
    
  2. switch穿透问题:缺少break语句

    // 错误示例:缺少break导致穿透
    switch (day) {
        case 1: std::cout << "周一";
        case 2: std::cout << "周二"; // 当day=1时会连续输出两个结果
    }
    
  3. 浮点数精度问题:避免使用浮点数作为循环计数器

    // 不推荐:浮点数精度问题
    for (double d = 0.0; d != 1.0; d += 0.1) {
        // 可能因精度问题无法精确达到1.0
    }
    
  4. 调试技巧

    • 使用IDE调试器设置断点
    • 打印中间变量值
    • 简化复杂条件表达式
    • 使用大括号明确代码块范围

八、总结与要点回顾

  1. 分支结构

    • if/else if/else:灵活处理各种条件
    • switch:高效处理多路分支
    • 三元运算符:简洁的条件赋值
  2. 循环结构

    • while:条件前置循环
    • do-while:条件后置循环(至少执行一次)
    • for:精确控制迭代次数
    • 范围for:简洁遍历集合
  3. 控制关键字

    • break:立即退出循环
    • continue:跳过当前迭代
  4. 最佳实践

    • 避免深层嵌套(超过3层应重构)
    • 循环条件确保可终止
    • 复杂条件拆分为多个变量
    • 始终使用大括号{}明确作用域

九、实战练习

  1. 数字金字塔

    输入:5
    输出:
        1
       121
      12321
     1234321
    123454321
    
  2. 质数检测器

    • 判断用户输入的数字是否为质数
    • 优化:只需检查到sqrt(n)即可
  3. 斐波那契数列生成器

    • 输出指定数量的斐波那契数列
    • 1, 1, 2, 3, 5, 8, 13…

十、下篇预告:函数深度解析

在下一篇中,我们将深入探索C++函数的强大功能:

  • 函数参数传递(值传递 vs 引用传递)
  • 函数重载与名称修饰
  • 默认参数与内联函数
  • 函数模板初探
  • 递归函数原理与应用

“编程不是关于你会多少种语言,而是你如何用它们解决问题。”
掌握流程控制,让你的代码具备决策与重复执行的能力,这是构建复杂程序的基石!

今日行动

  1. 实现三个实战练习
  2. 尝试用不同循环结构解决同一问题
  3. 思考:如何优化嵌套循环的性能?

下一篇:函数深度解析 - 构建模块化程序 (4/100)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值