1、1第四章第四章 选择结构程序设计选择结构程序设计 教学目标教学目标掌握逻辑值的概念及逻辑值在掌握逻辑值的概念及逻辑值在C C语言中的表示方法;语言中的表示方法;掌握关系运算符和逻辑运算符的运算规则;掌握关系运算符和逻辑运算符的运算规则;掌握赋值运算、算术运算、关系运算及逻辑运算等掌握赋值运算、算术运算、关系运算及逻辑运算等几种常用的运算符之间的优先级次序。几种常用的运算符之间的优先级次序。掌握掌握ifif语句及其嵌套的使用方法;语句及其嵌套的使用方法;了解条件运算符的运算规则及其使用方法。了解条件运算符的运算规则及其使用方法。了解用了解用switchswitch语句和语句和breakbreak
2、语句构成的多分支结构。语句构成的多分支结构。基本要求基本要求能够编写简单的选择结构程序,并且能够排除选择结能够编写简单的选择结构程序,并且能够排除选择结构程序中的语法错误及较简单的逻辑错误。构程序中的语法错误及较简单的逻辑错误。15:13:28长江大学计算机科学学院2 4.1 4.1 关系运算和逻辑运算关系运算和逻辑运算 关系运算关系运算一般是指简单的条件比较。一般是指简单的条件比较。如:如:x x大于大于0 0 表示为:表示为:x0 x0 逻辑运算逻辑运算一般是指复杂的条件比较(多个简单一般是指复杂的条件比较(多个简单条件比较的组合)。条件比较的组合)。如:如:x x大于大于0 0并且并且y
3、 y小于等于小于等于0 0 表示为:表示为:x0&y0&y0)的值为的值为 (算术运算)(算术运算)5&x0的值为(逻辑运算)的值为(逻辑运算)15:13:29长江大学计算机科学学院44.1.2 关系运算符与关系表达式关系运算符与关系表达式1关系运算符及其优先级关系运算符及其优先级 由两个字符组合而成的运由两个字符组合而成的运算符之间不能有空格,如:算符之间不能有空格,如:=、=、!=。优先级次序:优先级次序:算术运算符算术运算符13/12关系运算符关系运算符10(、=)关系运算符关系运算符9(=、!=)赋值运算符赋值运算符 2 表4.1关系运算符及其优先级109 15:13:29长江大学计算
4、机科学学院52关系表达式关系表达式 用关系运算符将两个操作数用关系运算符将两个操作数(常量、变量或表达式常量、变量或表达式)连接连接起来,进行关系运算的式子,称为起来,进行关系运算的式子,称为关系表达式关系表达式。例如,假设例如,假设n1=5,n2=8,n3=10,则:则:(1)关系表达式)关系表达式n1=n2的值为的值为0。(2)关系表达式)关系表达式n1n3的值为的值为1。(4)关系表达式)关系表达式n1=n2n3的值等为的值等为0。注意注意:由于存在:由于存在存储误差存储误差和和转换误差转换误差,避免避免直接用关系直接用关系运算符运算符“=”来来判断判断两个实型数是否相等两个实型数是否相
5、等。单精度实数:单精度实数:fabs(x-y)0.000001 双精度实数:双精度实数:fabs(a-b)b)&(xy)当当a大于大于b且且x大于大于y时时,结果结果为为“真真”,用,用数值数值1来表示;否来表示;否则则,结果为结果为“假假”,用,用数值数值0来表示。来表示。表表4.3 4.3 逻辑运算符的运算规则逻辑运算符的运算规则 15:13:29长江大学计算机科学学院8 如如:求一元二次方程根时求一元二次方程根时,用到下列条件用到下列条件 (a!=0)&(b*b-4*a*c0)数学表达式数学表达式 0 x10表示表示x的值应该在的值应该在0到到10的范围内。的范围内。但在但在C语言中语言
6、中不不能用能用关系表达式关系表达式0 x10来简单表述以上的来简单表述以上的数学关系。因为数学关系。因为无论无论x是什么值,按照是什么值,按照C语言的运算规则,语言的运算规则,左边的表达式左边的表达式0 x的运算结果只能为的运算结果只能为0或或1,因而表达式,因而表达式0 x10的运算结果的运算结果总是总是1。只有用只有用逻辑表达式逻辑表达式0 x&xl0才能正确地表述以上数学才能正确地表述以上数学关系。关系。用逻辑表达式来表示多个条件的组合用逻辑表达式来表示多个条件的组合 15:13:29长江大学计算机科学学院9 “非完全求解非完全求解”法:当求出某个逻辑运算符的左边的法:当求出某个逻辑运算
7、符的左边的运算量的值就能够明确地确定这个逻辑运算的结果时,就运算量的值就能够明确地确定这个逻辑运算的结果时,就结束求解过程,直接给出运算结果。例如:结束求解过程,直接给出运算结果。例如:(1)a&b&c 若若a为为“假假”,直接求得直接求得a&b及整个表达式的值为及整个表达式的值为“假假”;若若a为为“真真”,b为为“假假”,a&b及整个表达式的值为及整个表达式的值为“假假”。只有当只有当a为为“真真”时,才需要判别时,才需要判别b的值;只有当的值;只有当a&b的值为的值为“真真”时,才需要判别时,才需要判别c的值。的值。(2)a|b|c 若若a为为“真真”,直接求得直接求得 a|b及整个表达
8、式的值为及整个表达式的值为“真真”;若若a为为“假假”,b为为“真真”,a|b及整个表达式的值为及整个表达式的值为“真真”;只有当只有当a为为“假假”时,才需要判别时,才需要判别b的值;只有当的值;只有当a|b的的值为值为“假假”时,才需要判别时,才需要判别c的值。的值。逻辑表达式的逻辑表达式的“非完全求解非完全求解”法法 15:13:29长江大学计算机科学学院10例:例:“非完全求解非完全求解”#include#include stdio.hstdio.h void main()void main()intint x,a,b,c;x,a,b,c;a=1;b=2;c=3;a=1;b=2;c=3
9、;x=x=(a-1)(a-1)&(+b)(+b)&(+c);(+c);printf(1:a=%d,b=%d,c=%d,x=%dn,a,b,c,x);printf(1:a=%d,b=%d,c=%d,x=%dn,a,b,c,x);a=1;b=2;c=3;a=1;b=2;c=3;x=x=a a&(b-2)(b-2)&(+c);(+c);printf(2:a=%d,b=%d,c=%d,x=%dn,a,b,c,x);printf(2:a=%d,b=%d,c=%d,x=%dn,a,b,c,x);a=1;b=2;c=3;a=1;b=2;c=3;x=x=a a&(+b)(+b)&(+c)(+c);printf
10、(3:a=%d,b=%d,c=%d,x=%dn,a,b,c,x);printf(3:a=%d,b=%d,c=%d,x=%dn,a,b,c,x);15:13:29长江大学计算机科学学院114.2 if语句语句1.if语句的一般形式语句的一般形式2.(1)单分支)单分支if语句语句 if(表达式表达式)语句语句 if语句可以根据语句可以根据给定的条件给定的条件进行判断,决定执行进行判断,决定执行某个分支程序段,以实现选择结构的程序设计。某个分支程序段,以实现选择结构的程序设计。表达式常为关系表达式或表达式常为关系表达式或逻辑表达式,也可以是任逻辑表达式,也可以是任何类型的何类型的C表达式表达式语句
11、也称为内嵌语句语句也称为内嵌语句,可可以是一条语句,也可以以是一条语句,也可以是复合语句是复合语句 15:13:29长江大学计算机科学学院12#include#include#include#include void main()void main()double x;double x;scanf(scanf(“%lf%lf”,&x,&x););if(xif(x=0)=0)printf(printf(“%10.6lfn%10.6lfn”,sqrt(x);,sqrt(x);/*sqrtsqrt为开平方的库函数为开平方的库函数 */例例4.1 4.1 输入一个数,如果该数大于等于输入一个数,如果该
12、数大于等于0 0,则输出,则输出它的平方根,当它小于它的平方根,当它小于0 0,则不做任何处理。,则不做任何处理。15:13:29长江大学计算机科学学院134.2 if语句语句(2)双分支)双分支 if语句语句 if(表达式表达式)语句语句1 else 语句语句2else不能单独使不能单独使用用(可选)(可选)15:13:29长江大学计算机科学学院14#include#include void main()void main()intint n1,n2,n3,max;n1,n2,n3,max;printf(Pleaseprintf(Please input three numbers:);in
13、put three numbers:);scanf(%d,%d,%dscanf(%d,%d,%d,&n1,&n2,&n3);,&n1,&n2,&n3);if if(n1n2)(n1n2)max=n1;max=n1;elseelse max=n2;max=n2;if if(n3max)(n3max)max=n3;max=n3;printf(maxprintf(max=%dn,max);=%dn,max);程序运行情况如下:程序运行情况如下:Please input three numbers:11,22,18max=22例例4.1 输入三个整数,求最大值输入三个整数,求最大值/*简化形式简化形式
14、*/max=n1;max=n1;if if(n2max)(n2max)max=n2;max=n2;15:13:29长江大学计算机科学学院15例例4.2 输入三个整数输入三个整数,在变量在变量a,b,c中排序中排序#include#include void main()void main()intint a,b,c,ta,b,c,t;printfprintf(input (input a,b,ca,b,c:);:);scanfscanf(%d%d%dd%d%d,&a,&b,&c),&a,&b,&c);printfprintf(a=%(a=%d,bd,b=%=%d,cd,c=%=%dn,a,b,c
15、dn,a,b,c););if if(ab)(ab)t=t=a;aa;a=b;bb;b=t;=t;if if(ac)(ac)t=t=a;aa;a=c;cc;c=t;=t;if if(bc)(bc)t=t=b;bb;b=c;cc;c=t;=t;printfprintf(a=%(a=%d,bd,b=%=%d,cd,c=%=%dn,a,b,cdn,a,b,c););程序运行情况如下:程序运行情况如下:input a,b,c:62 34 24a=62,b=34,c=24a=24,b=34,c=62 15:13:29长江大学计算机科学学院16(3)(3)多分支多分支ifif语句语句 15:13:29长江大
16、学计算机科学学院17例例4.3 编写程序,根据输入的学生成绩,给出相应的等编写程序,根据输入的学生成绩,给出相应的等级。级。90分以上的等级为分以上的等级为A,60分以下的等级为分以下的等级为E,其余每其余每10分为一个等级。分为一个等级。#include void main()int g;printf(Enter g:);scanf(%d ,&g);printf(g=%d:,g);if(g=90)printf(An);else if(g=80)printf(Bn);else if(g=70)printf(Cn);else if(g=60)printf(Dn);else printf(En);
17、程序运行情况如下:程序运行情况如下:Enter g:78g=78:C 15:13:29长江大学计算机科学学院18 if语句中的内嵌语句可以是语句中的内嵌语句可以是任意合法的任意合法的C语句语句,当然当然也可以也可以是另外一个是另外一个if语句语句,这时称为,这时称为if语句的语句的嵌套嵌套。if()if()if()if()if()if()语句语句1 语句语句1 if()if()if()else 语句语句2 else else else else if()else else if()语句语句3 else 语句语句2 语句语句2 else 语句语句42.if语句的嵌套语句的嵌套 15:13:29长
18、江大学计算机科学学院19if语句的嵌套语句的嵌套 15:13:29长江大学计算机科学学院20if语句的嵌套语句的嵌套 用花括号把内层用花括号把内层if语句括起来后,使得此内层语句括起来后,使得此内层if语句在语法上成为一条独立的语句,从而使得语句在语法上成为一条独立的语句,从而使得else子句只能与外层的子句只能与外层的if配对。配对。if(表达式表达式1)if(表达式表达式2)语句语句1 else 语句语句2if(表达式表达式1)if(表达式表达式2)语句语句1else 语句语句2 15:13:30长江大学计算机科学学院21例例4.4 编写一程序实现符号函数的功能编写一程序实现符号函数的功能
19、。#include void main()int x,y;printf(Enter x:);scanf(%d,&x);y=-1;if(x!=0)if(x0)y=1;else y=0;printf(x=%d,y=%dn,x,y);程序运行情况如下:程序运行情况如下:Enter x:8x=8,y=1注:该题还可以用注:该题还可以用更加简明更加简明的的程序程序来来实现实现。15:13:30长江大学计算机科学学院224.3 条件运算符和条件表达式条件运算符和条件表达式 条件运算符:条件运算符:?:(C语言中唯一的三目运算符)语言中唯一的三目运算符)条件表达式的一般形式为条件表达式的一般形式为:表达式表
20、达式1?表达式表达式2:表达式表达式3 求解过程求解过程:先求先求“表达式表达式1”的值的值,当当“表达式表达式1”的值为非的值为非零时,以零时,以“表达式表达式2”的值作为整个条件表达式的的值作为整个条件表达式的值;当值;当“表达式表达式1”的值为零时,以的值为零时,以“表达式表达式3”的的值作为整个条件表达式的值。值作为整个条件表达式的值。15:13:30长江大学计算机科学学院23条件运算符和条件表达式条件运算符和条件表达式 15:13:30长江大学计算机科学学院244.4 switch语句语句 使用使用switch语句实现多分支选择结构,语句实现多分支选择结构,可以使程序的结构显得更加清
21、晰。可以使程序的结构显得更加清晰。1.switch语句语句的的一般形式一般形式与与执行过程执行过程 switch语句形式如下:语句形式如下:switch(表达式表达式)case 常量表达式常量表达式1:语句语句1 case 常量表达式常量表达式2:语句语句2 :case 常量表达式常量表达式n:语句语句n default:语句语句n+1 表达式表达式只能是只能是整型整型、字符型字符型或或枚举型枚举型case和和常量表常量表达式达式之间一定之间一定要有要有空格空格多条语句多条语句可可以以不必不必用用 括起来括起来default标号标号也可以放在也可以放在其它位置其它位置方括号中的内容可以省略方括
22、号中的内容可以省略执行过程:执行过程:先计算表达式的值,当先计算表达式的值,当其值与某个常量表达式其值与某个常量表达式的值相等时,就执行其的值相等时,就执行其后的所有语句,直到后的所有语句,直到switch语句体结束。如语句体结束。如果没有与该值相等的常果没有与该值相等的常量表达式,则从量表达式,则从default后的语句开始执行,直后的语句开始执行,直到到switch语句体结束。语句体结束。15:13:30长江大学计算机科学学院25例例4.5#include void main()int y,m,d,dd=0;printf(Enter yyyy/mm/dd:);scanf(%d/%d/%d,
23、&y,&m,&d);printf(%d/%d/%d,y,m,d);switch(m-1)case 11:dd=dd+30;/*11月的天数月的天数*/case 10:dd=dd+31;/*10月的天数月的天数*/case 2:dd=dd+28;/*2月的天数月的天数*/case 1:dd=dd+31;/*1月的天数月的天数*/case 0:dd=dd+d;/*当月已过的天数当月已过的天数*/if(m2)&(y%4=0&y%100!=0|y%400=0)dd=dd+1;/*闰年的闰年的2月有月有29天天*/printf(%dn,dd);编写程序,输入能代表一个日期的三个整编写程序,输入能代表一个
24、日期的三个整数数,计算该日是该年的第几天计算该日是该年的第几天。case 9:dd=dd+30;case 8:dd=dd+31;case 7:dd=dd+31;case 6:dd=dd+30;case 5:dd=dd+31;case 4:dd=dd+30;case 3:dd=dd+31;程序运行情况如下:程序运行情况如下:Enter yyyy/mm/dd:2003/2/152003/2/15 46Enter yyyy/mm/dd:2003/12/312003/12/31 365 15:13:30长江大学计算机科学学院26例例4.6 用用switch语句改写例语句改写例4.3#include,s
25、tdio.hvoid main()int g;printf(Enter a mark:);scanf(%d,&g);printf(g=%d:,g);switch(g/10)case 10:case 9:printf(An);case 8:printf(Bn);case 7:printf(Cn);case 6:printf(Dn);default:printf(En);程序运行情况如下:程序运行情况如下:Enter a mark:78g=78:CDE 输出的结果与题意不符。输出的结果与题意不符。因此,因此,switch语句语句常常需常常需要与要与break语句语句配合使用配合使用。15:13:3
26、0长江大学计算机科学学院274.4.2 switch语句体中的语句体中的break语句语句 break语句语句的功能是强制的功能是强制跳出跳出switch语语句体。句体。switch语句语句通常总是和通常总是和break语句语句联联合使用合使用,使得,使得switch语句真语句真正起到正起到多分支多分支结构结构的作用。的作用。#include void main()int g;printf(Enter a mark:);scanf(%d,&g);printf(g=%d:,g);switch(g/10)case 10:case 9:printf(An);break;case 8:printf(B
27、n);break;case 7:printf(Cn);break;case 6:printf(Dn);break;default :printf(En);15:13:30长江大学计算机科学学院28#include void main()int g;printf(Enter a mark:);scanf(%d,&g);printf(g=%d:,g);switch(g/10)case 10:case 9:printf(An);break;default :printf(En);break;case 8:printf(Bn);break;case 7:printf(Cn);break;case 6:
28、printf(Dn);break;switch语句的几种变化形式语句的几种变化形式#include void main()int g;printf(Enter a mark:);scanf(%d,&g);printf(g=%d:,g);switch(g/10)case 10:break;case 9:printf(An);break;case 8:printf(Bn);break;case 7:printf(Cn);break;case 6:printf(Dn);break;default :printf(En);#include void main()int g;printf(Enter a
29、 mark:);scanf(%d,&g);printf(g=%d:,g);switch(g/10)case10:case9:printf(An);break;case8:printf(Bn);break;case7:printf(Cn);break;case6:printf(Dn);break;default :printf(En);#include void main()int g;printf(Enter a mark:);scanf(%d,&g);printf(g=%d:,g);switch(g/10.0)case 10:case 9:printf(An);break;case 8:pr
30、intf(Bn);break;case 7:printf(Cn);break;case 6:printf(Dn);break;default :printf(En);15:13:30长江大学计算机科学学院294.5 选择结构程序举例选择结构程序举例 例例4.7 写一程序,从键盘上输入一个写一程序,从键盘上输入一个年号年号year(4位十进制整数),位十进制整数),判断判断该年是否该年是否闰年闰年。分析:判断某年是否为闰年的条件是分析:判断某年是否为闰年的条件是:1)年号能被)年号能被4整除但不能被整除但不能被100整除整除;2)年号能被)年号能被400整除。整除。15:13:30长江大学计算机
31、科学学院30#include void main()int year,leap;/*leap=0不是不是;leap=1是是*/printf(Please input the year:);scanf(%d,&year);if(year%4=0)if(year%100!=0)leap=1;else if(year%400=0)leap=1;else leap=0;else leap=0;if(leap=1)printf(%d is a leap year.n,year);else printf(%d is not a leap year.n,year);例例4.7 闰年闰年程序程序 15:13:
32、30长江大学计算机科学学院31#include void main()int year,leap;printf(Please input the year:);scanf(%d,&year);leap=0;if(year%4=0&year%100!=0)leap=1;if(year%400=0)leap=1;if(leap)printf(%d is a leap year.n,year);else printf(%d is not a leap year.n,year);闰年优化程序闰年优化程序1leap=leap|(year%400=0);leap=leap+(year%400=0);15:
33、13:30长江大学计算机科学学院32#include void main()int year,leap;printf(Please input the year:);scanf(%d,&year);leap=(year%4=0&year%100!=0)|(year%400=0);if(leap)printf(%d is a leap year.n,year);else printf(%d is not a leap year.n,year);闰年优化程序闰年优化程序2leap=year%4=0&year%100!=0;leap=leap|(year%400=0);15:13:31长江大学计算机
34、科学学院33分析:随着方程中的分析:随着方程中的变量变量a,b,c的变化,该方程有的变化,该方程有以下几种可能性:以下几种可能性:1.a=0:不是二次方程。不是二次方程。2.b*b-4*a*c=0,有两个相等实根。有两个相等实根。3.b*b-4*a*c 0,有两个不相等的实根。有两个不相等的实根。4.b*b-4*a*c 0,有两个共轭复根。有两个共轭复根。例例4.8 求一元二次方程的解求一元二次方程的解 15:13:31长江大学计算机科学学院34#include#include math.hvoid main()float a,b,c,disc,x1,x2,realpart,imagpart;
35、scanf(%f,%f,%f,&a,&b,&c);printf(The equation);if(fabs(a)=1E-6)/*判断一个实数a是否为零*/printf(is not quadraticn);exit(0);else disc=b*b-4*a*c;if(fabs(disc)1E-6)x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf(has two root:%8.4,%8.4fn,x1,x2);else realpart=-b/(2*a);imagpart=sqrt(-disc)/(2*a);printf(has complex roots:n);printf(%8.4f+%8.4fin,realpart,imagpart);printf(%8.4f-%8.4fin,realpart,imagpart);15:13:31长江大学计算机科学学院