C语言(分支结构)

问题引出

我们在程序设计往往会遇到如下的问题,比如下的函数的计算。
在这里插入图片描述
也就是我们是必须要通过一个条件的结果来选择下一步的操作,算法上属于一个分支结构,C语言中实现分支结构主要使用if语句。

条件判断

根据某个条件成立与否,决定是否执行指定的任务(操作)。
在这里插入图片描述
条件判断的结果是逻辑值(布尔类型值,也就是说分支语句的条件可以使用关系表达式和逻辑表达式),在程序中用真(1)和假(0)来表示。

关系运算及其表达式

关系运算符及其优先次序

关系运算符是用来进行比较的符号,C语言中提供了6种关系运算符:
在这里插入图片描述

关系表达式

关系表达式是指用关系运算符将两个表达式连接起来组成的有意义的式子。
在这里插入图片描述
在C语言中,用1(非0)表示关系表达的值为真(条件成立),0表示关系表达式的值为假(条件不成立),即关系表达式的值要么是1(条件成立),要么是0(条件不成立)

问题引出

有时,只用一个简单的关系表达式无法完整地表达一个条件。
在这里插入图片描述
其中的条件需要用逻辑表达式来表示:x!=0&&a!=0 ,&&就是一种逻辑运算符。

逻辑运算及其表达式

逻辑运算符及其优先级

逻辑运算符是构成复杂的复合条件的运算符。
C语言中提供3种逻辑运算符:
在这里插入图片描述

逻辑表达式

在这里插入图片描述
用逻辑运算将关系表达式或逻辑量连接起来构成的有意义的式子。
在这里插入图片描述
逻 辑 表 达 式 中 各 种 运 算 符 的 优 先 级 顺 序 如
下:
!(逻辑非) → 算术运算符 → 关系运算符 → &&和|| → 赋值运算符
C语言编译系统在表示逻辑运算符结果时:真用1表示,假用0表示

案例

假设a = 4,b = 5,则:

 !a        -- 0   
a && b       -- 1 
a || b      -- 1 
!a || b     -- 14 && 0 || 2  -- 1 

⼩贴⼠:
实际上,逻辑运算符两侧的运算对象不但可以是0和1,或是0和⾮0,⽽且也可以是字符型、实型和指针型等。系统最终是以0和⾮0来判定它们的真假的。例如:’c’ && ‘d’ 为1

⽤if语句实现分⽀结构

单分支:if…

语法:

// 语法1:舍弃{}if (表达式)
单语句; // 语法2:保留{}
if  (表达式){}

流程图
在这里插入图片描述
功能
若表达式值为True(⾮0),则执⾏表达式后⾯的语句,执⾏完该语句后继续执⾏if语句后的语句。
若表达式值为0,则不执⾏表达式后⾯的语句⽽直接执⾏if语句后⾯的语句。
说明:
如果表达式(条件表达式)后⾯的是复合语句,则要⽤⼀对花括号{}括起来。单语句可有可⽆。
案例:
要求:计算并输出下列分段函数的值
在这里插入图片描述
在这里插入图片描述
代码:

#include <stdio.h>int main(){// 创建两个变量,用来存储两个操作数double x,y = -2; // 我们给y赋初始值,假定x < 0// 从控制台输入xprintf("请输入一个整数,作为x的值:\n");scanf("%lf",&x);// 校验if (x >= 0) y = 2;printf("x=%lf,y=%lf\n",x,y);return 0; 
}

案例:
要求:有a,b,c三个数,要求从控制台输⼊,并且求出最⼤值
分析:

  1. 通过控制台给a,b,c赋值
  2. 创建⼀个变量max,⽤来存放a,b,c中的最⼤值,默认a是最⼤值(这样可以减少⼀次判断)
  3. 让b,c和max进⾏⽐较,将最⼤值存⼊max
    代码:
 /*************************************************************************> File Name:    
> Author:       
demo02.cfpf> Description:  单分支 if..> Created Time: 2024年11月29日 星期五 10时59分45秒
************************************************************************/#include <stdio.h>int main(int argc,char *argv[]){// 要求:求a,b,c中的最大值
// 创建三个变量,用来存放a,b,c的值
int a,b,c;// 创建一个变量,用来存放max的值
printf("请在控制台输入三个整数:\n");scanf("%d%d%d",&a,&b,&c);// 创建一个变量,用来存放max的值
int max = a;// 让最大值分别和b,c进行比较
if (max < b){max = b; // 如果max < b,就让b作为a,b中的最大值
}if (max < c){max = c; // 其实a,b中的最大值和c比}printf("%d,%d,%d中的最大值是%d\n",a,b,c,max);return 0;}

有可能产⽣的问题:
scanf()同时输⼊多个变量时,默认时使⽤空格或者回⻋换⾏。
在变量赋值前使⽤变量,导致运算结果错误(莫名输出随机数)

双分支:if…else…

语法:

 // 舍弃{}if (表达式)
单语句1;else
单语句2;// 针对以上写法,我们可以使用三目表达式:表达式 ? 单语句1 : 单语句2// 保留{}if  (表达式){
单语句或者复合语句1;}else{
单语句或者复合语句2;}

注意:
else语句本身不能单独存在,必须依赖于if配对使用
流程图:
在这里插入图片描述
功能:
若表达式的值为1,则执行语句1;否则执行语句2。不管条件表达式成不成立都要执行一个语句,其次需要
主要的是,语句1和语句2都可以是复合语句。
说明:
if…else…结构可以实现双分支选择结构。C语言允许if…else…结构嵌套。即在语句1与语句2中又可以包含完
整的if语句或者if…else结构,并且这种嵌套可以多层(为了保证程序的执行效率,建议不超过4层)。
利用if…else结构的嵌套,可以实现多分支选择结构。

案例:
要求:计算并输出下列分段函数的值
在这里插入图片描述
流程图:
在这里插入图片描述
代码:

/*************************************************************************> File Name:    
> Author:       
demo03.cfpf> Description:  双分支 if..else..> Created Time: 2024年11月29日 星期五 11时42分39秒
#include <stdio.h>************************************************************************/int main(int argc,char *argv[]){}// 需求:计算并输出下列分段函数的值
// 创建两个变量,存放x,y的值
int x,y;// 通过键盘录入数据
printf("请输入一个整数:\n");scanf("%d",&x);// 校验
if (x < 0)y = -2;elsey = 2;// 打印输出测试结果
printf("x=%d,y=%d\n",x,y);return 0;}

改造为三⽬运算符的写法:

 /*************************************************************************> Created Time: 2024年11月29日 星期五 11时42分39秒
************************************************************************/int main(int argc,char *argv[])14// 需求:计算并输出下列分段函数的值
// 创建两个变量,存放x,y的值int x,y;// 通过键盘录入数据
printf("请输入一个整数:\n");scanf("%d",&x);// 校验
// 三目表达式
y = x < 0 ? -2 : 2;// 打印输出测试结果
printf("x=%d,y=%d\n",x,y);return 0;}

多分支:if…else…if…else

语法:

写法1:嵌套if..else..(不推荐)if(表达式1) 语句1;elseif(表达式2) 语句2;else...elseif(表达式n) 语句n;else 语句n+1;
写法2:并列if..else..if....else..(推荐)    
if(表达式1) 语句1;else if(表达式2) 语句2;...[else if(表达式n) 语句n;][else 语句n+1;]

在这里插入图片描述
案例:
要求:根据学⽣的成绩,对学⽣进⾏分级,
成绩 >= 90,A
成绩 >= 80,B
成绩 >= 60,C
成绩 < 60,D
代码

#include <stdio.h>// 方式1:借助于执行顺序,减少判断的条件
int if_test1(){
``  // 创建一个变量,用来存放输入的成绩int score;// 通过控制台输入一个成绩printf("请输入一个整数:\n");scanf("%d",&score);// 校验,分级 95if(score >= 90){printf("A\n");}else if(score >= 80){printf("B\n");}else if(score >= 60){printf("C\n");}else {printf("D\n");}}// 方式2:不借助于执行顺序,做更精准的判断
int if_test2(){// 创建一个变量,用来存放输入的成绩int score;// 通过控制台输入一个成绩printf("请输入一个整数:\n");scanf("%d",&score);// 校验,分级 if(score >= 60 && score < 80){printf("C\n");}`else if(score >= 80 && score < 90){}printf("B\n");else if(score >= 90){}else 
{}}printf("A\n");printf("D\n");int main(int argc,char *argv[]){}

if…else结构注意点

if…else结构中的语句1与语句2都可以是复合语句。
在if…else结构中,语句1与语句2都可以是空语句。
在这里插入图片描述

if语句的嵌套

在这里插入图片描述
注意:
① else 总是与前面最近的未配对的if配对使用
② 可通过增加{}来确定配对关系
③ 只要if中包含if,都属于是if语句的嵌套

/*************************************************************************> File Name:    
demo04.c> Author:       
FPF> Description:  多分支:if..else if....else..> Created Time: 2024年11月29日 星期五 14时20分18秒
************************************************************************//*** 要求:根据学生的成绩,对学生进行分级,
成绩 >= 90,A
成绩 >= 80,B
成绩 >= 60,C
成绩 <  60,D*/#include <stdio.h>// 方式1:借助于执行顺序,减少判断的条件
int if_test1(){// 创建一个变量,用来存放输入的成绩
int score;// 通过控制台输入一个成绩
printf("请输入一个整数:\n");scanf("%d",&score);// 校验,分级 95if(score < 0 || score > 100){printf("您的输入不合法!\n");}else{if(score >= 90){printf("A\n");}   else if(score >= 80){printf("B\n");}else if(score >= 60){printf("C\n");}else {printf("D\n");}}}// 方式2:不借助于执行顺序,做更精准的判断
int if_test2(){// 创建一个变量,用来存放输入的成绩int score;// 通过控制台输入一个成绩printf("请输入一个整数:\n");scanf("%d",&score);// 校验,分级 if(score < 0 || score > 100){printf("您的输入不合法!\n");}else if(score >= 60 && score < 80){printf("C\n");}else if(score >= 80 && score < 90){printf("B\n");}else if(score >= 90){printf("A\n");}else {printf("D\n");}}int main(int argc,char *argv[]){if_test1();if_test2();return 0;}

如何摘除⼀个三位数中的每⼀位:
实现:123,个位数:123 % 10 = 3;⼗位数:123 % 100 / 10 = 2,123 / 10 % 10 =2;百位数:123 / 100 = 1

⽤switch语句实现分⽀结构

我们可以使用switch实现多分支选择结构(多分支也被称作多路分支)
语法:

 switch(表达式){case 常量表达式1:
语句1;break;case 常量表达式2:
语句2;break;...case 常量表达式n:
语句n;break;default:
语句n+1;break;// 一般省略
}

流程图:
在这里插入图片描述
在这里插入图片描述
说明:
① switch后括号内的表达式可以是任何类型的表达式,但是表达式的值必须为 整数值(整型,字符型,枚
举)
② 若表达式的值与某个常量表达式的值相等时,执行此case后面的语句;若没有相等的值时,执行
default后面的语句
③ 每个case后面的常量表达式的值必须不相同,否则出现矛盾。
④ 各个case和default出现的次序不影响执行结果。
⑤ case后面的语句中如果没有break语句,则执行完本case后的语句会接着执行下面的case;
⑥ 多个case公用一组语句。
案例:
要求:按照考试成绩的等级输出百分制分数段
分析:
设分段原则如下:
A级为85~100段;
B级为70~84段;
C级为60~69段;
D级为<60段;
输⼊其它字符时为错。
代码:

*************************************************************************> File Name:    demo05.c> Author:       冯鹏飞> Description:  多分支:switch> Created Time: 20241129日 星期五 155159************************************************************************/#include <stdio.h>/*- 要求:按照考试成绩的等级输出百分制分数段- 分析:设分段原则如下:      A级为85~100段;                 B级为70~84段;                  C级为60~69段;      D级为<60段;      输入其它字符时为错。*/int switch_test1(){// 创建一个变量,用来存放考试等级char grade;// 通过控制台输入一个字符printf("input grade:\n");scanf("%c",&grade);// 校验,根据等级输出分段switch(grade){case 'A':printf("85~100\n");break;case 'B':printf("70~84\n");break;case 'C':printf("60~69\n");break;case 'D':printf("<60\n");break;default:printf("Error\n");}}int main(int argc,char *argv[]){}

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

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

相关文章

SpringAop(1)

Spring中有两大重心&#xff1a;springIoc和springAop springioc将bean的控制权交给了spring管理&#xff0c;直接从spring中获取&#xff0c;通过五大注解来告诉spring帮我管理这个对象。通过Autowired和构造方法和set方法注入。 不仅仅是学习重点也是面试常考的难点。 spr…

GoReplay开源工具使用教程

目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…

Nginx:ssl

目录 部署ssl前提 nginx部署ssl证书 部署ssl部署建议 部署ssl前提 网站有域名根据域名申请到ssl证书&#xff0c;并下载证书部署到nginx中 部署了ssl证书后&#xff0c;访问的流量是加密的。 nginx部署ssl证书 #80端口跳转到443 server {listen 80;return 302 https://1…

USB 声卡全解析:提升音频体验的得力助手

在当今数字化的时代&#xff0c;音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者&#xff0c;还是在专业音频工作中精雕细琢的人士&#xff0c;亦或是在游戏世界里渴望极致音效沉浸的玩家&#xff0c;都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…

[TPAMI 2024]Vision-Language Models for Vision Tasks: A Survey

论文网址&#xff1a;Vision-Language Models for Vision Tasks: A Survey | IEEE Journals & Magazine | IEEE Xplore 论文Github页面&#xff1a;GitHub - jingyi0000/VLM_survey: Collection of AWESOME vision-language models for vision tasks 英文是纯手打的&…

深度学习模型:门控循环单元(GRU)详解

本文深入探讨了门控循环单元&#xff08;GRU&#xff09;&#xff0c;它是一种简化版的长短期记忆网络&#xff08;LSTM&#xff09;&#xff0c;在处理序列数据方面表现出色。文章详细介绍了 GRU 的基本原理、与 LSTM 的对比、在不同领域的应用以及相关的代码实现&#xff0c;…

HCIA笔记6--路由基础与静态路由:浮动路由、缺省路由、迭代查找

文章目录 0. 概念1.路由器工作原理2. 跨网访问流程3. 静态路由配置4. 静态路由的应用场景4.1 路由备份4.2 浮动路由4.3 缺省路由 5. 迭代路由6 问题6.1 为什么路由表中有的下一跳的地址有接口&#xff1f;6.2 个人电脑的网关本质是什么&#xff1f; 0. 概念 自治系统&#xff…

Spark常问面试题---项目总结

一、数据清洗&#xff0c;你都清洗什么&#xff1f;或者说 ETL 你是怎么做的&#xff1f; 我在这个项目主要清洗的式日志数据&#xff0c;日志数据传过来的json格式 去除掉无用的字段&#xff0c;过滤掉json格式不正确的脏数据 过滤清洗掉日志中缺少关键字段的数据&#xff…

【北京迅为】iTOP-4412全能版使用手册-第三十二章 网络通信-TCP套字节

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

【乐企文件生成工程】搭建docker环境,使用docker部署工程

1、自行下载docker 2、自行下载docker-compose 3、编写Dockerfile文件 # 使用官方的 OpenJDK 8 镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR ./app# 复制 JAR 文件到容器 COPY ../lq-invoice/target/lq-invoice.jar app.jar # 暴露应用程序监听的端口 EXPOSE 1001…

介绍下你们电商搜索的整体Java技术架构?

大家好&#xff0c;我是锋哥。今天分享关于【介绍下你们电商搜索的整体Java技术架构&#xff1f;】面试题。希望对大家有帮助&#xff1b; 介绍下你们电商搜索的整体Java技术架构&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在电商平台的搜索系统中…

【趣味】斗破苍穹修炼文字游戏HTML,CSS,JS

目录 图片展示 游戏功能 扩展功能 完整代码 实现一个简单的斗破苍穹修炼文字游戏&#xff0c;你可以使用HTML、CSS和JavaScript结合来构建游戏的界面和逻辑。以下是一个简化版的游戏框架示例&#xff0c;其中包含玩家修炼的过程、增加修炼进度和显示经验值的基本功能。 图片…

永磁同步电机负载估计算法--滑模扰动观测器

一、原理介绍 为了进一步提高永磁同步电机的抗干扰性能&#xff0c;采用SMDO在线估计负载扰动&#xff0c;然后将估计的负载扰动作为前馈信号补偿速度控制器的输出 根据永磁同步电机的运动方程&#xff0c;可以建立滑模观测器的模型如下&#xff1a; 式中l2为观测器的反馈增益…

BiGRU:双向门控循环单元在序列处理中的深度探索

一、引言 在当今的人工智能领域&#xff0c;序列数据的处理是一个极为重要的任务&#xff0c;涵盖了自然语言处理、语音识别、时间序列分析等多个关键领域。循环神经网络&#xff08;RNN&#xff09;及其衍生结构在处理序列数据方面发挥了重要作用。然而&#xff0c;传统的 RN…

云服务器重装系统后 一些报错与解决[ vscode / ssh / 子用户]

碰见的三个问题&#xff1a; 1.vscode连接失败 2.登录信息配置 3.新建子用户的一些设置 思考&#xff1a;遇见问题&#xff0c;第一反应 应该如何解决 目录 1. 错误 解决方法 原因 步骤 1&#xff1a;找到known_hosts文件并编辑 步骤 2&#xff1a;通过VSCode终端输入…

QT实战-qt各种菜单样式实现

本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式&#xff0c; 先上图如下&#xff1a; 1.普通菜单样式 代码&#xff1a; m_pmenu new QMenu(this);m_pmenu->setObjectName("quoteListMenu"); qss文…

基于BM1684的AI边缘服务器-模型转换,大模型一体机

介绍 我们属于SoC模式&#xff0c;即我们在x86主机上基于tpu-nntc和libsophon完成模型的编译量化与程序的交叉编译&#xff0c;部署时将编译好的程序拷贝至SoC平台&#xff08;1684开发板/SE微服务器/SM模组&#xff09;中执行。 注&#xff1a;以下都是在Ubuntu20.04系统上操…

Redis+Caffeine 多级缓存数据一致性解决方案

RedisCaffeine 多级缓存数据一致性解决方案 背景 之前写过一篇文章RedisCaffeine 实现两级缓存实战&#xff0c;文章提到了两级缓存RedisCaffeine可以解决缓存雪等问题也可以提高接口的性能&#xff0c;但是可能会出现缓存一致性问题。如果数据频繁的变更&#xff0c;可能会导…

计算机网络——不同版本的 HTTP 协议

介绍 HTTP&#xff0c;即超文本传输协议&#xff08;HyperText Transfer Protocol&#xff09;&#xff0c;是应用层的一个简单的请求-响应协议&#xff0c;它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。本文将介绍 HTTP 协议各个版本。 HTTP/1.0 HTTP/1…

【ArkTS】使用AVRecorder录制音频 --内附录音机开发详细代码

系列文章目录 【ArkTS】关于ForEach的第三个参数键值 【ArkTS】“一篇带你读懂ForEach和LazyForEach” 【小白拓展】 【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案” 【ArkTS】 一篇带你掌握“语音转文字技术” --内附详细代码 【ArkTS】技能提高–“用户授权”…