2020/5/31第四章选择结构程序设计2020/5/32教学目的:掌握选择结构的形式,掌握典型算法。教学要求:掌握关系表达式和逻辑表达式以及在选择结构中的使用。学会把现实问题通过表达式的形式表示。2020/5/33•关系表达式•逻辑表达式•条件表达式•if语句•switch语句2020/5/34关系运算符和表达式关系运算符–种类:====!=–结合方向:自左向右–优先级别:====!=优先级6(高)优先级7(低)例ca+b即c(a+b)ab!=c即(ab)!=ca==bc即a==(bc)a=bc即a=(bc)abc即(ab)c关系表达式:以关系符连起来的式子–关系表达式的值:是逻辑值“真”或“假”,用1和0表示;–1表示逻辑真,0表示逻辑假(非零为真)例inta=3,b=2,c=1,d,e=0,f;ab(ab)==cb+cad=abf=abce==0//表达式值1//表达式值1//表达式值0//d=1//f=0//表达式值12020/5/35因为a=x值为1,所以x=b的值为0–关系运算表达式使用中要注意各步骤的逻辑值:例若a=0;b=0.5;x=0.3;则a=x=b的值为0例5278在C中是允许的,值为0例‘a’0结果为‘A’100结果为10因为上式运算步骤是((52)7)8所以5278的值为0例inti=1,j=7,a;a=i+(j%4!=0);则a=22020/5/36–关系运算注意:例注意区分“=”与“==”inta=0,b=1;if(a==b)printf(“aequaltob”);elseprintf(“anotequaltob”);例应避免对实数作相等或不等的判断如1.0/3.0*3.0==1.0结果为可改写为:fabs(1.0/3.0*3.0-1.0)1e-602020/5/37ab!a!ba&&ba||b真假真假假假真真–逻辑运算符和表达式逻辑运算符–种类:!&&||(非与或)–逻辑运算真值表–C语言中,逻辑量的值:0表示“假”,非0表示“真”,-C语言中,逻辑表达式的结果:0表示“假”,1表示“真”,真假假假假假真真假假真真真假真真ab!a!ba&&ba||b非00非0000非0非010000011001110112020/5/38!(2)&&(11)||(12)高低例a=x&&x=bab&&xya==b||x==y!a||ab优先级:结合方向:!:从右向左&&:从左向右||:从左向右//(a=x)&&(x=b)//(ab)&&(xy)//(a==b)||(x==y)//(!a)||(ab)逻辑表达式2020/5/39例a=4;b=5;!a!!aa&&ba||b!a||b4&&0||253&&2||84-!0‘c’&&‘d’值为1值为0a=4非0为真,非a即为假(0)值为1值为1值为1值为1//(53)&&2||(8(4-(!0)))值为1混合运算顺序!(非)(高)算术运算符关系运算符&&||赋值运算符(低)值为1非a为假(0),非非a为真(1)2020/5/310–短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行。在逻辑表达式运算时,如果已经能够计算出表达式的值,后面的运算就不进行了。例如:在逻辑表达式1&&5||0&&6中,0&&6没有运行,因为对于||运算,只要有一个操作数是1,结果就是1。2020/5/311我们用以下程序证明短路特性:main(){inta,b,c;a=(b=1&&5)||(c=0&&6);printf(a=%d,b=%d,c=%d\n,a,b,c);}(exmp4dl.c)结果:a=1,b=1,c=261由于1&&5的值是1(真),而或运算||只要有一个分量为真则结果为真,所以表达式(b=1&&5)||(c=0&&6)的值已经得到了,就是1。因此(c=0&&6)就不再运算了。例a&&b&&c//只在a为真时,才判别b的值;只在a、b都为真时,才判别c的值例a||b||c//只在a为假时,才判别b的值;只在a、b都为假时,才判别c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=ab)&&(n=cd)//结果m=0,表达式=0,n=1不变2020/5/312例(a==b)?’Y’:’N’a等于b为Y,否则为N(x%2==1)?1:010进制整数转为2进制的一位(x=0)?x:-xx的绝对值(c=‘a’&&c=‘z’)?c-32:c字符c若为小写,转为大写条件表达式可嵌套如x0?1:(x0?-1:0)优先级:最低(13)–条件运算符?:与条件运算表达式一般形式:expr1?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句例求a+|b|printf(“a+|b|=%d\n”,b0?a+b:a-b);expr1取expr2值取expr3值非0=0结合方向:自右向左如ab?a:cd?c:dab?a:(cd?c:d)expr2、expr3类型可不同,表达式值取较高的类型例x?‘a’:‘b’x=0,表达式值为‘b’;x‡0,表达式值为‘a’xy?1:1.5xy,值为1.0;xy,值为1.52020/5/313选择型程序设计–if语句(条件选择语句)if语句的三种形式–形式一:•格式:if(expression)statement•执行过程:exprstatement非0=0例:if(xy)printf(“%d”,x);exprstatement1statement2非0=0-形式二:格式:if(expression)statement1elsestatement2执行过程:例:if(xy)max=x;elsemax=y;2020/5/314–形式三:•格式:•执行过程:if(expr1)statement1elseif(expr2)statement2elseif(expr3)statement3…...[elsestatementn]expr1statement1非0=0expr2expr3statementnstatement3statement2非0非0=0=0。。。例:if(salary1000)index=0.4;elseif(salary800)index=0.3;elseif(salary600)index=0.2;elseif(salary400)index=0.1;elseindex=0;2020/5/315例下面程序正确吗?main(){intx,y;scanf(“%d%d”,&x,&y);if(xy)x++;y--;elsex--;y++;printf(“%d,%d\n”,x,y);}如:if(a==b&&x==y)printf(“a=b,x=y”);if(3)printf(“OK”);if(‘a’)printf(“%d”,’a’);说明:if后面的表达式类型任意。if后面的表达式的值按逻辑值处理。statement可以是一条语句或复合语句。if(x)if(x!=0)if(!x)if(x==0)CompileError!2020/5/316main(){intx,y;printf(Enteraninteger:);scanf(%d,&x);y=x;if(y0)y=-y;printf(\ninteger:%d---absolutevalue:%d\n,x,y);}例求一个数的绝对值运行:Enteraninteger:-12integer:-12---absolutevalue:122020/5/317main(){inta,b;printf(Enterintegera:);scanf(%d,&a);printf(Enterintegerb:);scanf(%d,&b);if(a==b)printf(a==b\n);elseprintf(a!=b\n);}例输入两个数并判断两数相等否运行:Enterintegera:12Enterintegerb:12a==b运行:Enterintegera:12Enterintegerb:9a!=b2020/5/318例如:已知三角形的三条边求面积计算并显示结果显示出错提示结束两边之和大于第3边?开始输入数据YesNo2020/5/319程序#includestdio.h#includemath.hmain(){inta,b,c;floats,area;scanf(“%d%d%d”,&a,&b,&c);if(a+bc&&a+cb&&b+ca){s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf(area=%6.2f\n,area);}elseprintf(“输入数据错”);}(owe0.c)运行时输入:345输出:area=6.00运行时输入:113输出:输入数据错2020/5/320if语句嵌套:一般形式:if(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4内嵌if内嵌ifif(expr1)if(expr2)statement1elsestatement2内嵌ifif(expr1){if(expr2)statement1}elsestatement3内嵌ifif(expr1)statement1elseif(expr3)statement3elsestatement4内嵌if2020/5/321例输入两数并判断其大小关系main(){intx,y;printf(Enterintegerx,y:);scanf(%d,%d,&x,&y);if(x!=y)if(xy)printf(XY\n);elseprintf(XY\n);elseprintf(X==Y\n);}运行:Enterintegerx,y:12,23XYEnterintegerx,y:12,6XYEnterintegerx,y:12,12X==Y2020/5/322–if~else配对原则:缺省{}时,else总是和它上面离它最近的未配对的if配对if(……)if(……)if(……)else…...else…...else…...2020/5/323if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);实现if~else正确配对方法:加{}题目:从a是否等于b开始,判断a、b、c三值是否相等2020/5/324switch语句(开关分支语句)使用if语句嵌套层次太多,容易发生错误,因此在多分支结构中,通常使用switch语句。一般形式:执行过程:switch(表达式){caseE1:语句组1;break;caseE2:语句组2;break;…….caseEn:语句组n;break;[default:语句组;break;]}switch表达式语句组1语句组2语句组n语句组…...E1E2Endefaultcase2020/5/325说明:Switch(表达式)中的值自动取整,表达式的结果必须是整数、字符或枚举量。E1,E2,…En是常量表达式,且值必须互不相同case后可包含一条或多条可执行语句,且不必加{}caseEn:起语句标号的作用,如果不用break跳出,程序就顺序执行下去。caseEn:后的语句可缺省,多个case共用一组执行语句switch可嵌套如:……case‘A’:case‘B’:case‘C’:printf(“score60\n”);break;……..2020/5/326break语句(中断语句)语句形式