![C语言从入门到精通(微视频精编版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/269/27563269/b_27563269.jpg)
第5章 设计选择/分支结构程序
(视频讲解:68分钟)
走入程序设计领域的第一步,是学会如何设计编写一个程序,其中顺序结构程序设计是最简单的程序设计,而选择结构程序设计中就用到了一些条件判断的语句,增加了程序的功能,也增强了程序的逻辑性与灵活性。
本章致力于使读者掌握如何使用if语句进行条件判断,掌握有关switch语句的使用方式。
学习摘要:
使用if语句编写判断语句
掌握switch语句的编写方式
区分if else语句与switch语句
通过应用程序了解选择结构的具体使用方式
5.1 if语句
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P105_14571.jpg?sign=1739272990-X4u2FtMSfLdSLlcKEHFwhaZ1egVYsWN9-0-7590bdf2c13ffa189597eaf82e8f6868)
视频讲解
在日常生活中,为了使社会的交通畅通运行,在每一个路口会有交通信号灯。在信号灯显示为绿色时车辆可以行驶通过,当信号灯转为红色时车辆就要停止行驶。从中可以看到信号灯给出了信号,人们通过不同的信号进行判断,然后根据判断的结果做出相应的操作。
在C语言程序中,也可以完成这样的判断操作,利用的就是if语句。if语句的功能就像判断路口信号灯一样,根据不同的条件,判断是否进行操作。
据说第一台数字计算机是用来进行决策操作的,所以使得之后的计算机都继承了这项功能。程序员将决策表示成对条件的检验,即判断一个表达式值的真假。除了没有任何返回值的函数和返回无法判断真假的结构函数外,其他表达式的返回值都可以判断真假。
下面具体介绍if语句的有关内容。
5.2 if语句的基本形式
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P105_14582.jpg?sign=1739272990-KEopH95xq9X3bOY95rC6XM0thmWk0apY-0-653182c56eb6d60b0f64b7196f6b4d27)
视频讲解
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P105_14593.jpg?sign=1739272990-Z9gAez5BSleVFzt1MX1DgDRcKHnSLPXc-0-8678a6a471645864cca1b082511b3f93)
动图演示
if语句就是判断表达式的值,然后根据该值的情况选择如何控制程序流程。表达式的值不等于0,也就是为真值。否则,就是假值。if语句有3种形式,分别为if语句形式、if …else语句形式、else if语句形式。每种情况的具体使用方式如下。
5.2.1 if语句形式
if语句形式就通过对表达式进行判断,然后根据判断的结果选择是否进行相应的操作。if语句的一般形式如下:
if(表达式) 语句;
其语句执行流程如图5.1所示。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P105_14565.jpg?sign=1739272990-N3AYE4npE5iHa0rBOaN41usFFPUUpqXy-0-70261cd9a3b017bbbdd3d9a4280cd71d)
图5.1 if语句执行流程图
if后面括号中的表达式就是要进行判断的条件,而后面语句部分是对应的操作。如果if判断括号中的表达式为真值,那么就执行后面语句的操作;如果为假值,那么不会执行后面语句部分。例如下面的代码:
if(iNum)printf("The ture value");
代码中判断变量iNum的值,如果变量iNum为真值,则执行后面的输出语句;如果变量的值为假,则不执行。
在if语句的括号中,不仅可以判断一个变量的值是否为真,也可以判断表达式,例如:
if(iSignal==1) printf("the Signal Light is%d:",iSignal);
这行代码表示的是:判断变量iSignal==1的表达式,如果iSignal==1的条件成立,那么判断的结果是真值,则执行后面的输出语句;如果条件不成立,那么结果为假值,则不执行后面的输出语句。
在这些代码中可以看到if后面的执行部分只是调用了一条语句,如果是两条语句时怎么办呢?这时可以使用大括号使之成为语句块,例如:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P106_74170.jpg?sign=1739272990-VcQloW1SJYobhSWi2Xjq4NZdZ0UDLaFB-0-ff5be8b9a6c6ed596cf5b419418fc697)
将执行的语句都放在大括号中,这样当if语句判断条件为真时,就可以全部执行。使用这种方式的好处可以很规范、清楚地看出来if语句所包含语句的范围,所以笔者在这里建议大家使用if语句时,都使用大括号将执行语句包括在内。
【例5.1】 使用if语句模拟信号灯指挥车辆行驶。(实例位置:资源包\源码\05\5.1)
在本实例中,为了模拟十字路口上信号灯指挥车辆行驶,要使用if语句进行判断信号灯的状态。如果信号灯为绿色,说明车辆可以行驶通过,通过输出语句进行信息,提示说明车辆的行动状态。
运行程序,显示效果如图5.2所示。
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P106_14730.jpg?sign=1739272990-CZSWf9MBT2GuBXvTjxhy53EZpRUI26iT-0-b79084a96279de79064ef4e2b6a4b718)
图5.2 使用if语句模拟信号灯指挥车辆行驶
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P106_74171.jpg?sign=1739272990-6WNODtQkHWCErYJakFwkgX4IOuJnnbXi-0-a558e4ce0ec95373b971420d3cf374c3)
代码分析:
(1)为了模拟信号灯指挥交通,就要根据信号灯的状态进行判断,这样的话就需要一个变量表示信号灯的状态。在程序代码中,定义变量iSignal表示信号灯的状态。
(2)输出提示信息,iSignal变量表示此时信号灯的状态。此时在键盘输入1,表示信号灯的状态是绿灯。
(3)接下来使用if语句判断iSignal变量的值,如果为真,则表示的信号灯为绿灯;如果为假,表示的是红灯。在程序中,此时变量iSignal的值为1,表达式iSignal==1这个条件成立,所以判断的结果为真值,从而执行if语句后面大括号中的语句。
if语句不是只可以使用一次的,是可以连续进行判断使用的,然后根据不同条件的成立给出相应的操作。
例如在上面的实例程序中,可以看到虽然使用if语句进行判断信号灯状态iSignal变量,但是只是给出了判断为绿灯时执行的操作,并没有给出判定为红灯时相应的操作。为了使在红灯情况下也进行操作,那么再使用一次if语句进行判断为红灯时的情况。现在对上面的实例进行完善,实例如下。
【例5.2】 完善if语句的使用。(实例位置:资源包\源码\05\5.2)
原程序中仅对绿灯情况下做出相应的操作,为进一步完善信号灯为红灯时的操作,在程序中再添加一次if语句对信号灯为红灯时的判断,并且在条件成立时给出相应的操作。
运行程序,显示效果如图5.3所示。
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P107_14844.jpg?sign=1739272990-5hdSw6zxqI6mKWG3EbSVvKctdLLF2ye3-0-6ce1a3d4597489b149823f9743f831b0)
图5.3 完善if语句的使用
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P107_74174.jpg?sign=1739272990-L1sMBXsTEqOLlgUwaDWrbT5o189tHZ4b-0-e59e30360028f28140fbbe3a92fdc331)
代码分析:
(1)在上一个实例程序的基础上进行修改,完善程序的功能。在其代码中添加一个if判断语句,用来表示当信号灯为红灯时,进行相应的操作。
(2)从程序的开始处来分析整个程序的运行过程。使用scanf函数输入数据时,这次用户输入为0,表示红灯。
(3)程序继续执行,第一个if语句进行判断iSignal变量的值是否为1,如果判断的结果为真,则说明信号灯为绿灯。因为iSignal变量的值为0,所以判断的结果为假。当if语句判断的结果为假,则不会执行后面语句中的内容。
(4)接下来是新添加的if语句,在其中判断iSignal变量是否等于0,如果判断成立为真,则表示信号灯此时为红灯。因为输入的值为0,则iSignal==0条件成立,执行if后面的语句内容。
初学编程的人在程序中使用if语句时,常常会将下面的两个判断弄混,例如:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P108_74175.jpg?sign=1739272990-sJFa0SUIkzhYLlEvgzOrQ8FR6WMEYZSG-0-28834c3f46bee9d555930dbef0a38fe8)
这两行代码的判断中都有value变量,value值虽然相同,但是判断的结果却不同。第1行代码表示判断的是value的值,第二表示判断value等于0这个表达式是否成立。假定其中value的值为0,那么在第一个if语句中,value值为0则说明判断的结果为假,所以不会执行if后的语句。但是在第二个if语句中,判断的是value是否等于0,因为设定value的值为0,所以表达式成立,那么判断的结果就为真,执行if后的语句。
5.2.2 if…else语句形式
除了可以指定在条件为真时执行某些语句外,还可以在条件为假时执行另外一段代码。在C语言中是利用else语句来完成的。其一般形式如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P108_74176.jpg?sign=1739272990-CwHPAZmKiOZxErklegNuJIDeJgNPZcup-0-fc4f4c3ab498a02ee92e8dd676a24b2b)
其语句执行流程如图5.4所示。
在if后的括号中还是需要判断的表达式,如果判断的结果为真值,则执行if后的语句块内容;如果判断的结果为假值,则执行else语句后的语句块内容。也就是说,当if语句检验的条件为假时,就执行相应的else语句后面的语句或者语句块。例如下面的代码:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P108_14948.jpg?sign=1739272990-jcJKv5f35kHnwUGSLzJikHRO9fXYH0QN-0-a8d1796194d00882a24087544323f836)
图5.4 if…else语句执行流程
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P108_74177.jpg?sign=1739272990-T5vQRSFyqM3vJYlDw2IyUSupthP0s9ha-0-725d27c3ba45628ac2011fc980217e3d)
在上面的代码中,如果if判断变量value的值为真的话,则执行if后面的语句块;如果if判断的结果为假值,则执行else下面的语句块。
注意
一个else语句必须跟在一个if语句的后面。
【例5.3】 使用if…else进行选择判断。(实例位置:资源包\源码\05\5.3)
在本实例中,使用if…else语句判断用户输入的数值,输入的数字为0表示条件为假,输入的数字为非0,表示条件为真。
运行程序,显示效果如图5.5所示。
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P109_15067.jpg?sign=1739272990-vlv4Yi6nCeGlaBwn5v11egQFhItiGnwG-0-775aea82b690e15342f4465b2ca7bdbd)
图5.5 使用if…else进行选择判断
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P109_74181.jpg?sign=1739272990-7WsGMcShqCGutdiw7XCzAAUC1drTfb3J-0-2b3de7ba63fe2e0f90f7f7d9fcc077e2)
代码分析:
(1)程序中定义变量iNumber用来保存输入的数据,之后通过if…else语句进行判断变量的值。
(2)用户输入数据的值为0,if语句判断iNumber变量,此时也就是判断输入的数值。因为0表示的是假,所以if后面紧跟着的语句块不会执行,而会执行else后面语句块中的操作,显示一条信息并将数值进行输出。
(3)从程序的运行结果中也可以看出,当if语句检验的条件为假时,就执行相应的else语句后面的语句或者语句块。
if…else语句也可以用来判断表达式,根据表达式的结果从而选择不同的操作。
【例5.4】 使用if…else语句得到两个数的最大值。(实例位置:资源包\源码\05\5.4)
本实例要实现的功能是比较两个数值的大小,这两个数值由用户输入,然后将其中相对较大的数值输出显示。
运行程序,显示效果如图5.6所示。
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P110_74182.jpg?sign=1739272990-zcSpU2OLuMsf3Ed3rTWEf5SLp0vC45AF-0-330900de7ae8236dc11040db1e97109b)
代码分析:
(1)在程序运行过程中,利用printf函数先来显示一条信息,通过信息提示用户输入两个数据,第一个输入的是5,第二个输入的是10。这两个数据的数值由变量iNumber1和iNumber2保存。
(2)if语句判断表达式iNumber1>iNumber2的真假。如果判断的结果为真,则执行if后的语句输出iNumber1的值,说明iNumber1是最大值;如果判断的结果为假,则执行else后的语句输出iNumber2的值,说明iNumber2是最大值。因为iNumber1的值为5,iNumber2的值为10,所以iNumber1>iNumber2的关系表达式结果为假。这样执行的就是else后的语句,输出iNumber2的值。
【例5.5】 使用if…else语句模拟信号灯。(实例位置:资源包\源码\05\5.5)
在很多的路口上,信号灯多数还有一个黄灯,用来提示车辆准备行驶或者停车的。上一小节中,使用if语句进行模拟信号灯,在本实例中是使用if…else语句进一步完善这个程序。使得信号灯具有在黄灯情况下相应的功能。
运行程序,显示效果如图5.7所示。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P110_15187.jpg?sign=1739272990-oU30LUrBJunQl6j23oUFrdFyGRUZ3jp7-0-0208595c81864277027c9331b1f40520)
图5.6 使用if…else语句得到两个数的最大值
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P110_15188.jpg?sign=1739272990-ROTAZBEfHS0zZeYAF50l1f1q3c3CKWWy-0-b79318dc7067157f8906b292aae6cd46)
图5.7 使用if…else语句模拟信号灯
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P110_74187.jpg?sign=1739272990-egkPiLoEqe55cnzY4abt33yGnhCxFJhe-0-76243052faea8272687232054fa5d0f1)
代码分析:
(1)程序运行时,先进行输出信息,提示用户输入一个信号灯的状态。其中0表示的是红灯,1表示的是绿灯,其他的数字表示的是黄灯。
(2)输入一个数字2,将其保存到变量iSignal中。接下来使用if语句进行判断。
(3)第一个if语句判断iSignal是否等于1,很明显判断结果为假,所以不会执行第一个if后的语句块中的内容。
(4)第二个if语句判断iSignal是否等于0,结果为假,所以不会执行第二个if后的语句块中的内容。
(5)因为第二个if语句为假值,所以就会执行else后的语句块。在语句块中通过输出信息提示现在为黄灯,车辆要进行准备。
注意
上面这个程序实际上是存在一些问题的,假如用户输入的数值为1,第一个if判断为真值,则会执行后面紧跟着的语句块。并且因为第二个if语句判断出iSignal值不等于1,所以为假值,这时会执行else后的语句块。else后的语句执行是我们不希望发生的,如图5.8所示。在5.2.3节中将会讲述解决这个问题的方法。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P111_74189.jpg?sign=1739272990-8YJjiFWU0uH8PvUTqfQgJgHISWWZeFmE-0-0ff1bf2fd7874a8fd3ed8389ae7191da)
图5.8 使用if…else语句模拟信号灯时可能出现的错误
5.2.3 else if语句形式
利用if和else关键字的组合可以实现else if语句,这是对一系列互斥的条件进行检验。其一般形式如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P112_74196.jpg?sign=1739272990-H2DYYqwpoZK2uHzedHlu9tEOIk3iLAZs-0-80e15b70b1889baf02e78a0ff048177f)
else if语句执行流程如图5.9所示。
根据流程图可以看到首先对if语句中的表达式1进行判断,如果结果为真值,则执行后面接跟着的语句1,跳过else if判断和else语句;如果结果为假,那么进行判断else if中的表达式2,如果表达式2为真值,那么将执行语句2而不会执行后面else if的判断或者else语句。当所有的判断都不成立,也就是都为假值的时候执行else后的语句块。例如下面代码:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P112_15444.jpg?sign=1739272990-AE6xhKWKg2hVI0BZLw3yJYkMNbBKgSNb-0-d86e4822a3550966adb4f824e2c1da82)
图5.9 else if语句执行流程图
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P112_74197.jpg?sign=1739272990-ZzlFWYaXrsQ6rX2zGqIoBAp8zrjYRsSo-0-e827474b85d808b069f843d37aa76378)
上面的代码表示的意思是,使用if语句进行判断变量iSelection的值是否为1,如果为1则执行后面语句块中的内容,跳过后面的else if判断和else语句的执行;如果iSelection的值不为1,那么else if进行判断iSelection的值是否为2,如果值为2则执行后面语句块中的内容,执行完后跳过后面else if和else的操作;如果iSelection的值也不为2,那么接下来的else if语句判断iSelection是否等于数值3,如果等于3则执行后面语句块中的内容,否则执行else的语句块中内容。也就是说当前面所有的判断都不成立、为假值时,执行else语句块中的内容。
【例5.6】 使用else if编写屏幕菜单程序。(实例位置:资源包\源码\05\5.6)
在本实例中,因为要对菜单进行选择,那么首先要进行显示菜单。利用格式输出函数将菜单中所需要的信息进行输出。
运行程序,显示效果如图5.10所示。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P112_74201.jpg?sign=1739272990-Gws36UAFrcPXBwP7pEjAtf4cII5dps30-0-17105d39c9efbd5910b4682f684b5e71)
图5.10 使用else if编写屏幕菜单程序
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P113_74203.jpg?sign=1739272990-iV1fvS3wmYIo5EOk4WbZotJhV9cXgObS-0-3ba264b0723ca5461ccada68a4d916da)
代码分析:
(1)程序中使用printf函数将可以进行选择的菜单显示输出。之后显示一条信息提示用户选择一个菜单项输入。
(2)这里假设输入数字为3,变量iSelection将输入的数值保存,用来进行下面判断。
(3)在判断语句中,可以看到使用if语句判断iSelection是否等于1,使用else if判断iSelection是否等于2和等于3,如果都不满足的话则会执行else处的语句。因为iSelection的值为3,所以iSelection==3关系表达式为真,执行相应else if处的语句块,输出提示信息。
在5.2.2节中使用if…else语句模拟信号灯时,其中连续使用两次if语句,当第一个if语句满足条件时,else语句也会执行。现在使用else if语句再一次修改使其功能完善。
【例5.7】 使用else if语句修改信号灯程序。(实例位置:资源包\源码\05\5.7)
运行程序,显示效果如图5.11所示。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P114_15667.jpg?sign=1739272990-mfCGSC8hpnAU7DZAmVNL51axvqKEMXiq-0-57829526ca51e8ace29ad0eb770546ba)
图5.11 使用else if语句修改信号灯程序
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P114_74205.jpg?sign=1739272990-ebIDJAju12sCFvmAVynwHYZ2aT2Nfd9o-0-2c0aff8212d5d46ad3304afa4b85d276)
代码分析:
在原来的程序中,只是将第二个if判断改成了else if判断。这样当输入的数字为1时,程序就可以正常地运行了。
通过对两个程序结果的比较可以看出,连续地使用if进行判断条件的方法,这种方式中每个条件的判断都是分开的、独立的。而使用if和else if进行判断条件,所有的判断可以看成是一个整体,如果其中有一个为真,那么下面的else if中的判断即使有符合的也会被跳过,不会执行。
5.3 if的嵌套形式
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P114_15803.jpg?sign=1739272990-lEKOZKYDoJWojcQaVBIuh6ESGpxH3lg6-0-a316d681fc7058e1b0cd0013edf414af)
视频讲解
在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P115_74207.jpg?sign=1739272990-uQCXbtGMlFsn13BB1Iq7SG5pVa2dKal8-0-5afb88d161366a8a290ce61bf75568be)
使用if语句嵌套形式的功能是对判断的条件进行细化,然后做出相应的操作。
这就好像在生活中,每天早上醒来的时候会想一下今天是星期几,如果是周末那么是休息日,如果不是周末那么要上班。那么休息日中可能是星期六或者是星期日,星期六的话和朋友去逛街,星期日的话在家陪家人。
看一下上面的例子在语句中如何表示:if语句判断表达式1就像判断今天是否是休息日,假设判断结果为真,则进行if语句判断表达式2,这就好像判断出今天是休息日,然后再去判断今天是不是周六。如果if语句判断表达式2为真,那么执行语句块1中的内容;如果不为真,那么执行语句块2中的内容。这就像比喻中,如果为星期六的话陪朋友逛街,如果为星期日的话在家陪家人。外面的else语句表示如果不为休息日时的相应操作。如下代码所示:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P115_74208.jpg?sign=1739272990-mNQQrKa9xWh7Jg41JeAWBevUqwlHYBA7-0-5f29eadaa1aa262f90db3fa8f360cbc0)
上面的代码表示了整个if语句嵌套的操作过程,首先判断为休息日的情况,然后根据判断的结果再进行选择相应的判断或者操作。过程如上面对if语句判断的描述一样。
注意
在使用if语句嵌套时,应当注意if与else的配对情况。else总是与其上面最近的、未配对的if进行配对。
在前面曾经介绍过,使用if语句,如果只有一条语句时可以不用大括号。修改一下上面的代码,让其先进行判读是否为工作日,然后在工作日中只判断星期一的情况。例如:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P115_74209.jpg?sign=1739272990-iJ9ubuollxvKxSzDH6xMCAdtPwdFfsnH-0-74116ef55186d6f3e89fd3b8cdb53229)
原本这段代码的作用是先判断是否为工作日,是工作日的话进行判断是否为星期一。不是工作日的话进行判断是否是星期六,否则就是星期日。但是因为else总是与其上面最近的未配对的if进行配对,所以else与第二个if语句配对,形成内嵌if语句块,这样的话就不满足设计的要求。如果为if语句后的语句块加上大括号,那么就不会出现这种情况了。所以笔者曾经建议大家即使是一条语句也要使用大括号。
【例5.8】 使用if嵌套语句选择日程安排。(实例位置:资源包\源码\05\5.8)
在本实例中,使用if嵌套语句对输入的数据逐步进行判断,最终选择执行相应的操作。
运行程序,显示效果如图5.12所示。
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P116_16185.jpg?sign=1739272990-KP1UeI97S2gelQbsaxHGXAKjTaKBGVCH-0-25a2502839def71c71dcfbc4a24eef48)
图5.12 使用if嵌套语句选择日程安排
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P116_74213.jpg?sign=1739272990-Ppm54aYTplNUXmuM7AMWwLcYEE5Xe7Hj-0-d493c57f02cd1a4feece8f4ab723f40f)
代码分析:
(1)在程序中定义变量iDay用来保存后面输入的数值。而其他变量表示一周中的每一天。
(2)在运行时,假设输入数值为6,代表选择星期六。if语句判断表达式iDay>Friday,如果成立的话表示输入的星期为休息日,否则会执行else表示工作日的部分。如果判断为真,则再利用if语句判断iDay是否等于Saturday变量的值,如果等于表示为星期六,那么执行后面的语句,输出信息表示星期六要和朋友去逛街。else语句表示的是星期日,输出信息为在家陪家人。
(3)因为iDay保存的数值为6,大于Friday,并且iDay等于Saturday变量的值,执行输出语句表示星期六要和朋友去逛街。
5.4 条件运算符
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P117_16271.jpg?sign=1739272990-BxltqflkBswh99QDAjxErurUEEro9EXT-0-4ecfdab151dffb832f24c1ee75a47e34)
视频讲解
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P117_16282.jpg?sign=1739272990-oM6SITmyIF93DXJ7npFXBCJZqSt9EtB9-0-0580db8fa2a2872d9072d9ba1e01d040)
动图演示
在使用if语句时,可以通过判断表达式为“真”或“假”,而执行相应的表达式。例如:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P117_74218.jpg?sign=1739272990-uLWlPQN0vy1u3UeUN9vEJX3XTukJONj2-0-40e8a1a6b1282d696576bae44833e04a)
上面的代码可以用条件运算符“? :”来进行简化,例如:
max=(a>b)?a:b;
条件运算符对一个表达式的真假结果进行检验,然后根据检验结果返回另外两个表达式中的一个。条件运算符的一般形式如下:
表达式1?表达式2:表达式3;
在运算中,首先对第一个表达式的值进行检验。如果值为真,返回第二个表达式的结果值;如果值为假,则返回第三个表达式的结果值。例如上面使用条件运算符的代码,首先判断表达式a>b是否成立,成立说明结果为真,否则为假。如果为真,将a的值赋给max变量;如果为假,则将b的值赋给max变量。
【例5.9】 使用条件运算符计算欠款金额。(实例位置:资源包\源码\05\5.9)
本实例要求设计还欠款时,还钱的时间如果过期,则会在欠款的金额上增加10%的罚款。其中使用条件运算符进行判断选择。
运行程序,显示效果如图5.13所示。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P117_16266.jpg?sign=1739272990-8cK9PuuAJWd34FfnhZQpLOwKezJsPHat-0-f424e73bb9f89a4a23936695d51fba7a)
图5.13 使用条件运算符计算欠款金额
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P118_74223.jpg?sign=1739272990-k3M4kQEYBwQPaCJ1q5yCr6QPjsjLodvQ-0-c36f2bf746169827a2dd734f0fb5d7af)
代码分析:
(1)在程序代码中,定义变量fDues表示欠款的金额,fAmount表示应该还款的金额,iOntime的值表示有没有按时还款,cChar用字符表示有没有按时还款。
(2)通过运行程序时的提示信息,用户输入数据。假设用户输入欠款的金额为100,之后提示有没有按时还款。如果用户输入y表示按时还款,n表示没有按时还款。
(3)假设用户输入n,表示没有按时还款。即使用条件运算符进行判断表达式“cChar=='y'”是否成立,成立时为真值,那么将“?”号后的值1赋给iOntime变量;不成立为假时,将0赋给iOntime变量。因为“cChar=='y'”的表达式不成立,所以iOntime的值为0。
(4)使用条件运算符对iOntime的值进行判断,如果iOntime为真,则说明按时还款为原来的欠款,返回fDues值给fAmount变量。若iOntime值为假,则说明没有按时还款,那样要加上10%的罚金,返回表达式fDues*1.10的值给fAmount变量。因为iOntime为0,则fAmount值为fDues*1.10的结果。
5.5 switch语句
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P118_16411.jpg?sign=1739272990-bIoBUlaYtZaX1SqDSauehOJS2rFIvZBL-0-dfd1431e7dae48f6969055f662b69982)
视频讲解
从前面所学得知if语句只有两个分支可供选择,而在实际问题中常常需要用到多分支的选择。当然使用嵌套的if语句也可以实现多分支的选择,但是如果分支较多,会使得嵌套的if语句层数多,程序冗余并且可读性不好。C语言中使用switch语句直接处理多分支选择的情况,提高程序代码的可读性。
5.5.1 switch语句的基本形式
switch语句是多分支选择语句。例如,如果只需要检验某一个整型变量的可能取值,那么可以用更简便的switch语句。switch语句的一般形式如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P119_74225.jpg?sign=1739272990-jgjpnXYgYmrwW9KuFQ1MbQ3eyLiEU6fy-0-85ad78acf48619c9b5d525f2f0a267e3)
其语句的程序流程如图5.14所示。
通过流程图进行分析switch语句的一般形式。switch后面括号中的表达式就是要进行判断的条件。在switch的语句块中,case关键字表示符合检验条件的各种情况,其后的语句是相应的操作。程序中还有一个default关键字,作用是如果上面没有符合条件的情况,那么执行default后的默认情况语句。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P119_16576.jpg?sign=1739272990-5kBlR2bs7GQorSTrBZmQ1VNIfZEVCbBZ-0-a315b9b885351bb78865a5471368cb0b)
图5.14 switch多分支选择语句流程
说明
switch语句检验的条件必须是一个整型表达式,这意味着其中也可以包含运算符和函数调用。而case语句检验的值必须是整型常量,也就是说可以是常量表达式或者常量运算。
通过一段代码再来分析一下switch语句的使用方法,如下面的代码:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P119_74226.jpg?sign=1739272990-SsOtEDjIlLiJXUInT9x8u50YgnwRMqKI-0-58839b2895625b0f89581c27865c474e)
其中switch判断selection变量的值,利用case语句检验selection值的不同情况。假设selection的值为2,那么执行case为2时的情况,执行后跳出switch语句。如果selection的值不是case中所列出的检验情况,那么执行default中的语句。在每一个case语句后或default语句后都有一个break关键字。break语句是用来跳出switch结构,不再执行下面的代码。
注意
在使用switch语句时,我们知道如果case语句后面的值没有一个能匹配switch语句的条件,那么就执行default语句后面的代码。要注意的是,其中任何两个case语句都不能使用相同的常量值。并且每一个switch结构只能有一个default语句,而且default可以省略。
【例5.10】 使用switch语句输出分数段。(实例位置:资源包\源码\05\5.10)
本实例中,要求按照考试成绩的等级输出百分制分数段的范围,其中要使用switch语句进行判断分数的情况。
运行程序,显示效果如图5.15所示。
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P120_16759.jpg?sign=1739272990-rKOu581mHL5vLDazNJjfziDnsqM7ajnt-0-57739218ca29a5036e82215618838fa5)
图5.15 使用switch语句输出分数段
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P120_74230.jpg?sign=1739272990-xd8YqvuJbk4c8SLHEl5nV58GnVax0zwD-0-5dd10f4d687c793d021d3f59679bc9ee)
代码分析:
(1)程序的代码中,定义变量cGrade用来保存用户输入的成绩等级。
(2)使用switch语句判断字符变量cGrade,其中使用case关键字检验可能出现的级别情况。并且在每一个case语句的最后都会有break进行跳出。如果没有符合的情况则会执行default默认语句。
注意
在case语句表示的条件后有一个冒号“:”,在编写时不要忘记。
(3)在程序中,假设用户输入字符为'B',在case检验中有为'B'的情况,那么执行该级别的case后的语句块,将分数段进行输出。
在使用switch语句时,每一个case情况中都要使用break语句。如果不是用break语句会出现什么情况呢?先来看一下break的作用,break使得执行完case语句后跳出switch语句。可以进行一下猜测,如果没有break语句的话,程序可能会将后面的内容都执行。为了验证猜测是否正确,将上面程序中的break去掉。还是输入字符'B',运行程序,显示结果如图5.16所示。
从运行的结果中可以看出,当去掉break语句后,会将case检验相符情况后的所有语句进行输出,所以在case语句中break语句是不能缺少的。
【例5.11】 修改日程安排程序。(实例位置:资源包\源码\05\5.11)
在前面的实例中,使用嵌套的if语句形式编写了日程安排程序,现在要求使用switch语句对程序进行修改。
运行程序,显示效果如图5.17所示。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P121_74239.jpg?sign=1739272990-hSOCEAHfnFFPmGgxAEsqxek1ECePh6uM-0-1151743e5d64c733f0a2c66ffb3eb310)
图5.16 不添加break的情况
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P121_16813.jpg?sign=1739272990-k1SqeUbtGo8VmNuaSHAG7lGzASttz3lG-0-5f39a26db42a0327ca6e7a997ba3529c)
图5.17 修改日程安排程序
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P121_74234.jpg?sign=1739272990-O2c4rO9IsRF2F1LU8iyP6359NFjPfiR8-0-ab4dbdd3bc9e48c04d6777d9f2f2f26c)
在程序中,使用switch语句将原来的if语句都去掉,使得程序的结构看起来比较清晰,易于观察。
5.5.2 多路开关模式的switch语句
在例5.11中,将break去掉之后,会将符合检验条件后的所有语句都输出。利用这个特点,可以设计多路开关模式的switch语句,其形式如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P122_74242.jpg?sign=1739272990-BntAwTKQsSYXWcSj4cYxCQ7FoZ58k6Ux-0-9a2f10ad1b675cde4477a0315f0acbf9)
可以看到如果在case 2后不使用break语句,那么此时与符合case 3检验时的效果是一样的。也就是说使用多路开关模式,可以让多种检验条件使用同一种解决方式。
【例5.12】 使用多路开关模式编写日程安排程序。(实例位置:资源包\源码\05\5.12)
在本实例中,要求使用多路开关的模式编写操作相同的检验结果,并且在输入不正确的日期时进行错误提示。
运行程序,显示效果如图5.18所示。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P123_17086.jpg?sign=1739272990-VFzUC72A4RM6Lp4xBYlMKGTNusNICqVe-0-79c04327babf993276497809982a44df)
图5.18 使用多路开关模式编写日程安排程序
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P123_74245.jpg?sign=1739272990-fsCa8dF3yqeC0eHFYEPTMcifGgZyQOzt-0-b71c2a6f81ce1cebea771f5b3c6921fa)
程序中使用多路开关模式,使得检测iDay的值为2、3、4、5这4种情况时,都会执行相同的结果。并且利用default语句,在输入不符合的数字时,显示输入错误的提示信息。
5.6 ifelse语句和switch语句的区别
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P124_17361.jpg?sign=1739272990-J3RWNqA7rTNbW06XhV0jdJL23Ucsbq0l-0-5ea001c44faba18f6b4d7a7bdbe3ac9e)
视频讲解
if else语句和switch语句都是进行判断,然后根据不同情况的检验条件做出相应的判断。那么if else语句和switch语句有什么不同呢?下面从两者的语法和效率的比较进行讲解。
语法的比较
if是配合else关键字进行使用的,而switch是配合case使用的;if语句先对条件进行判断,而switch语句是后进行判断。
效率的比较
if else结构在开始时对少数的检验判断速度比较快,但是随着检验数量的增长会逐渐变慢,其中的默认情况将会是最慢的。使用if else结构可以判断表达式,但是也不能通过减少选择深度来减缓检验速度变慢的趋势,并且在将来也不容易对程序进行添加扩充。
switch结构中,对其中每一项case语句检验的速度都是相同的,但对于检验default语句的默认情况比其他情况都快。
那么当判定的情况占少数时,if else结构比swtich结构检验速度快。也就是说,如果分支在3、4个以下的话,用if else结构比较好,否则选择switch结构。
【例5.13】 if语句和switch语句的综合使用。(实例位置:资源包\源码\05\5.13)
在本实例中,要求设计程序通过输入一年中的月份,得到这个月所包含的天数。判断数量的情况,根据需求选择使用if语句和switch语句。
运行程序,显示效果如图5.19所示。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P124_17284.jpg?sign=1739272990-9ysnobIHPdqEjzO9Nh1jL27y1hWwURwD-0-7022184398d7279899f6ea0c88aedc2a)
图5.19 if语句和switch语句的综合使用
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P124_74247.jpg?sign=1739272990-q6EDNvlp1EpSjLPLyPLcgtuLH1bZCvV3-0-c6a07583f1dd3d788e3b8d46c7ca55a2)
代码分析:
因为要判断一年中12个月份所包含的日期数,所以要对12种不同的情况进行检验。因为要检验的数量比较多,所以使用switch结构判断月份比较合适,并且可以使用多路开关模式,使得编写更为简洁。其中case语句用来判断月份iMonth的情况,并且为iDay赋相应的值。default默认处理为输入的月份不符合检验条件时,为iDay赋值为-1。
switch检验完成之后,要输出得到的日期数,因为有可能日期为-1,也就是出现月份错误的情况。这时判断的情况只有两种,就是iDay是否为-1,检验的条件少所以使用if语句更为方便。
5.7 选择结构程序应用
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P125_17562.jpg?sign=1739272990-3ovFX06ElAkxkdk1zLScWnpeWmzcDHY7-0-9ce83e5ad8bb37503a6c62912b0688fa)
视频讲解
本节通过实例,练习使用if语句和switch语句,对其结构和使用的方法进行掌握,逐步加深对C语言中选择结构的程序设计学习。
【例5.14】 使用switch语句计算运输公司的计费。(实例位置:资源包\源码\05\5.14)
实例要求,某运输公司的收费按照用户运送货物的路程进行计费。路程(s)越远,每公里运费越低,其收费标准如表5.1所示。
表5.1 运送货物收费标准
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-T126_74254.jpg?sign=1739272990-vA4jNZwRUIrRhYqNE3Kxh305Gj9wOrZz-0-809387cb483e33145f6d0823f60aeb98)
运行程序,显示效果如图5.20所示。
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P126_17632.jpg?sign=1739272990-iTO5FXUxL7Ho3m4OaoCWwf5CROSzjSQW-0-85dc4edf095da0b530de055c50d19a64)
图5.20 使用switch语句计算运输公司的计费
程序代码如下:
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P126_74252.jpg?sign=1739272990-3xjYZ4Hma8Vf3oBN0zcMXLVGHFUSJIV1-0-9f5f6e9a8e194a1d60673f1498b7c4af)
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P127_74256.jpg?sign=1739272990-Us4bl0KKS69COsdkRD3xRGRdUNFbvlAL-0-49beb853619fc96d5659b4a322b38935)
代码分析:
在程序代码中,定义的变量fPrice、fWeight和fAllPrice分别表示单价、重量和计算得到的总价格。通过对路程使用除法得到条件,然后使用switch语句进行检验。
其中需要注意的是,在计算iSwitch=iSpace/250时,由于iSwitch定义的类型为整型,所以iSwitch的值为计算后得到的整数部分。
5.8 实战
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P127_17960.jpg?sign=1739272990-rA0hhS834SpNwmigdXfrU1WRqMIQA9y4-0-56fb0310b5212b6263d12af6db8638fd)
视频讲解
5.8.1 将3个数从小到大输出
任意输入3个整数,编写程序实现对这3个整数由小到大的排序,并将排序后的结果显示在屏幕上。运行结果如图5.21所示。(实例位置:资源包\源码\05\实战\01)
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P128_17976.jpg?sign=1739272990-u9uYMrUJ1YAAvvtvsnG2PgevRjh0d7YB-0-70d3e2332765bdf6bf6957513674f5d0)
图5.21 3个数由小到大排序
5.8.2 求学生的最低分和最高分
编写一个程序,要求从键盘上输入某个学生的4科成绩,求出该学生的最高分和最低分。运行程序,效果如图5.22所示。(实例位置:资源包\源码\05\实战\02)
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P128_17981.jpg?sign=1739272990-cVsbU1COvps7E2ZDOvuWBuGqZgY9Klg8-0-4c2abd4937330406a3f02f3cbc7fdfda)
图5.22 求学生的最低分和最高分
5.8.3 模拟自动售货机
设计一个自动售货机的程序,运行程序,提示用户输入要选择的选项,当用户输入以后,提示所选择的内容。本程序中使用了switch分支结构,来解决程序中的选择问题。程序运行效果如图5.23所示。(实例位置:资源包\源码\05\实战\03)
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P128_17986.jpg?sign=1739272990-eHi60kBK425Xbn1VykrpTPqo3GAT4mLd-0-56bc6ea861713979a6831f729b82b143)
图5.23 模拟自动售货机
5.8.4 模拟ATM机界面程序
模拟银行ATM机操作界面,主要实现取款功能,在取款操作前用户要先输入密码,密码正确才可进行取款操作,取款时将显示取款金额及剩余金额。操作完毕退出程序。运行结果如图5.24所示。(实例位置:资源包\源码\05\实战\04)
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P129_17996.jpg?sign=1739272990-k07nswhs0Gp0g1Har5mCBp83cIIO4QhL-0-399a9d5b8e4305efac9b02a6ad978159)
图5.24 模拟ATM机界面
5.8.5 计算某日是该年的第几天
本实例要求编写一个计算天数的程序,即从键盘中输入年、月、日,在屏幕中输出此日期是该年的第几天。运行结果如图5.25所示。(实例位置:资源包\源码\05\实战\05)
![](https://epubservercos.yuewen.com/E2F069/15825991605218906/epubprivate/OEBPS/Images/Figure-P129_18001.jpg?sign=1739272990-m7LEXbut6s06llAzkOD4mlPF3OXvQbo8-0-5198d1e3096b4d4b1234d341c573fe25)
图5.25 计算某日是该年第几天
要实现本实例要求的功能主要有以下两个要点:
(1)判断输入的年份是否是闰年,这里自定义函数leap来进行判断。该函数的核心内容就是闰年的判断条件,即输入年份能被4整除但不能被100整除,或能被400整除为闰年。
(2)如何求此日期是该年的第几天。这里将12个月每月的天数存到数组中,因为闰年2月份的天数有别于平年,故采用两个数组a和b分别存储。当输入年份是平年,月份为m时,就累加存储着平年每月天数的数组的前m-1个元素,将累加的结果加上输入的日便求出了最终结果,闰年的算法类似。