自学C语言-6

第6章 选择结构程序设计

顺序结构程序设计最简单,但通常无法解决生活中的选择性问题。选择结构程序设计需要用到一些条件判断语句,可实现的程序功能更加复杂,程序的逻辑性与灵活性也更加强大。
本章致力于使读者掌握使用if语句进行条件判断的方法,并掌握switch语句的使用方式。
本章的知识架构及重难点如下:
在这里插入图片描述

6.1 if语句

日常生活中,为了使交通畅通有序,一般会在路口设立交通信号灯。信号灯为绿色时,车辆可以行驶通过;信号灯为红色时,车辆就要停止行驶。可见,信号灯给出了信号,人们通过不同的信号进行判断,然后根据判断的结果进行相应的操作。
在C语言程序中,要想完成这样的判断操作,利用的就是if语句。if语句的功能就像路口的信号灯一样,通过判断不同的条件,决定是否进行操作。
程序开发中,会遇到许多类似于红绿灯这样的“决策”,可将其简化成对某个“条件”的检验,进而转换为判断某个表达式的值是真还是假,最后根据真假情况选择性地执行后续的操作。除了没有在何返回值的函数和返回无法判断真假的结构函数,几乎所有表达式的返回值都可以判断真假。

6.2 if语句的基本形式

if语句中,首先判断表达式的值,然后根据该值的真假情况决定后续程序流程。表达式的值不等于0,就表示为真;否则,就是假值。if语句有if、if…else和else if 3种形式,下面介绍每种形式的具体使用方式。

6.2.1 if语句形式

if语句的一般形式如下:

if(表达式)语句

其中,括号中的表达式就是要进行判断的条件,语句则是要执行的对应操作。如果if判断括号中的表达式为真(非0),就执行后面的语句;如果为假(0),则不执行后面的语句。例如下面的代码:

if(iNum)printf("The truevalue");

上述代码中,如果变量iNum的值为真,则执行后面的printf输入语句;如果变量iNum的值为假,则不执行后面的printf语句。
用if语句解决红绿灯问题时,可以约定信号灯为1表示绿灯,则判断代码为:

if(iSignal==1) printf("the Signal Light is %d:",iSignal);

上述代码中,首先判断表达式”iSignal==1"是否成立,如果条件成立,那么判断结果是真值,执行后面的输出语句;如果条件不成立,那么判断结果为假值,不执行后面的输出语句。
前面两处示例代码中,if后的执行部分都只有一条语句。如果有两条语句,又该怎么办呢?这时可以使用大括号,使之成为语句块。例如:

ifCiSignal==1)
{
	printf("the Signal Light is %d:\n",iSignal);
	printf("Cars can run");
}

将执行的语句都放在大括号中,这样当if语句判断条件为真时,语句块内的内容将会全部被执行。使用这种方式的好处是可以规范、清晰地表达出if语句所包含的范围。建议大家在使用if语句时,都使用大括号将执行语句包括在内。

误区警示:
if语句的括号后一定不要加英文分号(;),否则将编译报错。例如:
if(i>100);
{
    sum=i+5000;
    printf("%d\n",sum);
  }
  如果已经报错,可根据错误提示,找到差错并修改代码。
  选择结构处理问题一定要把条件描述清楚,例如下面的语句是错误的。
  if(i/6<>0){...}

if语句的执行流程图如图6.1所示。
在这里插入图片描述
【例6.1】使用if语句模拟打卡签到 模拟此场景:一位职工早上上班打卡,她的工位号是13,密码是111,输入正确门禁卡会出现“谢谢,已签到”的字样。
在本实例中,为了模拟打卡签到,要使用if语句判断工位号和密码。如果工位号是13,同时密码是111,则通过printf函数提示“谢谢,已签到”。
在这里插入图片描述
(1)为了模拟打卡签到,要根据工位号和密码情况进行判断,这样就需要两个变量分别表示工位号和密码。在程序代码中,定义变量loc表示工位号,ser表示密码。
(2)输出提示信息,提醒用户输入loc、ser变量的值。此时用键盘输入“13,111”,表示工位号是13,密码是111。
(3)使用if语句判断,如果为真,则表示签到成功;如果为假,则表示签到不成功。因为输入的变量loc的值为13,ser的值是111,表达式loc13&&ser111的条件成立,因此判断的结果为真值,从而执行if语句后面大括号中的语句。
运行程序,显示效果如上图所示。
if语句可以多次使用,使得程序能根据不同的分支条件给出相应的操作。例如在例6.1中,虽然使用if语句对输入的loc、ser变量进行了判断,但是只给出了判断正确,也就是loc等于13、ser等于111时执行的操作,并没有给出判断错误时对应的操作。为了保证在用户输入错误的工位号、密码时,程序也能做出反应,需要再使用一次if语句。现在对例6.1进行完善。
【例6.2】完善模拟打卡签到 例6.1仅对打卡成功情况做出了相应操作,为进一步完善打卡签到失败时的操作,在程序中再添加一次if语句,对打卡签到失败的情况进行判断,并且在条件成立时给出相应操作。
在这里插入图片描述
(1)在例6.1的基础上进行修改,完善程序的功能。在代码中添加一个if判断语句,用来表示当loc!=13&&ser!=111时要进行的相应操作。
(2)从程序的开始处来分析整个程序的运行过程。使用scanf函数输入数据,这次用户输入的是“12、123”,表示工位号是12,密码是123。
(3)程序继续执行,第一个if语句判断loc==13&&ser=111是否为真,如果判断的结果为真,则说明签到成功。因为loc的值是 12,ser的值是123,所以判断的结果为假,不会执行第一个printf语句中的内容。
(4)接下来是新添加的if语句,在其中判断loc!=13&&ser!=111是否为真,如果判断成立为真,则表示签到不成功。因为输入的值为12、123,所以loc!=13&&ser!=111条件成立,执行第二个printf语句内容。
运行程序,显示效果如上图所示。

警示:刚开始编程在程序中使用if语句时,常常会将下面的两个判断弄混:
if(value){...}							/*判断变量值是否为真*/
if(value==0){...}						/*判断表达式的值是否为真*/

这两行代码中都有value变量,value值虽然相同,但是判断的结果却不同。第1行代码判断的是value的值是否为真,第2行代码判断的是value=0这个表达式是否成立。假定其中value的值为0,那么在第一个if语句中,value值为0即说明判断的结果为假,所以不会执行if后的语句。在第二个if语句中,判断的是value是否等于0,因为设定value的值为0,所以表达式成立,那么判断的结果就为真,执行if后的语句。

6.2.2 if…else语句形式

if语句只给出了条件为真时要执行某个操作,并未给出条件为假时具体要干什么。如果想在条件为假时执行另外一段代码,需要利用if…else语句来完成,其一般形式如下:

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

if…else语句的执行流程图如图6.4所示。
在这里插入图片描述
在if后的括号中判断表达式的结果,如果判断的结果为真值,则执行if后的语句块内容;如果判断的结果为假值,则执行else后的语句块内容。也就是说,当if语句检验的条件为假时,就执行else后面的语句或者语句块。例如:

if(value)
{
		printf("the value is true");
}
else
{
	    printf("the value is false");
}
注意:
else语句必须跟在一个if语句的后面,不能独立使用。

【例6.3】条件判断真真假假 在本实例中,使用if…else语句判断用户输入的数值。输入的数字为0,表示条件为假;输入的数字为非0,表示条件为真。
在这里插入图片描述
(1)程序中定义变量iNumber用来保存用户输入的数据,然后通过if…else语句判断变量的值。
(2)用户输入数据的值为0,if语句判断iNumber变量,此时也就是判断输入的数值。因为0表示的是假,所以不会执行if后面紧跟着的语句块,而会执行else后面语句块中的操作,显示一条信息并将数值进行输出。
(3)从程序的运行结果也可以看出,当if语句检验的条件为假时,就执行else后面的语句或者语句块。
运行程序,显示效果如上图所示。
if…else语句也可以用来判断表达式,根据表达式的结果选择不同的操作。
【例6.4】计算员工工资 某公司的薪酬设计如下:工龄在5年以上,工资=基本工资+全勤奖+2倍的全勤奖;否则,工资=基本工资+全勤奖。本实例利用if…else语句判断并计算工资,具体代码如下:

在这里插入图片描述
(1)在程序运行过程中,利用printf函数先显示一条信息,提示用户输入一个数据,例如输入3。这个数据的数值由变量year保存。
(2)if语句判断表达式year>5的真假。如果判断的结果为真,说明工龄大于5,则执行if后的语句,输出“基本工资+全勤奖+2倍的全勤奖”的值;如果判断的结果为假,说明工龄小于等于5,则执行else后的语句,输出“基本工资+全勤奖”的值。因为year的值为3,所以year>5的关系表达式结果为假,这样执行的就是else后的语句,输出“基本工资+全勤奖”的值。
运行程序,显示效果如上图所示。

误区警示:
在使用if语句比较浮点数时,不要使用浮点值,这样就会导致实际结果的偏差,因为浮点值属于近似值。

【例6.5】根据时间输出问候语 输入一个时间,当时间小于12时,输出“Good day";当时间等于12时,输出”Good noon";否则输出"Good evening"。本实例使用if…else语句实现,具体代码如下:
在这里插入图片描述
(1)程序运行时,先输出信息,提示用户输入一个时间。
(2)输入数字14,将其保存到变量time中。接下来使用if语句进行判断。
(3)第一个if语句判断time是否小于12,很明显判断结果为假,因此不会执行第一个if后语句块中的内容。
(4)第二个if语句判断time是否小于12,结果为假,因此不会执行第二个if后语句块中的内容。
(5)因为第二个if语句为假值,不执行第二个if语句的话,就会执行else后的语句块输出信息"Good evening"。
运行程序,显示效果如上图所示。

注意:
上面这个程序实际上是存在一些问题的,假如用户输入的数值为5,第一个if语句判断为真值,则会执行后面紧跟着的语句块。紧接着,第二个if语句判断出time值不等于12,为假值,所以会执行else后的语句块,如图6.8所示。注意,else后的语句执行是我们不希望发生的,6.2.3节中会介绍解决这个问题的方法。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b9272315d1d04eb5976f7ccbd5f9aef7.png#pic_center)

在这里插入图片描述

6.2.3 else if 语句形式

利用if和else关键字的组合,可以实现else if语句。该语句可对一系列互斥的条件进行检验,从而解决较复杂的判断和决策问题。else if语句的一般形式如下:
if(表达式1)
{
	语句块1
}
else if(表达式2)
{
	语句块2
}
else if(表达式3)
{
		语句块3
}
...
else if(表达式 m)
{
		语句块 m
}
else
{
		语句块n
}

else if语句的执行流程图如图6.9所示。首先对if语句中的表达式1进行判断,如果结果为真值,则执行后面跟着的语句块1,然后跳过else if语句和else语句,如果结果为假,那么判断else if语句中的表达式2,如果表达式2为真值,那么执行语句块2而不会执行后面else if的判断或者else语句。当所有的判断都不成立,也就是都为假时,执行else后的语句块n。

误区警示:使用多个else if语句时,要格外注意下方的复合语句(即语句块)部分,大括号一定要保证成对匹配。

【例6.6】计算分段函数的值 利用选择结构设计一个程序,使其能计算如下分段函数:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【docker】解决docker overlay2目录占用大量磁盘空间,导致验证码出不来,报错Can‘t create output stream!

问题&#xff1a; 验证码出现Cant create output stream!报错信息 排查&#xff1a; 所在服务器磁盘使用率已经到达100%&#xff0c;经排查&#xff0c;服务器目录/var/lib/docker/overlay2占用大量磁盘空间&#xff0c; 解决&#xff1a; 使用【docker system prune】命令删…

怎么移除WordPress后台工具栏“新建”菜单?如何添加“新建文章”菜单?

默认情况下&#xff0c;WordPress后台顶部管理工具栏有左侧有一个“新建”菜单&#xff0c;而且还有下拉菜单文章、媒体、链接、页面和用户等&#xff0c;不过我们平时用得最多的就是“新建文章”&#xff0c;虽然可以直接点击“新建”&#xff0c;或点击“新建 – 文章”&…

AI Toolkit软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; AI Toolkit是一款卓越的人工智能软件&#xff0c;专为企业和个人提供一体化的解决方案&#xff0c;助力其工作流程高效运转。该软件套件融合了多种顶…

Python脚本之操作Redis Cluster【三】

本文为博主原创&#xff0c;未经授权&#xff0c;严禁转载及使用。 本文链接&#xff1a;https://blog.csdn.net/zyooooxie/article/details/135485606 之前写了2篇 操作redis集群的 https://blog.csdn.net/zyooooxie/article/details/123760358 、 https://blog.csdn.net/zyo…

2021 Google Chrome RCE漏洞分析

一、复现环境&#xff1a; Win10 Google Chrome 86.0.4240.75 二、利用复现&#xff1a; 关闭沙箱安全使用命令进行关闭 &#xff0c;在正常情况下&#xff0c;浏览器沙箱提供了一个受限制的执行环境&#xff0c;以防止恶意代码对用户系统的损害。关闭沙箱可能会导致浏览器执…

查询排序(1)

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 前面介绍了在 SQL 限定查询中 WHERE 子句的运行顺序优先于 SELECT 子句&#xff0c;WHERE 子句确定数据行&#xff0c;SELECT 子句确定数据列。 也分别讲述了在 WHERE 子句中常用的运算…

相机拍摄基础

相机拍摄 1.索尼A7M3摄影机挡位 AUTO自动档&#xff0c;光圈快门自动调整。 P档半自动档&#xff0c;只能调整感光度&#xff0c;光圈快门随之变化。 A档&#xff0c;光圈优先&#xff0c;只能调整光圈值&#xff0c;快门随之变化。适合拍摄风景、人像。 S档&#xff0c;快…

SpringBoot整合redisson实现分布式锁

SpringBoot整合redisson实现分布式锁 本文主要通过 SpringBoot 整合 redisson 来实现分布式锁&#xff0c;并结合 demo 测试结果。 1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0…

【Linux】 开始使用 gcc 吧!!!

Linux 1 认识gcc2 背景知识3 gcc 怎样完成 &#xff1f;3.1 预处理预处理^条件编译 3.2 编译3.3 汇编3.4 链接 4 函数库5 gcc 基本选项Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 1 认识gcc 我们在windows环…

【LIBS】交叉编译TCPDUMP

目录 1. 安装编译工具2. 设置环境变量3. 编译libpcap3.1 安装依赖3.2 交叉编译 4. 编译TCPDUMP4.1 克隆仓库与生成构建环境4.2 静态链接LIBPCAP4.3 动态链接LIBPCAP4.4 构建与安装 5. 查看交叉编译结果5.1 文件布局 1. 安装编译工具 sudo apt-get install -y autoconf automak…

SaaS系统如何助力企业数字化转型

随着科技的快速发展&#xff0c;数字化转型已经成为企业适应市场变化、提高竞争力的必要手段。在这个过程中&#xff0c;SaaS&#xff08;软件即服务&#xff09;系统以其独特的优势&#xff0c;正在成为越来越多企业的首选。乔拓云SaaS系统作为这一领域的佼佼者&#xff0c;更…

谷歌出品!读懂 QUIC 协议:更快、更高效的通信协议

QUIC结构 QUIC协议模型如下图所示&#xff0c;其放弃了TCP∕IP网络中使用五元组(源IP,源端口,目的IP,目的端口,协议标识符)来唯一标识一条连接的方式,而使用一个全局唯一的随机生成的ID(即Connection ID) 来标识一条连接。 由低向上分层讨论QUIC协议&#xff1a; •UDP层:在U…

1990-2019年城市维度区域创新创业指数面板数据/地级市创新创业指数面板数据

1990-2019年城市维度区域创新创业指数面板数据/地级市创新创业指数面板数据 1、时间&#xff1a;1990-2019年 2、范围&#xff1a;地级市&#xff08;290&#xff09; 3、指标&#xff1a;序号、年份、城市码、城市、总维度&#xff1a;总量指数得分、人均得分、单位面积得分…

应用协议漏洞

应用协议漏洞 一、rsync rsync是Linux下一款数据备份工具&#xff0c;支持通过rsync协议、ssh协议进行远程文件传输。其中rsync协议默认监听873端口 1.未授权访问 打开靶场 判断漏洞是否存在 rsync rsync://目标ip:端口读取文件 rsync rsync://47.99.49.128:873/src/tmp/下…

访问者模式-C#实现

该实例基于WPF实现&#xff0c;直接上代码&#xff0c;下面为三层架构的代码。 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练习.Model.访问者模式 {public class Com…

JRT的无源码发布

之前介绍过JRT最大的特点就是业务脚本化。老javaer就会说你业务代码都在发布环境放着&#xff0c;那怎么代码保密&#xff0c;在发布环境别人随便改了启不是不安全&#xff0c;或者一些代码我就是不想让人看源码呢。 其实JRT的业务脚本化只是特性&#xff0c;不是代表就必须要…

如何进行H.265视频播放器EasyPlayer.js的中性化设置?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

C#用DateAndTime.DateDiff方法和TimeSpan分别计算时间间隔

目录 一、计算时间间隔的方法 1.用DateAndTime.DateDiff方法计算时间间隔 2.使用TimeSpan获取日期时间间隔 二、实例 1.示例一&#xff1a;用DateAndTime.DateDiff方法计算时间间隔 2.示例二&#xff1a;使用TimeSpan获取日期时间间隔 一、计算时间间隔的方法 1.用Date…

深入《羊了个羊》:从0到1的消除游戏开发

一、游戏简介 《羊了个羊》是一款备受欢迎的消除类游戏。玩家需要通过交换相邻的方块&#xff0c;使三个或更多相同方块连成一线&#xff0c;从而将它们消除。消除方块可以获得分数&#xff0c;并在全球排行榜上与其他玩家竞争。 设置项目结构 首先&#xff0c;在文本编辑器中…

【博客搭建记录贴】day4_Hexo基本操作,添加草稿并发布

目录 1.将项目导入到开发环境1.1 先把项目导入到IDEA中1.2 确认IDEA中服务器启动正常 2.Hexo基本操作: 添加草稿并发布2.1 生成一个草稿文件2.2 在页面上查看草稿3.3 将草稿正式发布 1.将项目导入到开发环境 我本地已经安装了 IntelliJ IDEA&#xff08;版本&#xff1a;社区版…
最新文章