
3.2 选择结构程序设计
学习目标
1)掌握if语句的语句格式与应用。
2)掌握复合if语句的语句格式与应用。
3)掌握条件运算符的用法。
4)掌握switch语句的语句格式与应用。
5)掌握switch语句中break语句的用法。
实例13 if语句——根据条件确定公司是否已经为司机投保
实例任务
如果司机满足下列条件之一,则公司为他们投保。这3个条件是:①司机已婚;②司机为30岁以上的未婚男性;③司机为25岁以上的未婚女性。如果以上条件一个也不满足,则公司不为司机投保。请编写一个程序,根据用户输入的司机的婚姻状态、性别和年龄,判断该司机是否已投保。程序运行结果如图3-8所示。

图3-8 程序运行结果

实例13
程序代码


相关知识
1.选择结构程序设计
选择结构又称分支结构,有二分支结构或多分支结构。选择结构根据条件判断结果,选择执行不同的程序分支。选择结构是程序的基本结构之一,几乎所有程序都包含选择结构。C语言中可以用两种控制语句来实现程序的分支控制,即if语句和switch语句,它们均可构成选择结构。
2.单分支选择if语句
单分支选择if语句的形式为:

该语句执行过程为先判断表达式的值,如果表达式的值为真,则执行后面的语句,否则什么也不做。
3.双分支选择if语句
双分支选择if语句的形式为:

该语句的执行过程为先判断表达式的值,如果表达式的值为真,执行语句1,否则执行语句2。
4.多分支选择if语句
多分支选择if语句的形式为:


该语句的执行过程为依次判断各表达式的值,当某个表达式的值为真时,执行其对应的语句体,然后跳到整个if语句之外继续执行程序;如果所有的表达式的值均为假,则执行语句体n+1,然后继续执行后续程序。
实际上,多分支选择if语句是双分支选择if语句的嵌套形式,即可写成:

关于这3种if语句的使用,有以下几点需要注意。
1)if之后的条件表达式,必须以“(表达式)”的形式出现,即括号不可少,而表达式可为任意表达式,可以是关系表达式或逻辑表达式,也可以为其他表达式。
2)在后两种if语句中,语句体都必须以“;”结束。
3)3种if语句中语句体可以是一条语句,也可以是一条复合语句。
5.if语句的嵌套
在if语句中又内嵌if语句称为if语句的嵌套。前面已说明,多分支选择if语句可看成if语句的嵌套形式。其一般形式为:

在使用内嵌if语句时,要注意if和else的配对,因为if语句的第一种形式中只有if没有else。C语言在编译源程序时总是将else与它前面最近的if配对。
6.条件表达式构成的选择结构
C语言还提供了一个特殊的运算符——条件运算符,由此构成的条件表达式也可以形成简单的选择结构。这种选择结构能以表达式的形式内嵌在允许出现表达式的地方,可以根据不同的条件使用不同的数据参与运算。它的运算符号“?:”是C语言提供的唯一的三目运算符,即要求有3个运算对象。它的表达式形式如下:

当“表达式1”的值为非零时,“表达式2”的值就是整个条件表达式的值;当“表达式1”的值为零时,“表达式3”的值作为整个条件表达式的值。此运算符优先于赋值运算符,但低于关系运算符与算术运算符。例如有如下表达式:

首先要求出条件表达式的值,然后赋给y。在条件表达式中,要先求出x>10的值。若x大于10,取100作为条件表达式的值并赋予变量y;若x小于或等于10,则取200作为条件表达式的值并赋予变量y。
课堂精练
1)输入三个实数,按从小到大的顺序输出。程序运行结果如图3-9所示。
根据程序运行结果,请将下面的程序补充完整并调试。

2)编程实现:根据性别(sex)和身高(tall)给某数据分类,如果sex为'F',当tall>=150时,输出A,否则输出B;若sex不为'F',当tall>=172时,输出A,否则输出B。程序运行结果如图3-10所示。

图3-9 程序运行结果(1)

图3-10 程序运行结果(2)
根据程序运行结果,请将下面的程序补充完整并调试。



实例14
实例14 switch语句——计算长方形、圆形和三角形的面积
实例任务
编写一个程序,用于计算长方形、圆形和三角形的面积,要求能根据用户的选择计算相应形状的面积。程序运行结果如图3-11所示。
程序代码


图3-11 程序运行结果

相关知识
1.switch语句以及它与break语句构成的选择结构
switch语句是一种多分支选择结构,语句形式如下:

switch语句是C语言的关键字,switch后面用花括号括起来的部分称为switch语句体。紧跟在switch后的一对圆括号中的表达式可以是整型表达式及后面将要学习的字符型表达式。表达式两边的一对括号不能省略。
case也是关键字,与其后面的常量表达式合称为case语句标号。常量表达式的类型必须与switch后面圆括号中的表达式类型相同,各case语句标号的值应该互不相同。case语句标号后的语句体1、语句体2等,可以是一条语句,也可以是若干条语句。必要时,case语句标号后的语句可以省略不写。
default也是关键字,起语句标号的作用,代表所有case语句标号之外的标号。default语句标号可以出现在语句体中的任何标号位置上。在switch语句中也可以没有default语句标号。
在关键字case和常量表达式之间一定要有空格,例如“case 10:”不能写成“case10:”。
程序中,每个case语句体中均有“break;”语句,它的作用是当执行到满足条件的case语句后立刻退出switch语句体。如果没有“break;”语句,则程序在执行了满足条件的case语句体后,默认其后的case语句体和default语句体仍满足条件,继续向后执行。例如本实例程序中,删除所有的“break;”语句后,如果输入值为2,则会提示输入圆的半径值,然后陆续提示三角形的相关信息、退出程序和选项错误等提示信息。
2.switch语句的执行过程
当执行switch语句时,首先计算紧跟其后的一对圆括号中的表达式的值,然后在switch语句体内寻找与该值吻合的case语句标号。如果有与该值相等的语句标号,则执行该语句标号后开始的所有语句,直到switch语句体结束;如果遇到“break;”语句,则退出switch语句体;如果没有与该值相等的语句标号并且存在default语句标号,则从default语句标号后的语句开始执行,直到switch语句体结束;如果没有与该值相等的语句标号并且没有default标号,则跳出switch语句体,而执行之后的语句。
课堂精练
1)根据输入的成绩段,输出成绩的等级。程序运行结果如图3-12所示。

图3-12 程序运行结果(1)
根据程序运行结果,请将下面的程序补充完整并调试。

2)由键盘输入三个整数a、b、c,输出三个数中最大的一个。程序运行结果如图3-13所示。

图3-13 程序运行结果(2)
根据程序运行结果,请将下面的程序补充完整并调试。

