1、 第4章 选择结构程序设计4.1 条件判断和选择结构4.2 选择结构中的运算符4.3 用于选择结构的if语句4.4 用于多分支选择结构的switch语句4.5 选择结构程序设计举例2022-8-82 在现实生活中有许多问题需要先进行判断和选择,再执行。判断条件是否满足,并根据这个条件做出指定的操作,或者从给定的两种或多种操作中选择执行其中一种,正是选择结构要解决的问题。本章最重要的内容如下。(1)关系运算符、逻辑运算符和条件运算符。(2)if语句。(3)switch语句。2022-8-834.1 条件判断和选择结构 在现实生活中,需要进行条件判断和选择的场景是很常见的,例如:(1)如果今天预报
2、有雨,我就带雨伞;(2)下学后我们一起去打篮球;(3)身高1.2米以下儿童,免费入园参观;2022-8-84【例4-1】输入两个整数,输出其中的大数。2022-8-85#includeint main()int a,b,max;scanf(%d,%d,&a,&b);if(a=b)max=a;else max=b;printf(max=%dn,max);return 0;程序运行结果:程序运行结果:5,3max=53,5max=54.2 选择结构中的运算符4.2.1 关系运算符与关系表达式 C语言中,“关系运算”实际上就是“比较运算”,将两个数值进行大小比较,根据两个值和所使用的关系运算符,得到
3、一个逻辑值:“真”(值为1)或“假”(值为0)。例如:20 这个关系表达式,它是成立的,逻辑值为“真”,即为1;6=9 这个关系表达式,它是不成立的,逻辑值为“假”,即为0。2022-8-861.关系运算符及其优先级2022-8-87 关系运算符的优先次序为:(1)关系运算符的优先级低于算术运算符,高于赋值运算符。(2)在6个关系运算符中,、=的优先级相同,=和!=的优先级相同;并且前4种高于后2种。例如:x+yz等同于 (x+y)zx=y=z等同于 x=(yz等同于 x=(yz)2022-8-882.关系表达式 用关系运算符将两个数值或表达式(包括算术表达式、关系表达式、逻辑表达式、赋值表达
4、式等)连接起来的式子,称为关系表达式。例如,下面都是合法的关系表达式:x=zxy!=z x(y=5)x(y=z)(x!=y)z2022-8-89 C语言中,关系表达式的值是一个逻辑值,即“真”或“假”,当表示关系运算结果时,以数值1代表“真”,以数值0代表“假”。设a=1,b=2,c=3,d=4,e=5,关系表达式c a+b=1.2米;身高y&y=z等价于(!x)y)&(y=z)x+y|x-zy等价于(x+y)|(x-z)6&5b)?a:b首先计算关系表达式“ab”的值;若“ab”的值为1,则条件表达式的值为“a”;若“ab”的值为0,则条件表达式的值为“b”。【例4-2】输入两个整数,输出其
5、中的大数(使用条件运算符)。2022-8-820#includeint main()int a,b,max;scanf(%d,%d,&a,&b);max=ab?a:b;printf(max=%dn,max);return 0;程序运行结果:程序运行结果:5,3max=53,5max=54.3 用于选择结构的if语句4.3.1 if语句的一般形式 if(表达式)语句1 else 语句22022-8-821【例4-3】输入一个整数,输出其绝对值。2022-8-822#includeint main()int x,y;scanf(%d,&x);if(x=0)y=x;else y=-x;printf(
6、x的绝对值为:%dn,y);return 0;程序运行结果:程序运行结果:5x的绝对值为:5-12x的绝对值为:12【例4-4】输入一个年份,判断是否为闰年。2022-8-823【例4-4】输入一个年份,判断是否为闰年。2022-8-824#includeint main()int year;scanf(%d,&year);if(year%4=0&year%100!=0|year%400=0)printf(%d是闰年n,year);elseprintf(%d不是闰年n,year);return 0;程序运行结果:程序运行结果:20122012是闰年20002000是闰年20182018不是闰年
7、4.3.2 单分支if语句 if(表达式)语句2022-8-825【例4-5】输入一个整数,根据分段函数 输出相应的函数值。2022-8-8262022-8-827#includeint main()int x,y;scanf(%d,&x);if(x0&x5)y=x*x+3;printf(y=%dn,y);return 0;程序运行结果:程序运行结果:-1y=-10y=02y=36y=39【例4-6】输入3个实数,按从大到小的顺序输出。2022-8-828#includeint main()float a,b,c,t;scanf(%f,%f,%f,&a,&b,&c);if(ab)t=a;a=b
8、;b=t;if(ac)t=a;a=c;c=t;if(bc)t=b;b=c;c=t;printf(%5.2f,%5.2f,%5.2fn,a,b,c);return 0;程序运行结果:程序运行结果:1.5,2.3,3.7 3.70,2.30,1.504.3.3 嵌套的if语句其一般形式为:if(表达式1)if(表达式2)语句1 else 语句2 else if(表达式3)语句3 else 语句42022-8-829内嵌的if语句内嵌的if语句另一种形式为:if(表达式1)语句1 else if(表达式2)语句2 else if(表达式n)语句n else 语句n+12022-8-830else总是
9、与它上面最近的未配对的if相配对【例4-7】使用嵌套的if语句实现例4-5中的分段函数。2022-8-831算法1:2022-8-832#includeint main()int x,y;scanf(%d,&x);if(x=0)if(x0)y=3*x+2;else y=0;else if(x=5)y=2*x-1;else y=x*x+3;printf(y=%dn,y);return 0;程序运行结果:程序运行结果:-1y=-10y=02y=36y=39程序1:2022-8-833算法2:2022-8-834#includeint main()int x,y;scanf(%d,&x);if(x0
10、)y=3*x+2;else if(x=0)y=0;else if(x=5)y=2*x-1;else y=x*x+3;printf(y=%dn,y);return 0;程序运行结果:程序运行结果:-1y=-10y=02y=36y=39程序2:4.4 用于多分支选择结构的switch语句switch(表达式)case常量表达式1:语句1 case常量表达式2:语句2 case常量表达式n:语句n default:语句n+1 2022-8-835【例4-8】输入06中的一个数字,输出对应的“星期几”。2022-8-8362022-8-837#includeint main()int day;prin
11、tf(请输入星期的数字编号(06):);scanf(%d,&day);switch(day)case 0:printf(星期日n);case 1:printf(星期一n);case 2:printf(星期二n);case 3:printf(星期三n);case 4:printf(星期四n);case 5:printf(星期五n);case 6:printf(星期六n);default:printf(Error!应该输入06之 间的数字!n);return 0;程序运行结果:程序运行结果:请输入星期的数字编号(06):4星期四星期五星期六Error!应该输入06之间的数字!4.4.2 break
12、语句2022-8-838switch(表达式)case常量表达式1:语句1 break;case常量表达式2:语句2 break;case常量表达式n:语句n break;default:语句n+1 【例4-8】输入06中的一个数字,输出对应的“星期几”。2022-8-8392022-8-840#includeint main()int day;printf(请输入星期的数字编号(06):);scanf(%d,&day);switch(day)case 0:printf(星期日n);break;case 1:printf(星期一n);break;case 2:printf(星期二n);brea
13、k;case 3:printf(星期三n);break;case 4:printf(星期四n);break;case 5:printf(星期五n);break;case 6:printf(星期六n);default:printf(Error!应该输入06之 间的数字!n);return 0;程序运行结果:程序运行结果:请输入星期的数字编号(06):4星期四请输入星期的数字编号(06):9Error!应该输入06之间的数字!4.5 选择结构程序设计举例【例4-9】输入3个数,判断这3个数是否可以构成一个三角形,若可以,则输出三角形的面积,若不可以,则输出“Error!输入的3个数不能构成三角形。
14、”l构成三角形的条件:三边长都为正数;任意两边之和大于第三边。l海伦公式求面积:l预处理命令“#include”2022-8-841 =-areass as bs c2022-8-8422022-8-843#include#includeint main()double a,b,c,s,area;scanf(%lf,%lf,%lf,&a,&b,&c);if(a0&b0&c0&a+bc&b+ca&a+cb)s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c);printf(area=%5.2fn,area);else printf(Error!输入的3个数不能构成三
15、角形。n);return 0;程序运行结果:程序运行结果:3.0,4.0,5.0area=6.002.0,4.0,1.0Error!输入的3个数不能构成三角形。【例4-10】求一元二次方程 的解。2022-8-8442022-8-8452022-8-846#include#includeint main()double a,b,c,s,x1,x2,p,q;printf(请输入a,b,c的值:);scanf(%lf,%lf,%lf,&a,&b,&c);s=b*b-4*a*c;if(fabs(a)=1e-6)printf(此方程不是二次方程n);else if(fabs(s)1e-6)x1=-b+
16、sqrt(s)/(2*a);x2=-b-sqrt(s)/(2*a);printf(方程有两个不相等的实根:x1=%.2f,x2=%.2fn,x1,x2);else p=-b/(2*a);q=sqrt(-s)/(2*a);printf(方程有两个共轭复根:x1=%.2f+%.2fi,x2=%.2f-%.2fi n,p,q,p,q);return 0;2022-8-848程序运行结果:程序运行结果:请输入a,b,c的值:0.0,2.0,3.0此方程不是二次方程请输入a,b,c的值:1.0,2.0,1.0方程有两个相等的实根:x1=x2=-1.00请输入a,b,c的值:2.0,3.0,1.0方程有两
17、个不相等的实根:x1=-2.75,x2=-3.25请输入a,b,c的值:2.0,2.0,1.0方程有两个共轭复根:x1=-0.50+0.50i,x2=-0.50-0.50i【例4-11】将某课程考试的百分制成绩转化为等级制成绩。转换规则为:60分以下为“不合格”,6069分为“合格”,7079分为“中等”,8089分为“良好”,90分以上为“优秀”。本例是一个多分支选择问题,下面分别用两种算法解决。算法1:使用嵌套的if语句结构。算法2:使用switch语句结构。2022-8-8492022-8-850算法1:2022-8-851#includeint main()int score;scan
18、f(%d,&score);if(score100)printf(成绩输入有误!n);else if(score60)printf(不合格n);else if(score70)printf(合格n);else if(score80)printf(中等n);else if(score90)printf(良好n);else printf(优秀n);return 0;程序1:程序运行结果:程序运行结果:2022-8-852算法2:2022-8-853#includeint main()int score,grade;scanf(%d,&score);if(score=0&score=100)grade
19、=score/10;switch(grade)case 6:printf(合格n);break;case 7:printf(中等n);break;case 8:printf(良好n);break;case 9:case 10:printf(优秀n);break;default:printf(不合格n);else printf(成绩输入有误!n);return 0;程序2:程序运行结果:程序运行结果:2022-8-854 选择结构要解决的主要问题是根据条件是否成立来选择执行指定选择结构要解决的主要问题是根据条件是否成立来选择执行指定的操作,或者从给定的多种操作中选择其一执行。的操作,或者从给定的
20、多种操作中选择其一执行。关系运算符和逻辑运算符及由它们所形成的表达式是构成判断条关系运算符和逻辑运算符及由它们所形成的表达式是构成判断条件的主要形式,使用时需要注意各运算符的优先级和结合方向。件的主要形式,使用时需要注意各运算符的优先级和结合方向。本章小结注意本章节知识点!2022-8-855 if语句是构成选择结构的重要语句,包括语句是构成选择结构的重要语句,包括3种主要的形式:单分支种主要的形式:单分支if语句、双分支语句、双分支if语句和嵌套的语句和嵌套的if语句。语句。实现多分支选择结构时,可以采用嵌套的实现多分支选择结构时,可以采用嵌套的if语句,语句,也也可以选用可以选用switch语句语句。本章小结注意本章节知识点!