嵌入式学习第11天——C语言选择结构

news2025/1/13 15:32:48

2024年7月29日 第11天

选择(分支)结构

分支结构:又被称为选择结构

概念

选择结构:根据条件成立与否,选择相应的操作。

条件构建

  • 关系表达式:含有关系运算符的表达式(>,<,>=,<=,!=,==)

  • 逻辑表达式:含有逻辑运算符的表达式(&&,||,!),往往是用来构建复杂的复合条件,比如:

     if(year % 100 == 0 && year % 4 !=0)  // 这种既含有关系表达式,又含有逻辑表达式的条件叫做复合条件
  • 常量/变量:值是否非0,取值(0|1)

    注意:类似以下写法,是无效的,没有意义的。

     if(x+y) // 编译通过,但没有实际意义,不建议这样写
     if(5*6)

选择结构的形式

单分支

语法:

 if(条件表达式)
 {
     语句1;
 }

说明:条件表达式成立,执行语句1,否则跳过该分支结构。单分子条件不满足可以不执行。

例子:

 if a = 5;
 if(a < 0)
 {
     a = -a;
 }
 printf("a=%d\n");
 /**
 * 需求:从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成>小写字母后输出,否则输出原来输入的字符
 */
 #include <stdio.h>
 ​
 int main()
 {
     //声明一个变量,存放从键盘录入的字符
     char c;
 ​
     printf("请输入一个英文字母:\n");
     scanf("%c",&c);
 ​
     //判断
     if(c >= 'A' && c <='Z')
     {
         //c = c + 32;
         c += 32;
     }
     printf("输入的字符是:%c\n",c);
 ​
     return 0;
 }
 /*********************************************************
 请输入一个英文字母:
 V
 输入的字符是:v
 **********************************************************/
双分支

语法:

 if(条件表达式)
 {
     语句1;
 }
 else
 {
     语句2;
 }

说明: 条件表达式 成立,执行语句1,否则执行语句2。双分支不管条件是否满足,都要执行。

例子:

 #include <stdio.h>
 ​
 int main(void)
 {
     //申明三个变量来存放计算数
     double a,x,y;
 ​
     //通过键盘输入a,x
     printf("请输入两个数字:\n");
     scanf("%lf,%lf",&a,&x);
 ​
     //检验除数
     if(x != 0 && a != 0)
     {
        y = 1/x + 1/a;
     }
     else
     {
        y = 10000;
     }
     //输出
     printf("y=%f\n",y);
 ​
     return 0;
 }
 /************************************************
 请输入两个数字:
 2,4
 y=0.750000
 请输入两个数字:
 0,0
 y=10000.000000
 ****************************************************/
三目运算符

语法:

 表达式1?表达式2:表达式3;

说明:?:条件运算符,主要可以简化双分支为同一变量赋值的操作。

求值过程:先计算表达式1的值,非0,则将表达式2的结果作为条件运算符的最终结果;否则将表达式3的结果作为条件运算符最终结果

案例:

 #include <stdio.h>
 ​
 int main(void)
 {
     //需求:求a,b两个数中最大数
 ​
     //写法1:正常写法
     int a = 5,b = 3;
     if(a > b)
     {
        printf("最大数是:%d\n",a);
     }
     else
     {
        printf("最大数是:%d\n",b);
     }
 ​
     //写法2:省略{}
     int a1 = 5,b1 = 3;
     if(a1 > b1)
        printf("最大数是:%d\n",a1);
 ​
     else
        printf("最大数是:%d\n",b1);
 ​
     //写法3:三目运算符
     int a2 = 5,b2 = 3;
     int ret = a2 > b2 ? a2 : b2;
     printf("最大数是:%d\n",ret);
     return 0;
 }
 /************************************************
 最大数是:5
 最大数是:5
 最大数是:5
 ***********************************************/

案例:

 #include <stdio.h>
 ​
 int main()
 {
     //需求:输入两个实数,按代数值 由小到大的顺序输出这两个实数
 ​
     //申明变量,存储操作数
     int a,b;
 ​
     printf("请输入两个数值作为操作数:\n");
     scanf("%d,%d",&a,&b);
 ​
     //校验
     //方式1
     if(a > b)
     {
         printf("由小到大的顺序是:%d,%d\n",b,a);
     }
     else
     {
         printf("由小到大的顺序是:%d,%d\n",a,b);
     }
 ​
     //方式2
     //创建一个临时变量,用来存放交换信息
     int t = 0;
     if(a >b)
     {
         t = a;
         a = b;
         b = t;
      }
     printf("由小到大的顺序是:%d,%d\n",a,b);
 ​
     return 0;
 }
 /********************************************
 请输入两个数值作为操作数:
 4,5
 由小到大的顺序是:4,5
 由小到大的顺序是:4,5
 ​
 请输入两个数值作为操作数:
 6,3
 由小到大的顺序是:3,6
 由小到大的顺序是:3,6
 **********************************************/

案例:

 #include <stdio.h>
 ​
 int main()
 {
     //
     //
     int a,b,c,t;
     printf("请从键盘输入三个数:\n");
     scanf("a=%d,b=%d,c=%d",&a,&b,&c);
 ​
     //条件判断
     if(a > b)
     {
        t = a;
        a = b;
        b = t;
     }
     if(a > c)
     {
        t = a;
        a = c;
        c = t;
     }
     if(b > c)
     {
        t = b;
        b = c;
        c = t;
     }
     printf("三个数字由小到大是:%d,%d,%d\n",a,b,c);
 ​
     return 0;
 }
 /**************************************************
 请从键盘输入三个数:
 a=5,b=8,c=3
 三个数字由小到大是:3,5,8
 *******************************************************/
多分支

语法:

 if(条件1)
 {
     语句1;
 }
 else if(条件2)
 {
          语句2;
 }
 ...
 else {
          语句n+1;
 }

案例:

 #include <stdio.h>
 ​
 int main()
 {
     //需求:编写一个程序,要求输入一个x值,输出y值
 ​
     //方法1:嵌套的if...
     int x,y;
 ​
     printf("请输入一个整数x值:\n");
     scanf("%d",&x);
 ​
     //条件判断
     if(x < 0)
     {
         y = -1;
     }
     else
     {
        if(x == 0)
        {
              y = 0;
        }
        else
        {
              y = 1;
         }
     }
 ​
      printf("方式1-输出y的值是:%d\n",y);
 ​
     //方式2:多分支if...else if...else...
 ​
      //条件判断
      if(x < 0)
      {
          y = -1;
      }
      else if(x == 0)
      {
          y = 0;
      }
      else
      {
          y = 1;
      }
     printf("方式2-输出y的值是:%d\n",y);
 ​
     return 0;
 }
 /******************************************
 请输入一个整数x值:
 6
 方式1-输出y的值是:1
 方式2-输出y的值是:1
 ​
 请输入一个整数x值:
 0
 方式1-输出y的值是:0
 方式2-输出y的值是:0
 ​
 请输入一个整数x值:
 -5
 方式1-输出y的值是:-1
 方式2-输出y的值是:-1
 ******************************************/

案例:

 #include <stdio.h>
 /**
  *需求:高校要求对实训学生根据实训成绩进行评级
         范围:0 <= score <= 100;
         评级:
              score >= 90 优秀
              score >= 80 良好
              score >= 70 中等
              score >= 60 及格
              score < 60  不及格
  */
 int main()
 {
     //声明一个变量,存储成绩
     int score;
     printf("请录入学生成绩:\n");
     scanf("%d",&score);
  
     //对score进行合法校验
     if(score >= 0 && score <= 100)
     {
         //对合法成绩进行评级
         if(score >= 90)
         {
             printf("优秀\n");
         }
         else if(score < 90 && score >= 80)
         {
             printf("良好\n");
         }
         else if(score < 80 && score >= 70)
         {
             printf("中等\n");
         }
         else if(score < 70 && score >= 60)
         {
             printf("及格\n");
         }
         else
         {
             printf("不及格\n");
         }
     }
     else
     {
         //成绩不合法
         printf("您输入的成绩不合法,请重新录入!\n");
     }
 ​
     return 0;
 }
 /***************************************************
 请录入学生成绩:
 89
 良好
 ​
 请录入学生成绩:
 58
 不及格
 ​
 请录入学生成绩:
 120
 您输入的成绩不合法,请重新录入!
 *******************************************************/
switch

语法:

 switch(表达式) // 不能是布尔型和 浮点型
 {
     case 常量表达式1:
         语句体1;
         break;
     case 常量表达式2:
         语句体2;
         break;
     ...
     case 常量表达式n:
         语句体n;
         break;
     default:
         语句体n+1;
         break;// 可以省略
 }

说明:

(1)switch后括号内的表达式可以是任何类型的表达式;

(2)若表达式的值与某个常量表达式的值相等时,执行此case后面的语句;若没有相等的值时,执行default后面的语句;

(3)每个case后面的常量表达式的值都必须不相同,否则出现矛盾;

(4)各个case 和default出现的次序不影响执行结果;

(5)case后面的语句中如果没有break语句,则执行完本case后的语句会接着执行下面的case(case穿透);

(6)多个case可共用一组语句。

注意:

1.表达式一般写一个变量,变量的值是一个确定的常量。

2.当遇到break或者switch语句的右大括号时,switch语句结束。

3.表达式中的数据类型:char,short,int,long,long long,不能是浮点型。

表达式和常量的数据类型要一致(支持隐式转换),比较是否相同。

案例:

 #include <stdio.h>
 /**
  *需求:高校要求对实训学生根据实训成绩进行评级
         范围:0 <= score <= 100;
         评级:
              100 > score >= 90  优秀 90~99/10 == 9 && 100/10 == 10
              90 > score >= 80   良好 80~89/10 == 8
              80 > score >= 70   中等 70~79/10 == 7
              70 > score >= 60   及格 60~69/10 == 6
              score < 60  不及格
  */
 int main()
 {
     int score;//成绩
 ​
     printf("请输入实训成绩:\n");
     scanf("%d",&score);
 ​
     if(score >= 0 && score <= 100)
     {
         //对成绩进行加工
         int l = score / 10;
         switch(l)
         {
             case 10://100分
             case 9://90~99分
                 printf("优秀\n");//这里:多个case共用一块代码
                 break;
             case 8://80~89分
                 printf("良好\n");
                 break;
             case 7://70~79分
                 printf("中等\n");
                 break;
             case 6://60~69分
                 printf("及格\n");
                 break;
             default:
                 printf("不及格\n");
         }
 ​
     }
     else
     {
         printf("录入的成绩不合法!\n");
     }
     return 0;
 }
 /*****************************************
 请输入实训成绩:
 100
 优秀
 ​
 请输入实训成绩:
 120
 录入的成绩不合法!
 ​
 请输入实训成绩:
 78
 中等
 ​
 请输入实训成绩:
 58
 不及格
 *********************************************/

案例:

 /**
  *需求:实现简易计算器,要求实现+,-,x,/运算
  */
 #include <stdio.h>
 ​
 int main()
 {
     printf("简易计算机 v1.0\n");
     printf("请输入两个操作数:\n");
 ​
     double x,y;
     char ch;
     scanf("%lf,%lf",&x,&y);
     scanf("%c",&ch);
     printf("请输入运算符:(+、-、.*、/)\n");
     scanf("%c",&ch);
 ​
     //计算
     switch(ch)
     {
         case '+':
             printf("%.2lf+%.2lf=%.2lf\n",x,y,x+y);
             break;
         case '-':
             printf("%.2lf-%.2lf=%.2lf\n",x,y,x-y);
             break;
         case '.':
         case '*':
             printf("%.2lf*%.2lf=%.2lf\n",x,y,x*y);
             break;  
         case '/':
             if(y == 0)
             {
                 printf("除数不能为0\n");   
             }
             else
             {
                 printf("%.2lf/%.2lf=%.2lf\n",x,y,x/y);
             }
             break;
         defalut:
             printf("您的输入错误!\n");
 ​
     }
     return 0;
 }
 /*************************************
 简易计算机 v1.0
 请输入两个操作数:
 3,5
 请输入运算符:(+、-、.*、/)
 +
 3.00+5.00=8.00
 ​
 简易计算机 v1.0
 请输入两个操作数:
 6,2
 请输入运算符:(+、-、.*、/)
 -
 6.00-2.00=4.00
 ​
 简易计算机 v1.0
 请输入两个操作数:
 3,4
 请输入运算符:(+、-、.*、/)
 *
 3.00*4.00=12.00
 ​
 简易计算机 v1.0
 请输入两个操作数:
 8,4
 请输入运算符:(+、-、.*、/)
 /
 8.00/4.00=2.00
 *****************************************/

switch语句的case穿透:

  1. case穿透:当case后的break被省略;就会直接执行它后面紧跟的case中的语句(不会判断表达式是否和它后面的case常量是否相同),这样的现象称之为case穿透。

  2. default语句一般放在所有case之后,表明所有的case都不成立时,执行default中的语句;default语句可以放在switch语句{}内的任意位置。

总结

  • 如果需要一个判断结果,使用单分支

  • 如果需要两个判断结果,且智能有两个判断结构,使用双分支

  • 如果需要判断N个结果中的某几个,或者所以,使用多分支

扩展

条件表达式中的运算符优先级

逻辑非(!)> 算术运算符(+-*/%)> 关系运算符(> < >= <= != ==)> 逻辑运算符(&&、||)> 赋

值运算符(=、+=)

设置vimtab字符数

 set tabstop=4
 set shiftwidth=4
 set expandtab

以上是嵌入式学习第11天笔记,有什么还请指正,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1959255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle大师Roger Cornejo的推荐:使用ASH诊断Oracle解析故障

这篇文章被Oracle大师Roger Cornejo在X平台上推荐&#xff08;见下图&#xff09;&#xff0c;英文原文在&#xff1a; Diagnosing Parsing Issue with ASH 解析&#xff0c;尤其是硬解析&#xff0c;是非生产性操作&#xff0c;会消耗大量系统资源&#xff0c;导致库缓存争用…

文档数据库--MongoDB

文章目录 MongoDB介绍主要用途和特点对比关系型数据库和关系型数据库最大的不同什么时候使用MongoDBMongoDB数据结构MongoDB参考资料 MongoDB部署和访问二进制安装脚本安装MongoDB后台管理shellmongodb数据库命令mongo的helpdb.mycoll.help() mongosh的helpshow dbsuse dbnamem…

JAVA里的多线程综合练习题

练习1 package lx1;/*一共有1000张电影票,可以在两个窗口领取,假设每次领取的时间为3000毫秒, 要求:请用多线程模拟卖票过程并打印剩余电影票的数量*/ public class MyThread extends Thread {static int ticket 1000;//多个线程对象共享同一个电影票//第一种方式实现多线程&…

生成式:PolyGen: An Autoregressive Generative Model of 3D Meshes【附件】

论文:PolyGen: An Autoregressive Generative Model of 3D Meshes OBJ坐标变换: # Transpose so that z-axis is vertical.vertices = vertices[:, [2, 0, 1]]变换前: 对应数据:

springboot 微信消息推送 springboot sse推送

目录 一、springboot 微信消息推送 springboot sse推送 1、在 Spring 框架中实现 2、传统的 Servlet 中实现 一、springboot 微信消息推送 springboot sse推送 关于 SSE SSE 全程 Server Send Event&#xff0c;是 HTTP 协议中的一种&#xff0c;Content-Type 为 text/event…

MySQL存储引擎MyISAM和InnoDB

1.1MySQL存储引擎 1.1.1概述 1、什么是存储引擎 MySQL中的数据用各种不同的技术存储在文件&#xff08;或内存&#xff09;中。这些技术中的每一种都使用不同的存储机制、索引技巧、锁定水平并且提供广泛的、不同的功能和能力&#xff1b;通过选择不同的技术&#xff0c;能够…

JavaScript - 如何安装和配置Yarn包管理器

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有疑问和建议&#xff0c;请私信或评论留言&#xff01; 前言 Yarn是一个快速…

Langchain--如何使用大模型 2.0

【&#x1f34a;易编橙终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官、CSDN人工智能领域优质创作者 。 Langch…

集合竞价逐笔数据验证,level2行情接口验证

最近做集合竞价的策略&#xff0c;用的level2数据。集合竞价阶段推送数据量很大&#xff0c;但是不确定有没有因为网络原因的数据纰漏&#xff0c;所以需要验证一下。 把今天所有的数据记录了日志&#xff0c;其中筛选了09:25集合竞价的推送&#xff1a; grep 2024/07/29 09:2…

Linux服务器安装Zabbix7.0客户端实战记录和问题记录

1、获取最新的Zabbix客户端包&#xff0c;不同的linux的系统选择不同的安装包 阿里云镜像站 按照一下的格式惊醒编辑替换自己的安装包 openEuler&#xff1a;rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/7.0/rhel/9/x86_64/zabbix-release-7.0-4.el9.noarch.rpm?sp…

Python 实现股票指标计算——DKX

DKX - 多空线 1 公式 MID&#xff1a;(3*CLOSELOWOPENHIGH)/6&#xff1b; DKX&#xff1a;(20*MID)19*REF(MID&#xff0c;1)18*REF(MID&#xff0c;2)17*REF(MID&#xff0c;3) 16*REF(MID&#xff0c;4)15*REF(MID&#xff0c;5)14*REF(MID&#xff0c;6) 13*REF(MID&a…

springboot高职院校毕业生信息管理系统-计算机毕业设计源码27889

摘 要 基于Java语言开发的高职院校毕业生信息管理系统旨在提供一个便捷、高效的方式来管理毕业生的相关信息。系统包括学生基本信息管理、成绩管理、就业信息管理等模块&#xff0c;通过界面友好、操作简单的设计&#xff0c;方便管理员快速查询和更新学生信息。系统还提供数据…

Vue2从基础到实战(指令修饰符)详解

什么是指令修饰符&#xff1f; 指令修饰符就是通过“.”指明一些指令后缀 不同的后缀封装了不同的处理操作 —> 简化代码 按键修饰符 keyup.enter —>当点击enter键的时候才触发 v-model修饰符 v-model.trim —>去除首位空格 v-model.number —>转数字 事件修…

使用docker在CentOS 7上安装php+mysql+nginx环境教程并运行WordPress

文章目录 一、安装docker1、切换yum源并更新系统2、卸载旧版docker3、配置Docker的yum库4、安装Docker5、启动和校验Docker6、配置镜像加速6.1、注册阿里云账号6.2、开通镜像服务6.3、配置镜像加速二、部署php+mysql+nginx环境1、准备目录结构2、拉取镜像3、运行容器并从中拷贝…

【Opencv】模糊

消除噪声 用该像素周围的平均值代替该像素值 4个函数 blur():最经典的 import os import cv2 img cv2.imread(os.path.join(.,dog.jpg)) k_size 7 #窗口大小&#xff0c;数字越大&#xff0c;模糊越强 img_blur cv2.blur(img,(k_size,k_size)) #窗口是正方形&#xff…

用依赖倒置和控制反转,突破Golang循环调用限制之后的思考

在软件开发中&#xff0c;随着项目规模的扩大和业务逻辑的复杂化&#xff0c;重构代码变得越来越重要。本文将介绍如何在既有代码基础上&#xff0c;通过依赖倒置&#xff08;DIP&#xff09;和控制反转&#xff08;IoC&#xff09;&#xff0c;实现新增加的代码可以循环引用到…

UI设计经验心得:优化设计流程与实战技巧分享

随着互联网的快速发展&#xff0c;UI 设计在中国也逐渐发展起来。UI 设计的目的不仅仅是让用户享受视觉享受&#xff0c;而是解决用户如何与互联网设备互动。因此&#xff0c;UI 设计是通过深入研究用户的使用习惯和操作逻辑来设计界面的互动和视觉效果。那么&#xff0c;UI 设…

邮箱API在CRM系统中如何高效的应用与集成?

邮箱API的高级功能和使用指南&#xff1f;怎么安全集成邮箱API&#xff1f; CRM系统已成为企业与客户保持联系的关键工具。通过集成邮箱API&#xff0c;企业可以大幅提升CRM系统的功能和效率。AokSend将探讨邮箱API在CRM系统中的高效应用与集成。 邮箱API&#xff1a;主要功能…

龙迅LT8642UXE 矩阵HDMI *4转HDMI *2输出切换芯片,支持HDMI 2.0,可带HDCP

LT8642UXE描述&#xff1a; LT8642UXE HDMI2.0/1.4交换机具有4&#xff1a;2的开关&#xff0c;符合HDMI2.0/1.4规格&#xff0c;最大6Gbps高速数据速率&#xff0c;自适应均衡RX输入和预先强调的TX输出&#xff0c;以支持长电缆应用程序。LT8642UXE HDMI2.0/1.4交换机自动检测…

JVM—运行时数据区域

Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。 1、程序计数器—线程私有 字节码解释器工作时通过改变这个计数器的值&#xff0c;选取下一条执行的字节码指令。程序计数器是程序控制的指示器&#xff0c;分支、循环、跳转、异常处理、线…