资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,11/7/2009,#,单击此处编辑母版标题样式,1,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,C语言教程课件第四章选择结构,4.1,关系运算符和关系表达式,关系运算符及其优先级,=,优先级相同高于,=,!=,说明:关系运算符优先级低于算术运算符高于赋值运算符,关系表达式,用关系运算符将两个表达式连接起来的式子,关系表达式的值是一个逻辑值,即“真”或“假”,而在,C,语言中没有专门的逻辑值,用,1,代表“真”,用,0,代表“假”,4.2 逻辑运算符与逻辑表达式,逻辑运算符及其优先级,!,(,逻辑非,),高于,&,(,逻辑与,),高于,|,(,逻辑或,),优先级:,!,高于算术运算符,关系运算符高于,&,高于,|,逻辑表达式,逻辑表达式的值为,1,(真)或,0,(假),而在运算过程中任何,非零值,都认为是“,真,”,用逻辑表达式表示指定条件,是否为闰年,一个数,n,是否在,-1,到,1,之间(注意:关系运算符与逻辑运算符都是,左结合,的),一个字符是否是英文字母,注意:,在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。,(1)a&b&c,只有,a,为真时,才需要判断,b,的值,只有,a,和,b,都为真时,才需要判断,c,的值。,(2)a|b|c,只要,a,为真,就不必判断,b,和,c,的值,只有,a,为假,才判断,b,。,a,和,b,都为假才判断,c,例,:,执行表达式,(m=ab)&(n=cd),后,问各变量的值,当,a=1,b=2,c=3,d=4,m,和,n,的原值为,1,时,由于“,ab”,的值为,0,,因此,m=0,,而“,n=cd”,不被执行,因此,n,的值不是,0,而仍保持原值,1,。,4.3 if,语句,1、,单分支选择,if,语句,if,语句有三种形式:单分支选择,if,语句、双分支选择,if,语句、多分支选择,if,语句。,语句形式:,if (,表达式)语句;,语句执行流程:,表达式,语句,真(非0),假(0),4.3.1 if,语句的三种形式,说明:,表达式必须用括号括起来,尾部一般不加分号而且其可以为各种类型的表达式,一般为关系表达式或逻辑表达式,其值为真或假,但也可以是其他表达式,只要值为非,0,即为真,否则为假。,if(E),等价于,if(E!=0),if(!E),等价于,if(E=0),if(E1=E2),与,if(E1=E2),的区别,注意:,(1),if,语句自动结合一个语句,当满足条件需要执行多个语句时,应用一对大括号 将需要执行的多个语句括起,形成一个复合语句。,(2),if,语句中表达式形式很灵活,可以是常量、变量、任何类型表达式、函数、指针等。只要表达式的值为非零值,条件就为真,反之条件为假。,2,、,双分支选择,if,语句,语句形式:,if (,表达式)语句1;,else,语句2;,语句执行流程:,表达式,语句1,真(非0),假(0),语句2,if,和,else,语句之间只能有一个语句,当,ifelse,之间的语句不只一句时,应用一对将语句括起。,if(ab),a+,;,b+,;,else,a=0,;,b=10,;,注意:,3,、,多分支选择,if,语句,语句形式:,if (,表达式1)语句1;,else,if (,表达式2)语句2;,else,if (,表达式,n),语句,n;,else,语句,n+1;,语句执行流程:,表达式,1,语句1,真(非0,),假(0,),语句2,表达式,2,真(非0),表达式,2,语句,n,语句,n+1,假(0,),假(0,),语句含义,:,语句形式:,当,if,语句中又包含若干个,if,语句时,则构成了,if,语句嵌套的情形。,4.3.2,if,语句的嵌套,if(,表达式1),if(,表达式2),语句1;,if(,表达式1),if(,表达式2),语句1;,else,语句2;,注意,:,当,if,语句中出现多个“,if”,与“,else”,的时候,要特别注意它们之间的匹配关系,否则就可能导致程序逻辑错误。,“,else”,与“,if”,的匹配原则是“就近一致原则”,即“,else”,总是与它前面最近的“,if”,相匹配。,例,有一个函数,编一程序,输入一个,x,值,输出,y,值。,上例中的程序段有四个,请判断哪个是正确的?,程序,1,:,if(x=0),if(x0)y=1;,else y=0;,else y=-1;,程序,3:,y=-1;,if(x!=0),if(x0)y=1;,else y=0;,程序,4:,y=0;,if(x=0),if(x0)y=1;,else y=-1;,4.4 条件运算符,格式:,表达式?表达式表达式,功能:,先求解表达式,若为非(真)则求解表达式,此时表达式的值就作为整个条件表达式的值。若表达式的值为(假),则求解表达式,表达式的值就是整个条件表达式的值,使用场合:,若在,if,语句中,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值时,可以用一个条件运算符来处理。,说明:,条件运算符优先级高于赋值运算符,低于关系运算符和算术运算符。,条件运算符的结合方向为“自右至左”。,“,表达式,2”,和“表达式,3”,不仅可以是数值表达式,还可以是赋值表达式或函数表达式。,条件表达式中,表达式的类型可以与表达式和表达式的类型不同。,例,:,if(ab)max=a;,else max=b;,当,ab,时将,a,的值赋给,max,,当,ab,时将,b,的值赋给,max,,可以看到无论,ab,是否满足,都是向同一个变量赋值,可以用下面的条件运算符来处理:,max=(ab)?a:b;,4.5 switch,语句,1、语句形式:,switch(,表达式,),case,常量1:语句1;,case,常量2:语句2;,case,常量3:语句3;,.,case,常量,n:,语句,n;,default:,语句,n+1;,根据表达式的不同值,选择不同的程序分支,又称开关语句,。,数值型,或,字符型,常量表达式的值必须互不相同,否则执行时将出现矛盾,即同一个开关值,将对应多种执行方案。,千万不能接(;)号,2、语句执行流程:,指语句的最后一条是否为,break,简单语句或复合语句,break,break,有,无,break,有,无,有,计算表达式,常量1,常量2,常量,n,=,语句1,=,=,=,语句2,语句,n,其它,=,语句,n+1,无,值,例 假设用0、1、2.6分别表示星期日、星期一.星期六。现输入一个数字,输出对应的星期几的英文单词。如果输入3,输出“,Wednesday”。,程序运行情况如下:,3,Wednesday,Thursday,Friday,Saturday,error,#,include stdio.h,void main(),int n;,scanf(%d,switch(n),case 0:printf(Sundayn);,case 1:printf(Mondayn);,case 2:printf(Tuesdayn);,case 3:printf(Wednesdayn);,case 4:printf(Thursdayn);,case 5:printf(Fridayn);,case 6:printf(Saturdayn);,default:printf(Error);,在“,switch”,语句中,“,case,常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个,switch,语句,因此会继续执行所有后面语句的情况。,为此,语言提供了一种,break,语句,其功能是可以跳出它所在的,switch,语句。,将上例,4,修改如下:,#,include stdio.h,void main(),int n;,scanf(%d,switch(n),case 0:printf(Sundayn);,break;,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;,default:printf(Error);,程序运行情况如下:,3,Wednesday,3、说明,多个,case,语句可以共用一组执行语句。,switch(grade),case A:,case B:,case C:printf(grade=60n);break;,default:printf(grade60);,各,case,和,default,子句的先后顺序可以变动,而不会影响程序执行结果。,default,语句可以省略不用。,case,与其后面的常量表达式间至少有一个空格。,switch,语句可以嵌套,,break,语句只跳出它所在的,switch,语句。,例,企业发放的奖金根据利润提成。从键盘输入当月利润,求应发放奖金总数?,利润,x,x=10,10 x,20,20 x,40,40 x,60,60 x,100,100 x,(int)x/10,常量,0,1,1,2,2,3,4,4,5,6,6,7,8,9,10,10,以上,用这种方法转换后,,n,出现了在不同区域有重复数字的情况。解决的方法有很多,其中一种是可以采用当,x,为10的整数倍时,将计算出的,n,值减1。,使用,switch,解题的关键,通过分析找到表达式,将问题分成几种情况。,1.写出下面程序的运行结果,main(),int x=1,y=0,a=0,b=0;,switch(x),case 1:switch(y),case 0:a+;break;,case 1:b+;break;,case 2:a+;b+;break;,case 3:a+;b+;,printf(“a=%d,b=%dn”,a,b);,结果:,a=2,b=1,2.程序填空:以下程序判断输入的整数能否被3或7整除.,main(),int x,f=0;,scanf(“%d”,if(,1,),(,2,),if(f=1)printf(“YESn”);,else printf(“NOn”);,1 x%3=0|x%7=0,2,f=1;,谢谢观赏,谢谢观赏,
展开阅读全文