当前位置: 首页 > news >正文

C语言的选择结构

前言:

在 C 语言中,选择结构(主要是if语句和switch语句)具有重要的作用和意义,具体如下:

  1. 实现程序的分支控制
    • 根据不同的条件决定程序的执行路径,使程序能够根据不同的情况做出不同的反应。例如,在一个成绩评定程序中,可以根据学生的考试成绩划分不同的等级。如果成绩大于等于 90 分,输出 “A 等”;如果成绩在 80 到 89 分之间,输出 “B 等”,以此类推。
    • 以下是用 C 语言实现的示例代码:
   int score;printf("请输入学生成绩:");scanf("%d", &score);if (score >= 90) {printf("A 等\n");} else if (score >= 80) {printf("B 等\n");} else if (score >= 70) {printf("C 等\n");} else if (score >= 60) {printf("D 等\n");} else {printf("E 等\n");}

  1. 处理复杂的逻辑判断:
    • 在实际编程中,经常会遇到需要根据多个条件进行判断的情况。选择结构可以将这些复杂的逻辑判断进行清晰的表达,使程序易于理解和维护。
    • 例如,在一个购物系统中,根据用户的会员等级、购买金额等多个条件来确定用户的折扣率。可以使用嵌套的if语句或者switch语句来实现这样的逻辑判断。
    • 以下是一个简单的示例代码:
   int memberLevel;float purchaseAmount;float discountRate = 0.0;printf("请输入会员等级(1-3):");scanf("%d", &memberLevel);printf("请输入购买金额:");scanf("%f", &purchaseAmount);if (memberLevel == 1) {if (purchaseAmount >= 1000) {discountRate = 0.1;} else {discountRate = 0.05;}} else if (memberLevel == 2) {if (purchaseAmount >= 800) {discountRate = 0.15;} else {discountRate = 0.1;}} else {if (purchaseAmount >= 500) {discountRate = 0.2;} else {discountRate = 0.15;}}printf("折扣率为:%.2f\n", discountRate);

  1. 增强程序的灵活性:
    • 选择结构可以根据程序运行时的不同情况动态地选择执行的代码块,使程序具有更高的灵活性。例如,在一个游戏程序中,可以根据用户的选择决定游戏的难度级别、角色属性等。
    • 以下是一个游戏难度选择的示例代码:

   int difficultyLevel;printf("请选择游戏难度(1-3):");scanf("%d", &difficultyLevel);switch (difficultyLevel) {case 1:printf("游戏难度为简单。\n");break;case 2:printf("游戏难度为中等。\n");break;case 3:printf("游戏难度为困难。\n");break;default:printf("输入错误,请重新选择。\n");}

if语句

在 C 语言中,if语句是一种重要的选择结构,用于根据条件执行不同的代码块。

一、语法结构

  1. 基本形式:

    • if (条件表达式) {语句块}。如果条件表达式为真(非零值),则执行语句块中的代码;如果条件表达式为假(零值),则跳过语句块。
    • 例如:if (a > b) { printf("a is greater than b.\n"); },如果变量 a 的值大于变量 b 的值,就会输出相应的信息。
  2. 多分支形式:

    • if (条件表达式1) {语句块1} else if (条件表达式2) {语句块2}... else {语句块n}。依次判断条件表达式,如果某个条件表达式为真,则执行对应的语句块;如果所有条件都不满足,则执行 else 后的语句块。
    • 例如:if (score >= 90) { printf("A grade.\n"); } else if (score >= 80) { printf("B grade.\n"); } else if (score >= 70) { printf("C grade.\n"); } else if (score >= 60) { printf("D grade.\n"); } else { printf("F grade.\n"); },根据不同的分数范围输出不同的等级信息。

二、执行过程

  1. 条件判断:

    • 首先计算条件表达式的值。条件表达式可以是任何返回整数值的表达式,例如比较两个变量的大小、判断一个变量是否为零等。
    • 如果条件表达式的值为非零值,则认为条件为真;如果条件表达式的值为零,则认为条件为假。
  2. 执行相应的语句块:

    • 如果条件为真,则执行 if 后面的语句块。语句块可以是一条语句,也可以是多条语句组成的复合语句,用花括号 {} 括起来。
    • 如果条件为假,则继续判断下一个 else if 或 else 分支的条件,直到找到一个满足条件的分支或者执行完所有的分支。

三、应用场景

  1. 简单的条件判断:
    • 当需要根据一个简单的条件执行不同的代码时,可以使用基本形式的 if 语句。例如,判断一个数是否为偶数:

   int num;printf("请输入一个整数:");scanf("%d", &num);if (num % 2 == 0) {printf("%d 是偶数。\n", num);}

  1. 复杂的多分支判断:
    • 当需要根据多个不同的条件执行不同的代码时,可以使用多分支形式的 if 语句。例如,根据学生的成绩评定等级:

   int score;printf("请输入学生成绩:");scanf("%d", &score);if (score >= 90) {printf("A 等。\n");} else if (score >= 80) {printf("B 等。\n");} else if (score >= 70) {printf("C 等。\n");} else if (score >= 60) {printf("D 等。\n");} else {printf("E 等。\n");}

  1. 嵌套的条件判断:
    • if 语句可以嵌套使用,以实现更复杂的条件判断。例如,判断一个年份是否为闰年:
   int year;printf("请输入一个年份:");scanf("%d", &year);if (year % 4 == 0) {if (year % 100 == 0) {if (year % 400 == 0) {printf("%d 是闰年。\n", year);} else {printf("%d 不是闰年。\n", year);}} else {printf("%d 是闰年。\n", year);}} else {printf("%d 不是闰年。\n", year);}

四、注意事项

  1. 条件表达式的正确性:

    • 确保条件表达式的逻辑正确,避免出现错误的判断结果。例如,在比较两个浮点数是否相等时,由于浮点数的精度问题,不能直接使用 == 进行比较,而应该使用一个适当的误差范围进行判断。
  2. 代码的可读性:

    • 为了提高代码的可读性,可以在条件表达式中使用有意义的变量名和运算符,并且在语句块中添加适当的注释。此外,避免使用过于复杂的条件表达式,可以将复杂的条件拆分成多个简单的条件进行判断。
  3. 避免嵌套过深:

    • 过多的嵌套会使代码难以理解和维护。如果可能的话,可以使用其他的控制结构,如 switch 语句或者函数调用,来减少嵌套的层次。
  4. 考虑边界情况:

    • 在进行条件判断时,要考虑到边界情况,例如最大值、最小值、零值等。确保程序在边界情况下也能正确运行

switch语句

在 C 语言中,switch语句是一种多分支选择结构,用于根据一个表达式的值来选择执行不同的代码块。

一、语法结构

switch (表达式) {case 常量表达式1:语句块1;break;case 常量表达式2:语句块2;break;...default:语句块n;
}

  1. 表达式:通常是一个整数类型或字符类型的表达式,其值将与各个case后面的常量表达式进行比较。
  2. 常量表达式:在case后面的常量值,用于与switch表达式的值进行匹配。
  3. 语句块:当switch表达式的值与某个case的常量表达式匹配时,执行相应的语句块。
  4. break语句:用于跳出switch语句,防止继续执行下一个case的语句块。如果没有break语句,程序将继续执行下一个case的语句块,直到遇到break或者switch语句结束。
  5. default:可选的分支,当switch表达式的值与任何case的常量表达式都不匹配时,执行default分支的语句块。

二、执行过程

  1. 首先计算switch后面的表达式的值。
  2. 然后将这个值与各个case后面的常量表达式进行比较。如果找到匹配的case,则执行相应的语句块。
  3. 如果没有找到匹配的case,并且存在default分支,则执行default分支的语句块。
  4. 如果执行完某个case的语句块后没有遇到break语句,程序将继续执行下一个case的语句块,直到遇到break或者switch语句结束。

三、示例

以下是一个使用switch语句根据用户输入的数字选择不同操作的例子:

#include <stdio.h>int main() {int choice;printf("请输入一个数字(1-3):");scanf("%d", &choice);switch (choice) {case 1:printf("你选择了选项 1。\n");break;case 2:printf("你选择了选项 2。\n");break;case 3:printf("你选择了选项 3。\n");break;default:printf("无效的选择。\n");}return 0;
}

四、应用场景

  1. 当需要根据一个变量的多个不同取值执行不同的代码块时,switch语句比多个if-else if语句更加简洁和清晰。
    • 例如,根据月份输出季节:

   int month;printf("请输入月份(1-12):");scanf("%d", &month);switch (month) {case 3:case 4:case 5:printf("春季。\n");break;case 6:case 7:case 8:printf("夏季。\n");break;case 9:case 10:case 11:printf("秋季。\n");break;case 12:case 1:case 2:printf("冬季。\n");break;default:printf("无效的月份。\n");}

  1. 在处理菜单选择、状态码等具有有限个离散值的情况时,switch语句非常有用。
    • 例如,根据状态码输出相应的错误信息:

   int statusCode;printf("请输入状态码:");scanf("%d", &statusCode);switch (statusCode) {case 200:printf("请求成功。\n");break;case 404:printf("页面未找到。\n");break;case 500:printf("服务器内部错误。\n");break;default:printf("未知状态码。\n");}

五、注意事项

  1. switch表达式和case后面的常量表达式必须是整数类型(包括char类型)或枚举类型。浮点数和字符串不能作为switch表达式或case的常量表达式。
  2. case后面的常量表达式必须是唯一的,不能有重复的值。
  3. 如果某个case的语句块不需要执行任何操作,可以使用空语句;或者注释来代替。
  4. 为了避免意外的执行多个case的语句块,每个case的语句块末尾通常应该加上break语句,除非有意让程序继续执行下一个case的语句块。
  5. default分支是可选的,但在某些情况下,提供一个default分支可以处理未预料到的输入值,增加程序的健壮性

if语句和switch的区别

一、语法和结构方面

  1. if语句:

    • 语法形式为if (条件表达式) {语句块},可以单独使用,也可以通过else ifelse进行多分支判断。
    • 条件表达式可以是任意返回整数值(非零表示真,零表示假)的表达式,非常灵活,可以包括比较运算、逻辑运算、函数调用等。
    • 可以处理复杂的条件判断,尤其是涉及到范围判断和多个不同条件的组合判断时比较方便。
  2. switch语句:

    • 语法形式为switch (表达式) { case 常量表达式1: 语句块1; break;... default: 语句块n; }
    • 表达式通常是一个整数类型(包括字符类型)或枚举类型的值。
    • 主要用于对一个表达式的多个离散值进行判断,每个case对应一个特定的值。

二、执行效率方面

  1. if语句:

    • 在进行条件判断时,每次都需要对条件表达式进行计算,即使前面的条件已经满足,后面的条件表达式也可能会被计算。
    • 对于复杂的条件组合,可能需要进行多次比较和逻辑运算,执行效率相对较低。
  2. switch语句:

    • 通常在编译时会进行优化,将switch表达式的值与各个case的值进行比较的过程可能会被优化为跳转表或类似的数据结构,从而提高执行效率。
    • case的值比较密集且连续时,效率优势更加明显。

三、适用场景方面

  1. if语句:

    • 适用于各种复杂的条件判断,尤其是涉及到范围判断、多个不同条件的组合判断以及动态条件判断的情况。
    • 例如,判断一个学生的成绩是否在某个特定的分数段内,或者根据多个不同的输入参数进行复杂的逻辑判断。
  2. switch语句:

    • 适用于对一个变量的多个离散值进行判断的情况,尤其是当这些值是固定的、已知的常量时。
    • 比如,根据用户输入的菜单选项执行不同的操作,或者根据状态码进行不同的处理。

四、代码可读性方面

  1. if语句:

    • 对于复杂的条件判断,可能会使代码变得冗长和难以理解,尤其是当有多个嵌套的if-else语句时。
    • 但是,在处理一些特殊的条件判断时,可以通过合理的代码布局和注释来提高可读性。
  2. switch语句:

    • 当处理多个离散值的情况时,代码更加清晰和直观,易于理解和维护。
    • 特别是当case的值比较有规律或者可以分组时,可以使代码结构更加清晰。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 网络优化4|网络流问题|路径规划问题|车辆路径问题
  • 8月27日笔记
  • MySQL——子查询(5)带比较运算符的子查询
  • 基于springboot篮球竞赛预约平台设计与实现
  • 【Unity输入】Unity输入方式总结
  • Chrome H265 WebRTC 支持
  • NoSql数据库Redis集群
  • C++ | Leetcode C++题解之第376题摆动序列
  • 前端面试宝典【CSS篇】【10】
  • 永久去除windows11推荐产品的软件
  • OpenCV图像拼接多频段融合源码重构
  • 如何将开发工具设置成滚动鼠标改变字体大小
  • 一阶差分时间序列分析
  • [Jsprit]Jsprit学习笔记-一个简单的示例
  • 93.WEB渗透测试-信息收集-Google语法(7)
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • centos安装java运行环境jdk+tomcat
  • git 常用命令
  • Git学习与使用心得(1)—— 初始化
  • Intervention/image 图片处理扩展包的安装和使用
  • Js基础知识(四) - js运行原理与机制
  • Linux Process Manage
  • MySQL数据库运维之数据恢复
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 大数据与云计算学习:数据分析(二)
  • 配置 PM2 实现代码自动发布
  • 优秀架构师必须掌握的架构思维
  • Spring第一个helloWorld
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # 计算机视觉入门
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • $jQuery 重写Alert样式方法
  • (10)ATF MMU转换表
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (附源码)c#+winform实现远程开机(广域网可用)
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (算法)硬币问题
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .net后端程序发布到nignx上,通过nginx访问
  • .NET中使用Protobuffer 实现序列化和反序列化
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • ::前边啥也没有
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)