【mqtt参数上云和小程序开发】【第2期】三颗led驱动成功,switch语法介绍

在这里插入图片描述

好的,我们来详细讲解 C 语言中的 switch 语法。switch 语句是一种多分支选择结构,用于根据一个表达式的值来选择执行不同的代码块。它比多个 if-else if 语句更清晰、更高效。


一、 基本语法结构

switch (expression) {
    case constant_expression1:
        statements1;
        break;
    case constant_expression2:
        statements2;
        break;
    case constant_expression3:
        statements3;
        break;
    // ... 可以有多个 case 标签
    default:
        default_statements;
        break;
}

组成部分解析:

  1. switch (expression)

    • expression 必须是一个整型表达式(包括 char, int, enum 等)。
    • 它不能是浮点数、字符串或数组。
  2. case constant_expression:

    • constant_expression 必须是一个整型常量表达式(如 1, 'A', MONDAY等),不能是变量。
    • 程序会将 switch 表达式的值与每个 case 的常量值进行比较。
  3. break;

    • 关键! 用于跳出整个 switch 语句。
    • 如果省略 break,程序会继续执行下一个 case 中的语句,直到遇到 breakswitch 结束。这被称为 “case穿透”
  4. default:

    • 可选的。当所有 case 都不匹配时,会执行 default 下的语句。
    • 它可以放在 switch 语句的任何位置,但通常放在最后。

二、 执行流程

  1. 计算 switch 后面表达式的值。
  2. 将这个值与各个 case 的常量值进行比较。
  3. 如果找到匹配的 case,程序跳转到该 case 标签后的第一条语句开始执行。
  4. 执行完该 case 的代码后:
    • 如果遇到 break,则跳出整个 switch 语句。
    • 如果没有 break,则继续顺序执行后面所有 casedefault 中的代码,直到遇到 breakswitch 结束。
  5. 如果没有 case 匹配,且存在 default 标签,则执行 default 下的代码。

三、 详细示例

示例1:基本用法(判断成绩等级)
#include <stdio.h>

int main() {
    int score;
    printf("请输入分数 (0-100): ");
    scanf("%d", &score);

    // 将分数除以10,转换为单个数字,便于使用switch
    switch (score / 10) {
        case 10:
        case 9:
            printf("成绩等级: A\n");
            break;
        case 8:
            printf("成绩等级: B\n");
            break;
        case 7:
            printf("成绩等级: C\n");
            break;
        case 6:
            printf("成绩等级: D\n");
            break;
        default:
            if (score >= 0 && score <= 100) {
                printf("成绩等级: E (不及格)\n");
            } else {
                printf("无效分数!\n");
            }
            break;
    }
    return 0;
}

说明:

  • case 10: 后面没有语句和 break,所以它会"穿透"到 case 9:,实现100分和90-99分都是A等级。
  • default 中增加了额外的输入验证。
示例2:字符判断(计算器)
#include <stdio.h>

int main() {
    char operator;
    double num1, num2, result;

    printf("请输入运算符 (+, -, *, /): ");
    scanf(" %c", &operator); // 注意%c前面的空格,用于吸收之前的回车符
    printf("请输入两个数字: ");
    scanf("%lf %lf", &num1, &num2);

    switch (operator) {
        case '+':
            result = num1 + num2;
            break;
        case '-':
            result = num1 - num2;
            break;
        case '*':
            result = num1 * num2;
            break;
        case '/':
            if (num2 != 0.0) {
                result = num1 / num2;
            } else {
                printf("错误:除数不能为0!\n");
                return 1; // 非正常退出
            }
            break;
        default:
            printf("错误:无效的运算符!\n");
            return 1; // 非正常退出
    }

    printf("结果: %.2lf %c %.2lf = %.2lf\n", num1, operator, num2, result);
    return 0;
}

说明:

  • char 类型本质上是整数(ASCII码),所以可以在 switch 中使用。
  • 每个 case 处理一个特定的运算符。
示例3:与枚举配合使用(状态机)

这是 switch 最强大的应用场景之一。

#include <stdio.h>

// 定义状态枚举
typedef enum {
    STATE_IDLE,
    STATE_RUNNING,
    STATE_PAUSED,
    STATE_STOPPED
} SystemState;

void handle_state(SystemState state) {
    switch (state) {
        case STATE_IDLE:
            printf("系统处于空闲状态,等待命令...\n");
            // 执行空闲状态的任务
            break;
        case STATE_RUNNING:
            printf("系统正在运行...\n");
            // 执行运行状态的任务
            break;
        case STATE_PAUSED:
            printf("系统已暂停。\n");
            // 执行暂停状态的任务
            break;
        case STATE_STOPPED:
            printf("系统已停止。\n");
            // 执行停止和清理任务
            break;
        default:
            printf("错误:未知状态!\n");
            break;
    }
}

int main() {
    SystemState current_state = STATE_IDLE;
    
    handle_state(current_state); // 输出: 系统处于空闲状态,等待命令...
    
    current_state = STATE_RUNNING;
    handle_state(current_state); // 输出: 系统正在运行...
    
    return 0;
}

四、 关键注意事项

1. Case穿透现象

这是初学者最容易犯错的地方。

#include <stdio.h>

int main() {
    int number = 2;
    
    switch (number) {
        case 1:
            printf("一 ");
        case 2:
            printf("二 "); // 从这里开始执行
        case 3:
            printf("三 "); // 因为没有break,继续执行
        case 4:
            printf("四 "); // 继续执行
        default:
            printf("其他"); // 继续执行
    }
    return 0;
}

输出: 二 三 四 其他

如何利用Case穿透?
有时穿透是有用的,比如示例1中的成绩等级判断,或者处理多个case需要相同逻辑的情况:

char c = 'a';
switch (c) {
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
    case 'A':
    case 'E':
    case 'I':
    case 'O':
    case 'U':
        printf("是元音字母\n");
        break;
    default:
        printf("不是元音字母\n");
        break;
}
2. 变量作用域

switch 语句内声明变量需要特别注意。

错误示例:

switch (x) {
    case 1:
        int y = 10; // 错误!不能在此初始化
        printf("%d", y);
        break;
    case 2:
        // ...
        break;
}

正确做法:

switch (x) {
    case 1: {
        int y = 10; // 使用大括号创建块作用域
        printf("%d", y);
        break;
    }
    case 2:
        // ...
        break;
}
3. default的位置

default 可以放在任何位置,但执行逻辑不变。

switch (value) {
    default: // 即使放在前面,也是最后才比较
        printf("未知值");
        break;
    case 1:
        printf("一");
        break;
    case 2:
        printf("二");
        break;
}

五、 与if-else的对比

特性switch 语句if-else 语句
判断类型只能判断整型表达式可以判断任何类型的表达式(整型、浮点、指针等)
判断条件常量比较可以与变量、表达式比较,可以使用范围判断
可读性多路分支时非常清晰分支多时代码冗长
效率编译器可能优化为跳转表,效率高需要逐个条件判断
灵活性相对较低非常高

选择建议:

  • 基于一个整型变量多个离散常量进行比较时,使用 switch
  • 当需要判断范围复杂条件非整型数据时,使用 if-else

六、 综合练习

一个简单的菜单系统:

#include <stdio.h>

int main() {
    int choice;
    
    printf("=== 菜单 ===\n");
    printf("1. 开始游戏\n");
    printf("2. 加载游戏\n");
    printf("3. 设置\n");
    printf("4. 退出\n");
    printf("请选择: ");
    scanf("%d", &choice);
    
    switch (choice) {
        case 1:
            printf("游戏开始!\n");
            // 调用开始游戏的函数
            break;
        case 2:
            printf("加载存档...\n");
            // 调用加载游戏的函数
            break;
        case 3:
            printf("进入设置菜单\n");
            // 调用设置函数
            break;
        case 4:
            printf("再见!\n");
            return 0; // 直接退出程序
        default:
            printf("无效选择,请重新输入!\n");
            break;
    }
    
    printf("程序继续执行...\n");
    return 0;
}

总结

  • switch 是处理多路分支的高效工具。
  • 牢记 break 的作用,避免意外的case穿透。
  • enum 配合使用是最佳实践,能极大提高代码可读性。
  • 理解 switch 的局限性,在适合的场景下使用它。

掌握 switch 语句能让你的C语言代码更加专业和高效。

内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
在科技快速演进的时代背景下,移动终端性能持续提升,用户对移动应用的功能需求日益增长。增强现实、虚拟现实、机器人导航、自动驾驶辅助、手势识别、物体检测与距离测量等前沿技术正成为研究与应用的热点。作为支撑这些技术的核心,双目视觉系统通过模仿人类双眼的成像机制,同步获取两路图像数据,并借助图像处理与立体匹配算法提取场景深度信息,进而生成点云并实现三维重建。这一技术体系对提高移动终端的智能化程度及优化人机交互体验具有关键作用。 双目视觉系统需对同步采集的两路视频流进行严格的时间同步与空间校正,确保图像在时空维度上精确对齐,这是后续深度计算与立体匹配的基础。立体匹配旨在建立两幅图像中对应特征点的关联,通常依赖复杂且高效的计算算法以满足实时处理的要求。点云生成则是将匹配后的特征点转换为三维空间坐标集合,以表征物体的立体结构;其质量直接取决于图像处理效率与匹配算法的精度。三维重建基于点云数据,运用计算机图形学方法构建物体或场景的三维模型,该技术在增强现实与虚拟现实等领域尤为重要,能够为用户创造高度沉浸的交互环境。 双目视觉技术已广泛应用于多个领域:在增强现实与虚拟现实中,它可提升场景的真实感与沉浸感;在机器人导航与自动驾驶辅助系统中,能实时感知环境并完成距离测量,为路径规划与决策提供依据;在手势识别与物体检测方面,可精准捕捉用户动作与物体位置,推动人机交互设计与智能识别系统的发展。此外,结合深度计算与点云技术,双目系统在精确距离测量方面展现出显著潜力,能为多样化的应用场景提供可靠数据支持。 综上所述,双目视觉技术在图像处理、深度计算、立体匹配、点云生成及三维重建等环节均扮演着不可或缺的角色。其应用跨越多个科技前沿领域,不仅推动了移动设备智能化的发展,也为丰富交互体验提供了坚实的技术基础。随着相关算法的持续优化与硬件性能的不断提升,未来双目视觉技术有望在各类智能系统中实现更广泛、更深层次的应用。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
本软件提供多种基于张量理论的流动诱导纤维取向计算功能,涵盖Jeffrey模型、Folgar-Tucker模型及各向异性旋转扩散系列(如Phelps-Tucker五参数模型、iARD、pARD、MRD与Wang双参数模型)以及慢速动力学方法(包括SRF、RSC与RPR)。针对四阶方向张量,支持三维空间中的线性、二次、混合、正交各向异性、自然及IBOF闭合近似;在平面取向分析中,则提供Bingham分布、自然近似、椭圆半径法、正交各向异性D型与非正交F型等多种闭合方案。 软件可计算平面或三维条件下的完整方向分布函数,适用于瞬态或稳态过程,并整合了Jeffery、Folgar-Tucker与ARD等基础取向动力学模型。同时支持基于Phelps-Tucker理论的纤维长度分布演化模拟。 在线弹性刚度预测方面,集成了平均场模型体系,包括Halpin-Tsai公式、稀释Eshelby解、Mori-Tanaka方法及Lielens双夹杂模型,适用于单向或分布型纤维取向情况。所有刚度模型均可导出对应的热应力张量与热膨胀张量。 此外,软件具备经典层压板理论分析能力,可处理随厚度变化的纤维取向对复合材料板刚度的影响。在分布函数重构方面,提供Jeffery解析解、Bingham分布、椭圆半径法及四阶最大熵函数等多种方法用于平面取向分布的重建。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值