5.1关系运算符和关系表达式5.2逻辑运算符和逻辑表达式5.3if语句5.4switch语句5.5程序举例第5章选择结构程序设计选择结构的应用场合当我们不知向何处走时,会抬头看看路牌,当某个方向满足了我们的要求,则会走去。在程序设计中当某条件成立,执行某段程序;不成立,执行另一段程序。此时,即为选择结构,可使用if或switch语句完成该功能。例如:……【引例】计算函数值:y=Sin(x)/xx01x=0需要考虑:1.输入x2.判断x值3.根据x值,计算y值4.输出y值显然2、3顺序程序不能够实现上述式子的编程,需引入选择结构程序。选择结构是三种基本结构之一,特点是:根据指定条件:成立时执行一组操作,不成立时执行另一组操作。输入xx为0?y=1假真y=sin(x)/x输出y【程序】#includestdio.h#includemath.hmain(){floatx,y;printf(“Enterx:”);scanf(“%f”,&x);if(x!=0.0)y=sin(x)/x;elsey=1;printf(“x=%5.2f\ty=%7.4f\n”,x,y);}选择结构运行结果:Enterx:2x=2.00y=0.4546关系运算5.1关系运算及其表达式所谓“关系运算”实际上就是“比较运算”,即将两个数据进行比较,判定两个数据是否符合给定的关系。例如:“ab”中的“”表示一个大于关系运算。如果a的值是5,b的值是3,则大于关系运算“”的结果为“真”,即条件成立;如果a的值是2,b的值是3,则大于关系运算“”的结果为“假”,即条件不成立。(算术、关系、逻辑、赋值、字符)C语言没有逻辑型数据,以1代表“真”,以“0”代表“假”。因此,关系表达式的值,还可以参与其它种类的运算,例如算术运算、逻辑运算等。又例如:变量a=3,b=2,c=1,则下列表达式及其值是:ab(真)ab==c(真)b+ca(假)d=ab(d的值为1f=abc(f值为0)说明:数值量比较:数字的大小字符量比较:ASCII码的大小(因为“>”运算符是自左至右的结合方向,先执行“a>b”,得值为1,再执行关系运算:“1>c”得值0,赋给f。返回关系运算符赋值运算符算术运算符3.运算优先级(P92)[例]设a=2,b=3,c=4则:ca+ba=b==c高低'a'+5'b'f=abc0即:c(a+b),结果为:即:(b==c),a=?001即:97+5'b',结果为:即:ab,1c,结果为:注意:例注意区分“=”与“==”语言程序设计第二章数据描述C分析下列程序main(){intx=9,y=8,z=7;inta,b,c;a=xyz;b=--x-y=z;c=x==y;printf(“x=%dy=%dz=%d\n”,x,y,z);printf(“a=%db=%dc=%d\n”,a,b,c);}5.2逻辑运算及其表达式关系表达式只能描述单一条件,例如“x=0”。如果需要描述“x=0”、同时“x10”,就要借助于逻辑表达式了。5.2.1逻辑运算及其优先次序1.逻辑运算符及其运算规则(1)C语言提供三种逻辑运算符:&&逻辑与(相当于“同时”)||逻辑或(相当于“或者”)!逻辑非(相当于“否定”)XYXYX!XX&&YX||Y结合性:自左向右结合性:自左向右结合性:自左向右结合性:自左向右结合性:自右向左结合性:自右向左逻辑与&&逻辑或||逻辑非!aba&&ba||b!a假假假假真假真假真真真假假真假真真真真假返回a&&b&&c3)在求解过程中,并非所有运算符都能被执行a为假,不必判断b和c结果为:0a为真b为假,不必判断cb为真,才判断ca‖b‖ca为真,不必判断b和c结果为:1a为假b为真,不必判断cb为假,才判断c[例]设a=1,b=2,c=3,d=4,m=1,n=1,执行表达式后,n的值?①0②0掌握(m=ab)&&(n=cd)n=cd不被执行,故n的值仍为“1”。1【解答】:在逻辑表达式的求值过程中,并不是所有的运算对象都参加运算,而是按照运算对象自左向右的计算顺序运算,当某个运算对象的值计算出来后,可以确定整个逻辑表达式的值时,其余的运算对象将不参加运算。即:对于运算符“&&”来说,只有左边的运算对象为真时(非0),其右边的运算对象才进行运算。对于运算符“||”来说,只有左边的运算对象为假时(0),其右边的运算对象才进行运算。在该题中,因为左边的运算对象(m=ab)为假,所以右边的运算对象(n=cd)将不参加运算,即n的值不变,仍为1。(m=ab)&&(n=cd)做的先后顺序是:解答:从左向右来运算,向计算“&&”左边运算对象(m=ab)的值,而对于运算对象(m=ab)先计算ab的值,再把其结果0赋值给m。abc0(假)非0(真)0(假)非0(真)1(真)0(假)0(假)所以:(1)逻辑与运算符:&&a&&b&&ca为0则不往下进行,否则进行,b也同样(2)逻辑或运算符:||a||b||c只要a为真(非0)就不必判别b和cabc0非0(真)非0(真)非0(真)0(假)1(真)0例:main(){inta,b=0,c=0,d=0;scanf(“%d”,&a);d=a&&(b=5)&&(c=3);printf(“a=%d,b=%d,c=%d,d=%d\n”,a,b,c,d);}分别输入:10想一想结果?分别输出:a=1,b=5,c=3,d=1a=0,b=0,c=0,d=0例:main(){inta,b=0,c=0,d=0;scanf(“%d”,&a);d=a||(b=5)||(c=3);printf(“a=%d,b=%d,c=%d,d=%d,\n”,a,b,c,d);}输入:10奇怪??还想不出来!输出:a=1,b=0,c=0,d=1a=0,b=5,c=0,d=1返回4.逻辑表达式应用1)区间条件的表示axbxa&&xb或ax&&xb2)描述条件的表示x0和y0x0&&y0x0或y0x0‖y0x和y之一为零,但不能都为零!(x==0&&y==0)&&x*y==0(x*y==0)&&(x!=y)a<xb?错3)判断闰年在C中,巧妙地使用逻辑表达式,可以表示一个复杂的问题如:关于闰年问题:符合下列条件之一,均为闰年。(1)能被4整除并且不能被100整除(2)能被4整除并且能被400整除其逻辑表达式为:(year%4==0&&year%100!=0)||(year%400==0&&year%4==0)由于能被400整除的年份一定能被4整除,所以可省去后一部分,即:(year%4==0&&year%100!=0)||(year%400==0)若判断非闰年,只在闰年表达式前加!,即:!(year%4==0&&year%100!=0)||(year%400==0)选择结构中使用的一种语句。根据给定的条件判别是否满足,以决定执行哪种操作。5.3.1if语句的三种形式1.第一种形式的条件语句if(表达式)语句表达式可以是常量、变量、表达式。类型可以是整、实、字符型表达式语句假(0)真(非0)5.3if语句例:main(){intx=0;floaty=-5.6;if(x)printf(“x=%d\n”,x);if(y)printf(“y=%f\n”,y);if(‘0’)printf(“‘0’=%d\n”,‘0’);if(xy)printf(“x-y=%f\n”,x-y);if(y-100){x++;y++;printf(“x=%d,y=%f\n”,x,y);}}运行结果:y=-5.600000‘0’=48x-y=5.600000x=1,y=-4.600000复合语句被当作一条语句看待表达式非0为真2.第二种形式的条件语句(双分支形式)if(表达式)语句1else语句2执行过程见图注:只执行两个语句中的一个语句表达式语句1语句2真假3.第三种形式的条件语句(多分支选择形式)if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3┆elseif(表达式m)语句melse语句n所示框图表达式1假真表达式2表达式3表达式4语句5语句4语句3语句2语句1真真真假假假返回[例]输入成绩g,按以下分数段打印:if(g60)printf(E);elseif(g70)printf(D);elseif(g80)printf(C);elseif(g90)printf(B);elseprintf(A);若入口语句的条件为:g≥90则块(无分支)否则块(有分支)60090100(人口语句条件)g608070Ag≥90B80≤g90D60≤g70Eg60C70≤g80#includestdio.hmain(){intg;printf(Pleaseenterg:);scanf(%d,&g);if(g=90){printf(“A”);}elseif(g=80&&g90){printf(“B”);}elseif(g=70&&g80){printf(“C”);}elseif(g=60&&g70){printf(“C”);}elseprintf(“D”);}返回2)关于else、elseif子句(P97)if(x0)printf(%f,x);elseprintf(%f,-x);不要认为是两条语句else、elseif子句不能单独存在,必须与if语句配对。elseif子句可以没有,也可以有多个。else子句可以没有,若有,则只能有一个。[例]求x的绝对值。内嵌语句需要的分号main(){floata,b,t;scanf(%f%f,&a,&b);if(ab){t=a;a=b;b=t;}printf(%f,%f\n,a,b);}演示4-1返回3)关于if、else、elseif后面的内嵌操作语句。[例]输入两个实数,按由小到大的次序输出。此处不需另加分号此处换成:t=a,a=b,b=t;?需要多条语句,可加{}做成复合语句返回2.if语句的嵌套(P99)当if语句中又包含一个或多个if语句时,称为if语句的嵌套。60090100(人口语句条件)g80则块(有分支)否则块(有分支)80if()else内嵌if内嵌ifTFTTFF语句1g80g60g90语句2语句3语句4if()语句1else语句2if()语句3else语句4g60g90g80分层缩进书写建议用“{}”使用内嵌的if语句时,应区分表面形式与实际作用如:if()if()语句1;elseif()语句2;else语句3;编程者希望把中间的else与第一行的if匹配,虽然书写时排得很整齐,但编译后程序的执行效果如何呢?在C语言中,if与else的配对原则是:从最内层开始,else总是与它上面最近的,未曾配对的if配对。因此,上述问题在编译时的真正效果是:if()等价于下述表示:当条件成立时执行下面虚框中的内容if()if()语句1elseif()语句2else语句3是中间else的子句为了使程序清晰,不至出错,采取的方法是:(1)使内嵌的if也包含else,如上面的问题可进行如下描述:if()if()…else…elseif()…else...(2)若if和else数目不等,为实现设计者的企图,可用{}实现,如上述问题可进行如下描述:if(){if()语句1}else{if()语句2else语句3}比较:if(x)if(x)if(y)printf(“1”);{if(y)printf(“1”);}elseprintf(“2”);elseprintf(“2”);由此看出,通过加“{}”可以改变“else”的层位,从而改变程序的流程。if(ab)if(cd)x=1;elseif(ac)if(bd)x=2;elsex=3;elsex=7;2.若有:inta=1,b=3,c=5,d=4,x=0;则执行完下列程序段后,x的值为。A若:a=4时,x的值为?0返回(A)2(B)