第5章 设计选择/分支结构程序
(视频讲解:68分钟)
走入程序设计领域的第一步,是学会如何设计编写一个程序,其中顺序结构程序设计是最简单的程序设计,而选择结构程序设计中就用到了一些条件判断的语句,增加了程序的功能,也增强了程序的逻辑性与灵活性。
本章致力于使读者掌握如何使用if语句进行条件判断,掌握有关switch语句的使用方式。
学习摘要:
使用if语句编写判断语句
掌握switch语句的编写方式
区分if else语句与switch语句
通过应用程序了解选择结构的具体使用方式
5.1 if语句
视频讲解
在日常生活中,为了使社会的交通畅通运行,在每一个路口会有交通信号灯。在信号灯显示为绿色时车辆可以行驶通过,当信号灯转为红色时车辆就要停止行驶。从中可以看到信号灯给出了信号,人们通过不同的信号进行判断,然后根据判断的结果做出相应的操作。
在C语言程序中,也可以完成这样的判断操作,利用的就是if语句。if语句的功能就像判断路口信号灯一样,根据不同的条件,判断是否进行操作。
据说第一台数字计算机是用来进行决策操作的,所以使得之后的计算机都继承了这项功能。程序员将决策表示成对条件的检验,即判断一个表达式值的真假。除了没有任何返回值的函数和返回无法判断真假的结构函数外,其他表达式的返回值都可以判断真假。
下面具体介绍if语句的有关内容。
5.2 if语句的基本形式
视频讲解
动图演示
if语句就是判断表达式的值,然后根据该值的情况选择如何控制程序流程。表达式的值不等于0,也就是为真值。否则,就是假值。if语句有3种形式,分别为if语句形式、if …else语句形式、else if语句形式。每种情况的具体使用方式如下。
5.2.1 if语句形式
if语句形式就通过对表达式进行判断,然后根据判断的结果选择是否进行相应的操作。if语句的一般形式如下:
if(表达式) 语句;
其语句执行流程如图5.1所示。
图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后面的执行部分只是调用了一条语句,如果是两条语句时怎么办呢?这时可以使用大括号使之成为语句块,例如:
将执行的语句都放在大括号中,这样当if语句判断条件为真时,就可以全部执行。使用这种方式的好处可以很规范、清楚地看出来if语句所包含语句的范围,所以笔者在这里建议大家使用if语句时,都使用大括号将执行语句包括在内。
【例5.1】 使用if语句模拟信号灯指挥车辆行驶。(实例位置:资源包\源码\05\5.1)
在本实例中,为了模拟十字路口上信号灯指挥车辆行驶,要使用if语句进行判断信号灯的状态。如果信号灯为绿色,说明车辆可以行驶通过,通过输出语句进行信息,提示说明车辆的行动状态。
运行程序,显示效果如图5.2所示。
程序代码如下:
图5.2 使用if语句模拟信号灯指挥车辆行驶
代码分析:
(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所示。
程序代码如下:
图5.3 完善if语句的使用
代码分析:
(1)在上一个实例程序的基础上进行修改,完善程序的功能。在其代码中添加一个if判断语句,用来表示当信号灯为红灯时,进行相应的操作。
(2)从程序的开始处来分析整个程序的运行过程。使用scanf函数输入数据时,这次用户输入为0,表示红灯。
(3)程序继续执行,第一个if语句进行判断iSignal变量的值是否为1,如果判断的结果为真,则说明信号灯为绿灯。因为iSignal变量的值为0,所以判断的结果为假。当if语句判断的结果为假,则不会执行后面语句中的内容。
(4)接下来是新添加的if语句,在其中判断iSignal变量是否等于0,如果判断成立为真,则表示信号灯此时为红灯。因为输入的值为0,则iSignal==0条件成立,执行if后面的语句内容。
初学编程的人在程序中使用if语句时,常常会将下面的两个判断弄混,例如:
这两行代码的判断中都有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语句来完成的。其一般形式如下:
其语句执行流程如图5.4所示。
在if后的括号中还是需要判断的表达式,如果判断的结果为真值,则执行if后的语句块内容;如果判断的结果为假值,则执行else语句后的语句块内容。也就是说,当if语句检验的条件为假时,就执行相应的else语句后面的语句或者语句块。例如下面的代码:
图5.4 if…else语句执行流程
在上面的代码中,如果if判断变量value的值为真的话,则执行if后面的语句块;如果if判断的结果为假值,则执行else下面的语句块。
注意
一个else语句必须跟在一个if语句的后面。
【例5.3】 使用if…else进行选择判断。(实例位置:资源包\源码\05\5.3)
在本实例中,使用if…else语句判断用户输入的数值,输入的数字为0表示条件为假,输入的数字为非0,表示条件为真。
运行程序,显示效果如图5.5所示。
程序代码如下:
图5.5 使用if…else进行选择判断
代码分析:
(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所示。
程序代码如下:
代码分析:
(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所示。
图5.6 使用if…else语句得到两个数的最大值
图5.7 使用if…else语句模拟信号灯
程序代码如下:
代码分析:
(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节中将会讲述解决这个问题的方法。
图5.8 使用if…else语句模拟信号灯时可能出现的错误
5.2.3 else if语句形式
利用if和else关键字的组合可以实现else if语句,这是对一系列互斥的条件进行检验。其一般形式如下:
else if语句执行流程如图5.9所示。
根据流程图可以看到首先对if语句中的表达式1进行判断,如果结果为真值,则执行后面接跟着的语句1,跳过else if判断和else语句;如果结果为假,那么进行判断else if中的表达式2,如果表达式2为真值,那么将执行语句2而不会执行后面else if的判断或者else语句。当所有的判断都不成立,也就是都为假值的时候执行else后的语句块。例如下面代码:
图5.9 else if语句执行流程图
上面的代码表示的意思是,使用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所示。
图5.10 使用else if编写屏幕菜单程序
程序代码如下:
代码分析:
(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所示。
图5.11 使用else if语句修改信号灯程序
程序代码如下:
代码分析:
在原来的程序中,只是将第二个if判断改成了else if判断。这样当输入的数字为1时,程序就可以正常地运行了。
通过对两个程序结果的比较可以看出,连续地使用if进行判断条件的方法,这种方式中每个条件的判断都是分开的、独立的。而使用if和else if进行判断条件,所有的判断可以看成是一个整体,如果其中有一个为真,那么下面的else if中的判断即使有符合的也会被跳过,不会执行。
5.3 if的嵌套形式
视频讲解
在if语句中又包含一个或多个if语句称为if语句的嵌套。一般形式如下:
使用if语句嵌套形式的功能是对判断的条件进行细化,然后做出相应的操作。
这就好像在生活中,每天早上醒来的时候会想一下今天是星期几,如果是周末那么是休息日,如果不是周末那么要上班。那么休息日中可能是星期六或者是星期日,星期六的话和朋友去逛街,星期日的话在家陪家人。
看一下上面的例子在语句中如何表示:if语句判断表达式1就像判断今天是否是休息日,假设判断结果为真,则进行if语句判断表达式2,这就好像判断出今天是休息日,然后再去判断今天是不是周六。如果if语句判断表达式2为真,那么执行语句块1中的内容;如果不为真,那么执行语句块2中的内容。这就像比喻中,如果为星期六的话陪朋友逛街,如果为星期日的话在家陪家人。外面的else语句表示如果不为休息日时的相应操作。如下代码所示:
上面的代码表示了整个if语句嵌套的操作过程,首先判断为休息日的情况,然后根据判断的结果再进行选择相应的判断或者操作。过程如上面对if语句判断的描述一样。
注意
在使用if语句嵌套时,应当注意if与else的配对情况。else总是与其上面最近的、未配对的if进行配对。
在前面曾经介绍过,使用if语句,如果只有一条语句时可以不用大括号。修改一下上面的代码,让其先进行判读是否为工作日,然后在工作日中只判断星期一的情况。例如:
原本这段代码的作用是先判断是否为工作日,是工作日的话进行判断是否为星期一。不是工作日的话进行判断是否是星期六,否则就是星期日。但是因为else总是与其上面最近的未配对的if进行配对,所以else与第二个if语句配对,形成内嵌if语句块,这样的话就不满足设计的要求。如果为if语句后的语句块加上大括号,那么就不会出现这种情况了。所以笔者曾经建议大家即使是一条语句也要使用大括号。
【例5.8】 使用if嵌套语句选择日程安排。(实例位置:资源包\源码\05\5.8)
在本实例中,使用if嵌套语句对输入的数据逐步进行判断,最终选择执行相应的操作。
运行程序,显示效果如图5.12所示。
程序代码如下:
图5.12 使用if嵌套语句选择日程安排
代码分析:
(1)在程序中定义变量iDay用来保存后面输入的数值。而其他变量表示一周中的每一天。
(2)在运行时,假设输入数值为6,代表选择星期六。if语句判断表达式iDay>Friday,如果成立的话表示输入的星期为休息日,否则会执行else表示工作日的部分。如果判断为真,则再利用if语句判断iDay是否等于Saturday变量的值,如果等于表示为星期六,那么执行后面的语句,输出信息表示星期六要和朋友去逛街。else语句表示的是星期日,输出信息为在家陪家人。
(3)因为iDay保存的数值为6,大于Friday,并且iDay等于Saturday变量的值,执行输出语句表示星期六要和朋友去逛街。
5.4 条件运算符
视频讲解
动图演示
在使用if语句时,可以通过判断表达式为“真”或“假”,而执行相应的表达式。例如:
上面的代码可以用条件运算符“? :”来进行简化,例如:
max=(a>b)?a:b;
条件运算符对一个表达式的真假结果进行检验,然后根据检验结果返回另外两个表达式中的一个。条件运算符的一般形式如下:
表达式1?表达式2:表达式3;
在运算中,首先对第一个表达式的值进行检验。如果值为真,返回第二个表达式的结果值;如果值为假,则返回第三个表达式的结果值。例如上面使用条件运算符的代码,首先判断表达式a>b是否成立,成立说明结果为真,否则为假。如果为真,将a的值赋给max变量;如果为假,则将b的值赋给max变量。
【例5.9】 使用条件运算符计算欠款金额。(实例位置:资源包\源码\05\5.9)
本实例要求设计还欠款时,还钱的时间如果过期,则会在欠款的金额上增加10%的罚款。其中使用条件运算符进行判断选择。
运行程序,显示效果如图5.13所示。
图5.13 使用条件运算符计算欠款金额
程序代码如下:
代码分析:
(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语句
视频讲解
从前面所学得知if语句只有两个分支可供选择,而在实际问题中常常需要用到多分支的选择。当然使用嵌套的if语句也可以实现多分支的选择,但是如果分支较多,会使得嵌套的if语句层数多,程序冗余并且可读性不好。C语言中使用switch语句直接处理多分支选择的情况,提高程序代码的可读性。
5.5.1 switch语句的基本形式
switch语句是多分支选择语句。例如,如果只需要检验某一个整型变量的可能取值,那么可以用更简便的switch语句。switch语句的一般形式如下:
其语句的程序流程如图5.14所示。
通过流程图进行分析switch语句的一般形式。switch后面括号中的表达式就是要进行判断的条件。在switch的语句块中,case关键字表示符合检验条件的各种情况,其后的语句是相应的操作。程序中还有一个default关键字,作用是如果上面没有符合条件的情况,那么执行default后的默认情况语句。
图5.14 switch多分支选择语句流程
说明
switch语句检验的条件必须是一个整型表达式,这意味着其中也可以包含运算符和函数调用。而case语句检验的值必须是整型常量,也就是说可以是常量表达式或者常量运算。
通过一段代码再来分析一下switch语句的使用方法,如下面的代码:
其中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所示。
程序代码如下:
图5.15 使用switch语句输出分数段
代码分析:
(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所示。
图5.16 不添加break的情况
图5.17 修改日程安排程序
程序代码如下:
在程序中,使用switch语句将原来的if语句都去掉,使得程序的结构看起来比较清晰,易于观察。
5.5.2 多路开关模式的switch语句
在例5.11中,将break去掉之后,会将符合检验条件后的所有语句都输出。利用这个特点,可以设计多路开关模式的switch语句,其形式如下:
可以看到如果在case 2后不使用break语句,那么此时与符合case 3检验时的效果是一样的。也就是说使用多路开关模式,可以让多种检验条件使用同一种解决方式。
【例5.12】 使用多路开关模式编写日程安排程序。(实例位置:资源包\源码\05\5.12)
在本实例中,要求使用多路开关的模式编写操作相同的检验结果,并且在输入不正确的日期时进行错误提示。
运行程序,显示效果如图5.18所示。
图5.18 使用多路开关模式编写日程安排程序
程序代码如下:
程序中使用多路开关模式,使得检测iDay的值为2、3、4、5这4种情况时,都会执行相同的结果。并且利用default语句,在输入不符合的数字时,显示输入错误的提示信息。
5.6 ifelse语句和switch语句的区别
视频讲解
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所示。
图5.19 if语句和switch语句的综合使用
程序代码如下:
代码分析:
因为要判断一年中12个月份所包含的日期数,所以要对12种不同的情况进行检验。因为要检验的数量比较多,所以使用switch结构判断月份比较合适,并且可以使用多路开关模式,使得编写更为简洁。其中case语句用来判断月份iMonth的情况,并且为iDay赋相应的值。default默认处理为输入的月份不符合检验条件时,为iDay赋值为-1。
switch检验完成之后,要输出得到的日期数,因为有可能日期为-1,也就是出现月份错误的情况。这时判断的情况只有两种,就是iDay是否为-1,检验的条件少所以使用if语句更为方便。
5.7 选择结构程序应用
视频讲解
本节通过实例,练习使用if语句和switch语句,对其结构和使用的方法进行掌握,逐步加深对C语言中选择结构的程序设计学习。
【例5.14】 使用switch语句计算运输公司的计费。(实例位置:资源包\源码\05\5.14)
实例要求,某运输公司的收费按照用户运送货物的路程进行计费。路程(s)越远,每公里运费越低,其收费标准如表5.1所示。
表5.1 运送货物收费标准
运行程序,显示效果如图5.20所示。
图5.20 使用switch语句计算运输公司的计费
程序代码如下:
代码分析:
在程序代码中,定义的变量fPrice、fWeight和fAllPrice分别表示单价、重量和计算得到的总价格。通过对路程使用除法得到条件,然后使用switch语句进行检验。
其中需要注意的是,在计算iSwitch=iSpace/250时,由于iSwitch定义的类型为整型,所以iSwitch的值为计算后得到的整数部分。
5.8 实战
视频讲解
5.8.1 将3个数从小到大输出
任意输入3个整数,编写程序实现对这3个整数由小到大的排序,并将排序后的结果显示在屏幕上。运行结果如图5.21所示。(实例位置:资源包\源码\05\实战\01)
图5.21 3个数由小到大排序
5.8.2 求学生的最低分和最高分
编写一个程序,要求从键盘上输入某个学生的4科成绩,求出该学生的最高分和最低分。运行程序,效果如图5.22所示。(实例位置:资源包\源码\05\实战\02)
图5.22 求学生的最低分和最高分
5.8.3 模拟自动售货机
设计一个自动售货机的程序,运行程序,提示用户输入要选择的选项,当用户输入以后,提示所选择的内容。本程序中使用了switch分支结构,来解决程序中的选择问题。程序运行效果如图5.23所示。(实例位置:资源包\源码\05\实战\03)
图5.23 模拟自动售货机
5.8.4 模拟ATM机界面程序
模拟银行ATM机操作界面,主要实现取款功能,在取款操作前用户要先输入密码,密码正确才可进行取款操作,取款时将显示取款金额及剩余金额。操作完毕退出程序。运行结果如图5.24所示。(实例位置:资源包\源码\05\实战\04)
图5.24 模拟ATM机界面
5.8.5 计算某日是该年的第几天
本实例要求编写一个计算天数的程序,即从键盘中输入年、月、日,在屏幕中输出此日期是该年的第几天。运行结果如图5.25所示。(实例位置:资源包\源码\05\实战\05)
图5.25 计算某日是该年第几天
要实现本实例要求的功能主要有以下两个要点:
(1)判断输入的年份是否是闰年,这里自定义函数leap来进行判断。该函数的核心内容就是闰年的判断条件,即输入年份能被4整除但不能被100整除,或能被400整除为闰年。
(2)如何求此日期是该年的第几天。这里将12个月每月的天数存到数组中,因为闰年2月份的天数有别于平年,故采用两个数组a和b分别存储。当输入年份是平年,月份为m时,就累加存储着平年每月天数的数组的前m-1个元素,将累加的结果加上输入的日便求出了最终结果,闰年的算法类似。