1、c语言 第4章 选择结构程序设计第4章 选择结构程序设计4.1关系运算符和关系表达式在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。4.1.1 关系运算符在语言中有以下关系运算符:1) 小于2) 大于4)= 大于或等于5)= 等于6)!= 不等于4.1.2 关系表达式关系表达式的一般形式为: 表达式 关系运算符 表达式例如:a+bc-dx3/2a+1(bc)a!=(c=d)关系表达式的值是真”和“假”,用“1”和“0”表示。如:50的值为“真”,即为1。(a=3)(b=5)由于35不成立,故其值为假,即为0。关系运算符都是双目运算符,其结合性均为
2、左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。,=的优先级相同,高于=和!=;=和!=的优先级相同。ca+bc(a+b)ab=c(ab)=ca=bca=(bca=(bc)例:#includevoid main() char c=k; int i=1,j=2,k=3; double x=3e+5,y=0.85; printf(%d %dn,(a+5=k+1); printf(%d %dn,(1j5),(x-5.25b & cd 等价于 (ab)&(cd)!b=c|da 等价于 (!b)=c)|(dc&x+yc)&(x+y)0 & 42由于50为真,42也为真,相与的结果也为真。或运算
3、|:参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:50|58由于50为真,相或的结果也就为真。非运算!:参与运算量为真时,结果为假;参与运算量为假时,结果为真。例如:!(50)的结果为假。注意:各种类型的数据量都可以参加逻辑运算,在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:由于5和3均为非“0”因此5&3的值为“真”,即为1。又如:5|0的值为“真”,即为1。例:#includevoid main() int i=0,j=5,z; z=!i*j; /!的优先级高于算术运算 printf(%dn,z);4.2.2 逻
4、辑表达式逻辑表达式的一般形式为:表达式 逻辑运算符 表达式表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:(a&b)&c根据逻辑运算符的左结合性,上式也可写为: a&b&c逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。例:#includevoid main() char c=k; int i=1,j=2,k=3; double x=3e+5,y=0.85; printf(%d,%dn,(!x*!y),(!x); printf(%d,%dn,(x|i&j-3),(ij&xy); printf(%d,%dn,(i=5&c&(j=8),(x+y|i+j+k)
5、;程序运行后输出:0,01,00,1注意:若f()是一个任意的表达式,返回一个确定的值,由于有: 0&f()=0 1|f()=1所以C+遇到这类情况不会对f()中的操作进行处理,而直接给出该逻辑运算的最终结果0或1。例: #includevoid main() int a=-1,b=4,k; k=(+a0)&(!(b-=0); printf(%d %d %dn,k,a,b);程序运行后输出:0 0 4因为当计算到(+a0)为假后,可以确定整个表达式的值为0,所以没有对&之后的表达式进行处理。4.3 if语句if语句的三种形式1.if(条件表达式)语句单分支结构 if(条件表达式) 语句其语义是
6、:如果条件表达式的值为真,则执行其后的语句,否则不执行该语句。其过程可表示为下图。例:输入两个数,输出较大者。#includevoid main() int a,b,max; printf(input two numbers:); scanf(%d %d,&a,&b); max=a; if(ab)max=b; printf(Max=%dn,max);2.if(条件表达式)语句1 else 语句2双分支结构if(条件表达式)语句1;else 语句2;其语义是:如果条件表达式的值为真,则执行语句1,否则执行语句2。其执行过程可表示为右图。例4.2: 输入两个整数,输出其中的大数。#includev
7、oid main() int a,b; printf(input two numbers:); scanf(%d %d,&a,&b); if(ab) printf(Max=%dn,a); else printf(Max=%dn,b);改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。例: 输入三个数,找出最小数。可以只使用简单的if语句实现。#includevoid main() int a,b,c,min; printf(input a,b,cn); scanf(%d%d%d,&a,&b,&c); if(ab|ac)min=a; if(ba|bc)min=b; if(ca
8、|cb)min=c; printf(The Minmun is %dn,min);3.if.elseif语句多分支结构前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,其一般形式为:if(条件表达式1) 语句1; else if(条件表达式2) 语句2; else if(条件表达式3) 语句3; else if(条件表达式m) 语句m; else 语句n;其语义是:依次判断条件表达式的值当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。 if-else-if
9、语句的执行过程如下图所示。例: 判别键盘输入字符的是控制符、数字字符、大写字母或小写字母类别。#includevoid main() char c; printf(input a character: ); c=getchar(); if(c=0&c=A&c=a&cb) a+; b+; else a=0; b=10; 例:求三角形的面积。#include#include /为了引用函数要sqrt()main() float a,b,c; printf(please enter a,b,c:); scanf(%f %f %f,&a,&b,&c); if(a+bc & b+ca & c+ab) d
10、ouble s,area; s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c); printf(area=%4.4fn,area); else printf(it is not a trilateral!n); return 0;运行程序:please enter a,b,c:4 5 6area=9.92165if语句的嵌套当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。其一般形式可表示如下: if(条件表达式) if(条件表达式)语句1; else 语句2; elseif(条件表达式)语句3; else 语句4;注意:在嵌套内的if语句可
11、能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。例如: if(表达式1) if(表达式2) 语句1; else语句2;其中的else究竟是与哪一个if配对呢?应该理解为: if(表达式1) if(表达式2) 语句1; else 语句2;还是应理解为: if(表达式1) if(表达式2) 语句1; else 语句2;为了避免这种二义性,C/+语言规定,else 总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。在实现编程中,可以借且缩格形式或来确定else与if的配对关系,以提高程序的可读性。 例:用if语句嵌套实现比较两
12、个数的大小关系。#includemain() int a,b; printf(please input A,B:); scanf(%d %d,&a,&b); if(a!=b) if(ab) printf(ABn); else printf(ABn); else printf(A=Bn); return 0;说明:这种问题用if-else-if语句也可以完成。而且程序更加清晰。因此,在一般情况下较少使用if语句的嵌套结构。以使程序更便于阅读理解。例:用if-else-if结构实现比较两个数的大小关系。#includemain() int a,b; printf(please input A,B:
13、); scanf(%d %d,&a,&b); if(a=b)printf(A=Bn); else if(ab)printf(ABn); else printf(ABn); return 0;例: 写一个程序,从键盘输入年份year,判断其是否是闰年。闰年条件:能被4整除,但不能被100整除的年份是闰年,或者能被400整除的年份是闰年,即year是闰年要满足的条件是:year % 4=0 & year % 100 !=0 | year % 400=0从而可以写出如下的程序:#includemain() int year; printf(Please input the year:); scanf
14、(%d,&year); if(year % 4=0 & year % 100 !=0 | year % 400=0) printf(%d is a leap yearn,year); else printf(%d is not a leap yearn,year); return 0;注意:简单的分支结构可以用条件表达式替代。例如条件语句: if(ab) max=a; else max=b;可用条件表达式写为max=(ab)?a:b;例:将输入的大写字母转换为小写字母输出。#includemain() char ch; printf(Input a character:); scanf(%c,
15、&ch); ch=ch=A & ch=Z? ch+32:ch; printf(%cn,ch); return 0;4.4 switch语句开关语句语言还提供了另一种用于多分支选择的switch语句, 其一般形式为: switch(表达式) case常量表达式1: 语句1; case常量表达式2: 语句2; case常量表达式n: 语句n; default : 语句n+1; 语义:计算表达式的值。 并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执
16、行default后的语句。例:#includemain() int a; printf(input integer number:); scanf(%d,&a); switch(a) case 1:printf(Mondayn); case 2:printf(Tuesdayn); case 3:printf(Wednesdayn); case 4:printf(Thursdayn); case 5:printf(Fridayn); case 6:printf(Saturdayn); case 7:printf(Sundayn); default:printf(errorn); return 0
17、;程序运行情况:input integer number:3WednesdayThursdayFridaySaturdaySundayerror说明:本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday 及以后的所有单词。在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续执行所有后面case语句的情况。 这是与前面介绍的if语句完全不同的,应特别注意。语言还提供了一种break语句,专用于跳
18、出switch语句,break 语句只有关键字break,没有参数。例:#includemain() int a; printf(input integer number:); scanf(%d,&a); switch(a) case 1:printf(Mondayn);break; case 2:printf(Tuesdayn);break; case 3:printf(Wednesdayn);break; case 4:printf(Thursdayn);break; case 5:printf(Fridayn);break; case 6:printf(Saturdayn);break;
19、 case 7:printf(Sundayn);break; default:printf(errorn);break; return 0;程序运行情况:input integer number:3Wednesday在使用switch语句时还应注意以下几点:1)在case后的各常量表达式的值不能相同,否则会出现错误。表达式和各case后面的常量表达式的类型为字符型、整型或枚举型表示地址标号。 2)在case后,允许有多个语句,可以不用括起来。3)若在每个case子句后都设置有break语句,则各case和default子句的先后顺序可以变动,而不会影响程序执行结果。4)default子句可以省
20、略不用。5)switch语句允许嵌套使用。4.5 选择结构程序设计举例例1:任意顺序输入三个整数,按从大到小的顺序输出这三个数。#includemain() int a,b,c,temp; printf(input three numbers:); scanf(%d %d %d,&a,&b,&c); if(ab)temp=a;a=b;b=temp; if(ac)temp=a;a=c;c=temp; if(bc)temp=b;b=c;c=temp; printf(%d %d %dn,a,b,c); return 0;例4.6 根据学生成绩判断等级。#includevoid main() int
21、score; printf(Input score:); scanf(%d,&score); switch(score/10) case 10: case 9: printf(%d:An,score); break; case 8: case 7: printf(%d:Bn,score); break; case 6: printf(%d:Cn,score); break; default: printf(%d:Dn,score); 例4.7:求ax2+bx+c=0方程的根,a,b,c由键盘输入,设b2-4ac0。求根公式为: 令,则x1=p+q,x2=p-q源程序如下:#include#in
22、cludevoid main() float a,b,c; /输入带小数点的数,宜定义为float double disc,x1,x2,p,q; printf(Please input three numbers:); scanf(%f %f %f,&a,&b,&c); disc=b*b-4*a*c; p=-b/(2*a); if(fabs(a)=0) printf(The equation is not a quadratic.n); else if(disc=0) printf(The equation has two equal roots:); printf(%8.4fn,p); else if(disc0) printf(The equation has distinct real roots:n); q=sqrt(disc)/(2*a); x1=p+q;x2=p-q; printf(%8.4f,%8.4fn,x1,x2); else if(disc0) printf(The equation has distinc image roots:n); q=sqrt(-disc)/(2*a);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1