c语言----选择结构

news/2024/12/22 18:31:49 标签: c语言, java, 算法

基本概念

  • 选择结构是C语言中用于根据条件判断来执行不同代码块的结构。它允许程序在不同的条件下执行不同的操作,使程序具有决策能力。

if语句

  • 单分支if语句
    • 语法格式
      • if (条件表达式) { 执行语句块; }
    • 功能
      • 当条件表达式的值为真(在C语言中,非零值表示真,零值表示假)时,就会执行花括号内的语句块;如果条件表达式的值为假,则跳过语句块直接执行后面的代码。
    • 示例代码
#include <stdio.h>
int main() {
    int num = 10;
    if (num > 5) {
        printf("这个数大于5\n");
    }
    return 0;
}
 - **解释**:
   - 首先定义了一个整数变量`num`并赋值为`10`。然后在`if`语句中,条件表达式`num > 5`的值为真(因为`10 > 5`),所以会执行花括号内的`printf`语句,在屏幕上输出“这个数大于5”。
  • 双分支if - else语句
    • 语法格式
      • if (条件表达式) { 执行语句块1; } else { 执行语句块2; }
    • 功能
      • 当条件表达式的值为真时,执行语句块1;当条件表达式的值为假时,执行语句块2。这样可以根据条件在两个不同的操作之间进行选择。
    • 示例代码
#include <stdio.h>
int main() {
    int num = 3;
    if (num > 5) {
        printf("这个数大于5\n");
    } else {
        printf("这个数小于等于5\n");
    }
    return 0;
}
 - **解释**:
   - 定义整数变量`num`为`3`,在`if - else`语句中,条件表达式`num > 5`的值为假,所以会执行`else`部分的语句块,输出“这个数小于等于5”。
  • 多分支if - else if - else语句
    • 语法格式
      • if (条件表达式1) { 执行语句块1; } else if (条件表达式2) { 执行语句块2; }... else { 执行语句块n; }
    • 功能
      • 用于处理多种不同的条件情况。首先判断条件表达式1,如果为真则执行语句块1;如果为假,则继续判断条件表达式2,以此类推。如果所有的条件表达式都为假,则执行else部分的语句块(else部分可以省略)。
    • 示例代码
#include <stdio.h>
int main() {
    int score = 75;
    if (score >= 90) {
        printf("优秀\n");
    } else if (score >= 80) {
        printf("良好\n");
    } else if (score >= 60) {
        printf("及格\n");
    } else {
        printf("不及格\n");
    }
    return 0;
}
 - **解释**:
   - 定义了一个变量`score`表示成绩。通过多分支`if - else if - else`语句来判断成绩的等级。因为`75 >= 60`且`75 < 80`,所以会输出“及格”。

switch语句

  • 语法格式
    • switch (表达式) { case 常量表达式1: 执行语句块1; break; case 常量表达式2: 执行语句块2; break;... default: 执行语句块n; }
  • 功能
    • 根据表达式的值与各个case后面的常量表达式的值进行匹配。如果匹配成功,则执行对应的执行语句块,直到遇到break语句或者switch语句结束。如果没有匹配成功的case,则执行default部分的语句块(default部分可以省略)。
  • 示例代码
#include <stdio.h>
int main() {
    int day = 3;
    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期日\n");
            break;
        default:
            printf("无效的日期\n");
    }
    return 0;
}
  • 解释
    • 定义一个变量day3,在switch语句中,表达式day的值与case 3匹配成功,所以会执行case 3对应的语句块,输出“星期三”,然后遇到break语句,跳出switch语句。
  • 注意事项
    • switch语句中,case后面的常量表达式的值必须是常量,不能是变量。
    • 每个case分支后的执行语句块如果没有break语句,程序会继续执行下一个case分支的语句,这可能会导致不符合预期的结果。例如,如果在上述代码中case 3后面没有break,那么除了输出“星期三”,还会输出“星期四”、“星期五”等,直到遇到break或者switch语句结束。在这里插入图片描述

C语言中的多分支选择结构是什么?

  1. 概念

    • C语言中的多分支选择结构是一种程序控制结构,用于在多种不同的条件下执行不同的代码块。它允许程序根据多个不同的条件表达式的值来决定执行哪一个分支的代码,从而实现复杂的决策逻辑。这种结构可以处理多种可能的情况,而不仅仅是简单的“是”或“否”两种情况。
  2. if - else if - else语句实现多分支选择结构

    • 语法格式
      • if (条件表达式1) { 执行语句块1; } else if (条件表达式2) { 执行语句块2; } else if (条件表达式3) { 执行语句块3; }... else { 执行语句块n; }
    • 执行流程
      • 程序首先判断条件表达式1的值是否为真(在C语言中,非零值为真,零值为假)。如果为真,则执行语句块1,然后跳过后续所有的else ifelse部分,继续执行整个if - else if - else结构后面的代码。
      • 如果条件表达式1的值为假,则接着判断条件表达式2的值。如果条件表达式2的值为真,则执行语句块2,然后跳过后面的else ifelse部分。
      • 以此类推,当所有的else if部分的条件表达式都为假时,如果有else部分,则执行语句块n。
    • 示例代码 - 根据成绩划分等级
#include <stdio.h>
int main() {
    int score;
    printf("请输入学生成绩:");
    scanf("%d", &score);
    if (score >= 90) {
        printf("优秀\n");
    } else if (score >= 80) {
        printf("良好\n");
    } else if (score >= 70) {
        printf("中等\n");
    } else if (score >= 60) {
        printf("及格\n");
    } else {
        printf("不及格\n");
    }
    return 0;
}
 - **解释**:
   - 首先通过`scanf()`函数获取用户输入的学生成绩`score`。然后按照从高分到低分的顺序依次判断成绩所属的等级。如果成绩大于等于`90`,则输出“优秀”;如果成绩小于`90`但大于等于`80`,则输出“良好”,以此类推。如果成绩小于`60`,则输出“不及格”。
  1. switch语句实现多分支选择结构
    • 语法格式
      • switch (表达式) { case 常量表达式1: 执行语句块1; break; case 常量表达式2: 执行语句块2; break;... case 常量表达式n: 执行语句块n; break; default: 执行语句块n + 1; }
    • 执行流程
      • 首先计算switch后的表达式的值。然后将这个值与case后的各个常量表达式的值进行逐一比较。
      • 当表达式的值与某个case后的常量表达式的值相等时,就从该case分支开始执行语句块,一直执行到遇到break语句或者switch语句结束。
      • 如果表达式的值与所有case后的常量表达式的值都不相等,且存在default部分,则执行default部分的语句块;如果不存在default部分,则整个switch语句直接结束,不执行任何操作。
    • 示例代码 - 根据星期几输出信息
#include <stdio.h>
int main() {
    int day;
    printf("请输入星期几(1 - 7):");
    scanf("%d", &day);
    switch (day) {
        case 1:
            printf("星期一,新的一周开始啦。\n");
            break;
        case 2:
            printf("星期二,努力工作/学习。\n");
            break;
        case 3:
            printf("星期三,一周已经过去一半啦。\n");
            break;
        case 4:
            printf("星期四,快要到周末啦。\n");
            break;
        case 5:
            printf("星期五,明天就是周末啦。\n");
            break;
        case 6:
            printf("星期六,休息时间。\n");
            break;
        case 7:
            printf("星期日,准备迎接新的一周。\n");
            break;
        default:
            printf("输入有误,请输入1 - 7之间的整数。\n");
    }
    return 0;
}
 - **解释**:
   - 先通过`scanf()`函数获取用户输入的表示星期几的整数`day`。然后在`switch`语句中,将`day`的值与各个`case`后的常量进行比较。如果`day`的值与某个`case`的值相等,就执行相应的语句块并通过`break`语句跳出`switch`语句。如果`day`的值与所有`case`的值都不相等,则执行`default`部分的语句块,提示用户输入有误。
  1. if - else if - else和switch语句的比较与选择
    • 比较
      • 适用范围
        • if - else if - else语句可以用于处理基于范围的条件判断或者复杂的逻辑表达式。例如,在根据成绩划分等级的例子中,条件是基于成绩的范围来判断的。
        • switch语句主要用于处理表达式的值与多个离散的常量值进行匹配的情况,如根据枚举值或者固定的整数选项进行操作。
      • 灵活性
        • if - else if - else语句在条件表达式的形式上更加灵活,可以是各种复杂的关系表达式和逻辑表达式的组合。
        • switch语句的case后面必须是常量表达式,形式相对固定。
    • 选择依据
      • 如果条件是基于范围或者复杂的逻辑关系,通常使用if - else if - else语句。
      • 如果是根据一个表达式的值与多个离散的常量进行匹配,且每个分支的操作相对独立简单,使用switch语句会使代码更加简洁明了。

在这里插入图片描述

多分支选择结构的嵌套使用方法

  1. 嵌套if - else if - else语句
    • 基本概念
      • 嵌套if - else if - else结构是指在一个ifelse if或者else语句块内部再包含一个完整的if - else if - else结构。这种嵌套方式可以处理更加复杂的条件判断,用于实现多层级的决策逻辑。
    • 语法格式示例(简单示意)
if (外层条件1) {
    if (内层条件1) {
        // 执行内层语句块1
    } else if (内层条件2) {
        // 执行内层语句块2
    } else {
        // 执行内层语句块3
    }
} else if (外层条件2) {
    // 执行外层语句块2
} else {
    // 执行外层语句块3
}
  • 示例代码 - 根据学生成绩和平时表现评定奖学金等级
#include <stdio.h>
int main() {
    int score;
    char performance;
    printf("请输入学生成绩:");
    scanf("%d", &score);
    printf("请输入学生平时表现(A - 优秀,B - 良好,C - 一般):");
    scanf(" %c", &performance);  // 注意这里的空格,用于跳过前面输入的换行符
    if (score >= 90) {
        if (performance == 'A') {
            printf("一等奖学金\n");
        } else if (performance == 'B') {
            printf("二等奖学金\n");
        } else {
            printf("三等奖学金\n");
        }
    } else if (score >= 80) {
        if (performance == 'A') {
            printf("二等奖学金\n");
        } else if (performance == 'B') {
            printf("三等奖学金\n");
        } else {
            printf("无奖学金\n");
        }
    } else {
        printf("无奖学金\n");
    }
    return 0;
}
 - **解释**:
   - 首先通过`scanf()`函数获取学生成绩`score`和平时表现`performance`。
   - 外层`if - else if - else`结构根据成绩划分了不同的区间(`score >= 90`、`score >= 80`和其他情况)。
   - 在成绩大于等于`90`的分支内部,又通过一个`if - else if - else`结构根据平时表现进一步划分奖学金等级。同样,在成绩大于等于`80`的分支内部也有类似的根据平时表现划分奖学金等级的内层结构。
  1. 嵌套switch语句
    • 基本概念
      • 嵌套switch语句是指在一个switch语句的某个case分支或者default分支中再包含一个switch语句。这样可以在基于一个条件进行初步分类后,再根据另一个条件进行更细致的分类。
    • 语法格式示例(简单示意)
switch (外层表达式) {
    case 外层常量1:
        switch (内层表达式) {
            case 内层常量1:
                // 执行内层语句块1
                break;
            case 内层常量2:
                // 执行内层语句块2
                break;
            //...
            default:
                // 执行内层语句块n
        }
        break;
    case 外层常量2:
        // 执行外层语句块2
        break;
    //...
    default:
        // 执行外层语句块n
}
  • 示例代码 - 根据月份和日期判断季节和特殊节日
#include <stdio.h>
int main() {
    int month, day;
    printf("请输入月份(1 - 12):");
    scanf("%d", &month);
    printf("请输入日期(1 - 31):");
    scanf("%d", &day);
    switch (month) {
        case 3:
            if (day >= 20) {
                switch (day) {
                    case 21:
                        printf("春分\n");
                        break;
                    default:
                        printf("春季\n");
                }
            } else {
                printf("冬季\n");
            }
            break;
        case 4:
        case 5:
            printf("春季\n");
            break;
        case 6:
            if (day >= 21) {
                switch (day) {
                    case 21:
                        printf("夏至\n");
                        break;
                    default:
                        printf("夏季\n");
                }
            } else {
                printf("春季\n");
            }
            break;
        //...(后续月份的判断类似)
        default:
            printf("输入的月份有误\n");
    }
    return 0;
}
 - **解释**:
   - 首先获取用户输入的月份`month`和日期`day`。
   - 外层`switch`语句根据月份进行初步分类。例如,在`month`为`3`的分支中,又通过一个`if`语句判断日期是否大于等于`20`。如果是,再通过一个内层`switch`语句判断是否为春分(`day == 21`)或者输出是春季。在`month`为`6`的分支中也有类似的嵌套结构用于判断夏至和夏季等情况。
   - ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/d3eb4e07a4934c118bc77b999b37c4ea.png#pic_center)
  1. 混合嵌套(if - else if - elseswitch语句嵌套)
    • 基本概念
      • 这种混合嵌套方式结合了if - else if - else语句的灵活性和switch语句的简洁性,用于处理复杂且具有多层次条件的情况。可以先使用if - else if - else语句进行一些基于范围或者复杂逻辑的初步判断,然后在某个分支中使用switch语句进行更细致的分类。
    • 语法格式示例(简单示意)
if (外层条件1) {
    switch (内层表达式) {
        case 内层常量1:
            // 执行内层语句块1
            break;
        case 内层常量2:
            // 执行内层语句块2
            break;
        //...
        default:
            // 执行内层语句块n
    }
} else if (外层条件2) {
    // 执行外层语句块2
} else {
    // 执行外层语句块3
}
  • 示例代码 - 根据用户身份和操作选择进行权限验证和操作执行
#include <stdio.h>
int main() {
    int userType;
    int operation;
    printf("请输入用户类型(1 - 管理员,2 - 普通用户):");
    scanf("%d", &userType);
    printf("请输入操作(1 - 查询,2 - 修改,3 - 删除):");
    scanf("%d", &operation);
    if (userType == 1) {
        switch (operation) {
            case 1:
                printf("管理员执行查询操作\n");
                break;
            case 2:
                printf("管理员执行修改操作\n");
                break;
            case 3:
                printf("管理员执行删除操作\n");
                break;
            default:
                printf("无效操作\n");
        }
    } else if (userType == 2) {
        if (operation == 1) {
            printf("普通用户执行查询操作\n");
        } else {
            printf("普通用户无此权限\n");
        }
    } else {
        printf("无效用户类型\n");
    }
    return 0;
}
 - **解释**:
   - 先通过`scanf()`函数获取用户类型`userType`和操作选择`operation`。
   - 外层`if - else if - else`结构根据用户类型进行初步划分。对于管理员(`userType == 1`)类型,通过一个`switch`语句根据操作选择进一步执行不同的操作。对于普通用户(`userType == 2`)类型,通过一个`if`语句判断是否为查询操作,若是则允许执行,否则提示无此权限。如果用户类型无效,则输出相应提示。

http://www.niftyadmin.cn/n/5795707.html

相关文章

workman服务端开发模式-应用开发-后端api登录之浏览器版本工具开发

一、浏览器版本工具开发 在根目录下extend文件夹下Other文件夹下创建浏览器控制工具并命名为Browser.php&#xff0c;代码如下&#xff1a; <?php /*** 浏览器管理* User: 龙哥 三年风水* Date: 2024/12/21/0021* Time: 21:58*/ namespace Other; class Browser {/*** 获取…

《Vue3实战教程》5:响应式基础

如果您有疑问&#xff0c;请观看视频教程《Vue3实战教程》 响应式基础​ API 参考 本页和后面很多页面中都分别包含了选项式 API 和组合式 API 的示例代码。现在你选择的是 组合式 API。你可以使用左侧侧边栏顶部的“API 风格偏好”开关在 API 风格之间切换。 声明响应式状态…

java 基于冷热数据分离的思想设计LRU链表

java 基于冷热数据分离的思想设计LRU链表 1. LRUCache 伪代码 import java.util.HashMap; import java.util.Map;public class LRUCache {private final int capacity; // 缓存的最大容量private final Map<Integer, Node> map; // 用于快速查找节点的哈希表private fi…

Qt5HttpServer : Qt官方的HTTP服务器

QtHttpServer在Qt6已经默认编译集成。 下面介绍Qt5的编译x64的方法&#xff1a; 最后得到Qt5HttpServer.dll 1. 下载qhttpserver源码到任意目录 git clone https://code.qt.io/qt/qthttpserver.git -b master 或 git clone https://code.qt.io/qt/qthttpserver.git -b 5.15 …

自动驾驶控制与规划——Project 3: LQR车辆横向控制

目录 零、任务介绍一、系统建模1.1 连续模型1.2 离散化 二、算法2.1 离散时间LQR2.2 前馈控制 三、代码实现四、效果展示 零、任务介绍 补全src/ros-bridge/carla_shenlan_projects/carla_shenlan_lqr_pid_controller/src/lqr_controller.cpp中的TODO部分&#xff0c;实现基于…

Spring Boot 核心技术解析与应用实践

1.Spring Boot 需要独立的容器运行吗&#xff1f; Spring Boot 应用程序本身不需要独立的容器来运行&#xff0c;因为它可以被打包成一个包含所有依赖&#xff08;包括嵌入式HTTP服务器&#xff0c;如Tomcat、Jetty或Undertow&#xff09;的可执行JAR文件。这意味着你可以直接…

aiy【4】

那天下课&#xff0c;我目光呆滞地坐在位置上涂唇膏。 忽然又又想到他 到他位置旁笑他和朋友们打闹 上课铃响了 我的朋友&#xff08;男&#xff09;S小声急促的和我说&#xff1a;快&#xff01;快&#xff01;好机会&#xff01; 我红着脸吻了他的手 很快 S兴奋的叫了…

利用 Python 解决 “奇数之和” 问题

一、问题描述 在这个问题场景中&#xff0c;有着特定的时间和内存限制&#xff0c;每次测试时间限制为 2 秒&#xff0c;每个测试的内存限制为 256 MB。我们会获得两个整数 n 和 k&#xff0c;任务是判断 n 是否可以表示为 k 个不同的正奇数&#xff08;不能被 2 整除的整数&a…