您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > c4第四章 选择结构程序设计(2011)
第四章选择结构程序设计教学目的:掌握选择结构的形式,掌握典型算法。教学要求:掌握关系表达式和逻辑表达式以及在选择结构中的使用。学会把现实问题通过表达式的形式表示。•关系运算符和关系表达式RelationalOperatorsandExpressions•逻辑运算符和逻辑表达式LogicalOperatorsandExpressions•条件表达式ConditionalExpressions•if语句•switch语句关系运算符和以关系运算符组成的关系表达式关系运算符–种类:====!=–结合方向:自左向右–优先级别:====!=优先级6(高)优先级7(低)关系表达式:以关系符连起来的式子关系表达式的值:是逻辑值“真”或“假”,用1和0表示;1表示逻辑真,0表示逻辑假(非零为真)例inta=3,b=2,c=1,d,f;ab(ab)==cb+cad=abf=abc//表达式值1//表达式值1//表达式值0//d=1//f=0因为a=x值为1,所以x=b的值为0–关系运算表达式使用中要注意各步骤的逻辑值:例若a=0;x=0.3;b=0.5;则a=x=b的值为0例5278在C中是允许的,值为0例inti=1,j=7,a;a=i+(j%4!=0);则a=2例'a'0结果为'A'100结果为10因为上式运算步骤是左结合((52)7)8所以5278的值为0关系运算注意:2.注意区分=与==main(){inta=0,b=1;printf(%d\n,a==b);printf(%d\n,a=b);getch();}1.避免对实数作相等或不等的判断如1.0/0.00001*0.00001==1.0;结果为一般而言,对于实型量a,b作相等或不等的判断应当用:fabs(a-b)1e-6001关系运算注意:2.注意区分=与==main(){inta=0,b=1;printf(%d\n,a==b);printf(%d\n,a=b);getch();}1.避免对实数作相等或不等的判断如1.0/0.00001*0.00001==1.0;结果为一般而言,对于实型量a,b作相等或不等的判断应当用:fabs(a-b)1e-6001关系运算注意:2.注意区分=与==main(){inta=0,b=1;printf(%d\n,a==b);printf(%d\n,a=b);getch();}1.避免对实数作相等或不等的判断如1.0/0.00001*0.00001==1.0;结果为一般而言,对于实型量a,b作相等或不等的判断应当用:fabs(a-b)1e-6001补充知识:例如:对于floata,b;不要用if(a==b)进行比较,而要用if(fabs(a-b)=epsilon*fabs(a))进行比较,(其中要确保a不会为0)epsilon是一个控制接近度的值。用绝对阈值的方法是许多书上推荐的:if(fabs(a-b)0.000001)但这种使用固定阈值0.000001的方法难以持续有效。因为,有可能两个较小的本应不相等的数正好相差小于0.000001,而两个本应看做相等的大数却相差大于0.000001。DougGwyn推荐使用“相对差”比较浮点数:if(fabs(a-b)/max(fabs(a)-fabs(b))=TOLERANCE)计算机中的实型量又称为浮点数。浮点数的定义决定了它的绝对精度会随其量级而变化。所以,比较两个浮点数的最好方法就要利用一个与浮点数量级相关的精确阈值。(补充)从数学而言,当y是正时,x+yx等价于y0,它们的逻辑结果都是true。但从计算机而言,当x与y的绝对值相差很大时,这个值就有可能是false#includestdio.hmain(){doublex=1e20,y=10;printf(%d,x+yx);getch();}/*输出是0*/ab!a!ba&&ba||b真假真假假假真真–逻辑运算符和以逻辑运算符组成的逻辑表达式逻辑运算符–种类:&&||!(与或非)–逻辑运算真值表C语言中,逻辑量的值:0表示“假”,非0表示“真”,C语言中,逻辑表达式的结果:0表示“假”,1表示“真”,&&(与运算)就是求交集的运算||(或运算)就是求并集的运算真假假假假假真真假假真真真假真真!(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)例a=4;b=5;!aa&&ba||b!a||b4&&0||253&&2||84-!0'c'&&'d'值为1值为0a=4非0为真,非a即为假值为1值为1值为1值为1//(53)&&2||(8(4-(!0)))值为1混合运算顺序!(非)(高)算术运算符关系运算符&&||赋值运算符(低)短路特性(short-circuitevaluation):逻辑表达式求解时,并非所有的逻辑运算符都被执行。在逻辑表达式运算时,如果已经能够计算出表达式的值,后面的运算就不进行了。例如,在逻辑表达式1&&5||0&&6中,0&&6没有运行,因为对于||运算,只要有一个操作数是1,结果就是1。我们用以下程序证明短路特性:main(){inta,b,c=999;a=(b=1&&5)||(c=0&&6);printf(a=%d,b=%d,c=%d\n,a,b,c);}结果:a=1,b=1,c=999由于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,n=1,表达式=0(假)–条件运算符(TheCommaOperator)?:一般形式:expr1?expr2:expr3执行过程:如果expr1成立,则执行expr2,否则执行expr3功能:相当于条件语句,但不能取代一般if语句expr1取expr2值取expr3值非0=0expr1?expr2:expr3中expr1、expr2、expr3类型可不同,表达式值取较高的类型条件运算符可嵌套如x0?1:(x0?-1:0)优先级:最低(13)结合方向:自右向左如ab?a:cd?c:dab?a:(cd?c:d)例x?'a':'b'x‡0,表达式值为'a';x=0,表达式值为'b'xy?1.0:1.5xy,值为1.0;xy,值为1.5b0?a+b:a-ba+|b|例(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)x的符号函数(ab&&ac)?a:(bc?b:c)max(a,b,c)a(bc?b:c)?a:(bc?b:c)max(a,b,c)怎样取整:最直接方法:(int)(x+0.5)(要求x0)改进的方法:(int)(x0?x-0.5:x+0.5)要保留到3位小数:(int)(x/0.001+0.5)*0.001选择型程序设计–if语句(条件选择语句)if语句的三种形式形式一:•格式:if(expression)statement•执行过程:例:if(xy)max=x;elsemax=y;exprstatement非0=0形式二:格式:if(expression)statement1elsestatement2执行过程:例:if(xy)printf(“%d”,x);exprstatement1statement2非0=0–形式三:•格式:if(expr1)statement1elseif(expr2)statement2elseif(expr3)statement3…...[elsestatementn]expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0执行过程:if(salary10000)index=0.4;elseif(salary8000)index=0.3;elseif(salary4000)index=0.2;elseif(salary2000)index=0.1;elseindex=0;如:if(a==b&&x==y)printf(a=b,x=y);if(3)printf(OK);if(‘a’)printf(%d,'a');statement可以是一条语句或复合语句if(x)if(x!=0)例:if(3)if(3!=0)恒成立if(0)if(0!=0)恒不成立if(!x)if(x==0)例:if(!3)if(3==0)恒不成立if(!0)if(0==0)恒成立说明:if后面的表达式类型任意if后面的表达式的值按逻辑值处理(0或非0)。例下面程序正确吗?#includestdio.hmain(){intx,y;printf(x=);scanf(%d,&x);printf(y=);scanf(%d,&y);if(xy)x++;y--;elsex--;y++;printf(%d,%d\n,x,y);getch();}illegalelsewithoutmatchingifmain(){intx,y;printf(输入一个整数:);scanf(%d,&x);y=x;if(y0)y=-y;printf(整数%d的绝对值是%d。,x,y);getch();}例:求一个数的绝对值运行:输入一个整数:-12整数-12的绝对值是12。main(){inta,b;printf(a=);scanf(%d,&a);printf(b=);scanf(%d,&b);if(a==b)printf(a==b);elseprintf(a≠b);getch();}例输入两个数并判断两数相等否运行:a=12b=12a==b运行:a=12b=9a≠b例如:已知三角形的三条边求面积计算并显示结果显示出错提示结束两边和大于第3边?开始输入数据程序#includestdio.h#includemath.hmain(){floata,b,c,s,area;printf(Sidea=);scanf(%f,&a);printf(Sideb=);scanf(%f,&b);printf(Sidec=);scanf(%f,&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(“Sorry,reentryplease.);getch();}运行时输入:345输出:area=6.00运行时输入:133输出:Sorry,reentrypleaseif语句嵌套一般形式if(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4内嵌if内嵌ifif(expr1)if(expr2)statement1elsestatement2内嵌ifif(expr1)if(expr2)statement1elsestatement3内嵌ifif(expr1)statement1elseif(expr3)statement3e
本文标题:c4第四章 选择结构程序设计(2011)
链接地址:https://www.777doc.com/doc-4305615 .html