资源描述
第五章:选择结构程序设计,5.1 关系运算符和关系表达式,5.2 逻辑运算符和逻辑表达式,5.3 if语句,5.4 switch语句,5.5 程序举例,第5章:选择结构,三,种,基,本,结 构,:,1.,顺序结构:,2. 选择结构:,3. 循环结构,1.顺序结构:,3.循环结构:,2.选择结构:,5:选择结构程序设计,要设计选择结构程序,要考虑两个方面的问题:,一.是在C语言中如何来,表示条件,,,二.是在C语言中实现选择结构用什么,语句,。,在C语言中表示条件,一般用,关系表达式或逻辑表达式,,实现选择结构用,if语句或switch语句,。,5:选择结构程序设计,if语句的常用形式:,if,(关系表达式)语句1,else,语句2,例如:,if(x0)y=1;else y=-1;,关系表达式 ;“,”,为关系运算符,5.1:关系运算符和关系表达式,关系运算(比较运算),:将两个值进行比较,判断其比较的结果是否符合给定的条件。,例如:,a5 -,为一个关系表达式,如果a=3,则不满足a5这个条件,此关系表达式的值为,“假”,;,如果a=9,则满足a5这个条件,此关系表达式的值为,“真”,。,5.1:关系运算符和关系表达式,5.1.1 关系运算符及其优先次序,在语言中有以下关系运算符:,1) 小于,2) 大于,4) = 大于或等于,5) = 等于,6) != 不等于,关系运算符都是,双目,运算符,其结合性均为,左,结合。,关系运算符,的优先级,低于算术,运算符,,高于赋值,运算符。,在六个关系运算符中,,=的优先级相同,高于=和!=,=和!=的优先级相同。,优先级相同(高),优先级相同(低),注意:在语言中,“等于”关系运算符是双等号“= =”,而不是单等号“= ”(赋值运算符)。,5.1:关系运算符和关系表达式,例如:,ca+b 等效于c(a+b),ab=c 等效于(ab)=c,a=bc 等效于a=(bc 等效于a=(bc ),算术运算符,关系运算符,赋值运算符,(高),(低),图5-1,5.1:关系运算符和关系表达式,5.1.2 关系表达式,1关系表达式的概念,关系表达式是指用,关系运算符,将两个表达式连接起来,进行关系运算的式子。,例如,合法的关系表达式:,ab,a+bc-d,(a=3)=b,(ab)= =(bc),2关系表达式的值逻辑值(非“真”即“假”)。,由于语言没有逻辑型数据,所以用整数“”表示“逻辑真”,用整数“”表示“逻辑假”。,5.1:关系运算符和关系表达式,例如,假设a=3,b=4,c=5,则:,(1)ab的值=,0,。,(2)(ab)!=b的值=,1,。,(3)a,1,。,(4)(a,6,,因为a,1,,1+5=6。,强调:C语言用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。所以,,关系表达式的值,还可以参与其它种类的运算,,例如算术运算、逻辑运算等。,5.2:逻辑运算符和逻辑表达式,关系表达式只能描述单一条件,例如“x=0”。如需描述“x=0”、同时“x=0) & (x5) ,! (x= =0),,(year%4=0)&(year%100!=0)|(year%400=0),(2)运算规则,1),&,:当且仅当,两个,运算量的值,都为“真”,时,运算结果为,“真”,,否则为“假”。,2),|,:当且仅当,两个,运算量的值,都为“假”,时,运算结果为,“假”,,否则为“真”。,3),!,:当运算量的值为“真”时,运算结果为“假”;当运算量的值为“假”时,运算结果为“真”。,例如,假定x=5,则(x=0) & (x5)的值为“假”。,5.2:逻辑运算符和逻辑表达式,2逻辑运算符的运算优先级,(1),逻辑非,的优先级最高,,逻辑与,次之,,逻辑或,最低,即:,!(非) &(与) |(或),(2)与其它种类运算符的优先关系,! 算术运算符 关系运算符 & | 赋值运算符,5.2.2 逻辑表达式,1逻辑表达式的概念,用,逻辑运算符,将1个或多个表达式连接起来,进行逻辑运算的式子。在C中,用逻辑表达式表示多个条件的组合。,例如,(year%4=0)&(year%100!=0)|(year%400=0)就是一个判断一个年份是否是闰年的逻辑表达式。,逻辑表达式的值是一个逻辑值(非“真”即“假”)。,5.2:逻辑运算符和逻辑表达式,5.2:逻辑运算符和逻辑表达式,2逻辑量的真假判定和非,编译系统在,给出逻辑运算结果,时用整数“”表示“逻辑真”、用“”表示“逻辑假”。,但在,判断一个数据的“真”或“假”时,,却以和非为根据:如果为,则判定为“逻辑假”;如果为非,则判定为“逻辑真”。,例如,假设num=12,则:!num的值= ,num=1 num31的值=1。,5.2:逻辑运算符和逻辑表达式,3说明,(1)逻辑运算符两侧的操作数,除可以是和非的整数外,也可以是其它任何类型的数据,如实型、字符型等。,例如:,c&d,的值为1 (关键看,c和d的ASCII码值是否为0),如果在一个表达式中不同位置出现数值,要区分哪些是作为数值运算或关系运算的对象,那些作为逻辑运算的对象?,例如:53 & 8n2)&(y=n3n4)”后,,x的值变为,而y的值不变,仍等于1!,5.2:逻辑运算符和逻辑表达式,例如:求闰年问题!,表示是闰年的条件可用下列逻辑表达式:,(year%4=0)&(year%100!=0)|(year%400=0),表示非闰年的条件可用下列逻辑表达式:,!,(year%4=0 )& (year%100!=0)|(year%400=0),或,(year%4!=0)|(year%100=0 & yer%400!=0),将C提供的关系运算符和逻辑运算符有效的结合使用,可编写出合适的逻辑表达式来表示一个复杂的条件!,分析:,闰年的条件是:(1),能被4整除,但不能被100整除的年份都是闰年,,如1996,2004年是闰年;(2),能被100整除,又能被400整除的年份是闰年,。如1600,2000年是闰年。不符合这两个条件的年份不是闰年。,5.3.1 if语句的三种形式,1if语句的一般格式:,if(表达式)语句组1;,1)if语句中的“表达式”必须用,“(”和“)”,括起来。,2),else,子句(,可选,)是if语句的一部分,必须与if,配对,使用,不能单独使用。,3)当if和else下面的语句组,仅由一条语句构成时,也可不使用,复合语句形式,(即去掉花括号)。,5.3:if 语句,if 语句,是用来判定所给的,条件,是,真,还是,假,决定执行给出的两种操作之一!,5.3:if 语句,表达式,表达式,语句,假(0),真(非0),真,语句1,语句2,假,C语句提供了三种形式的if语句:,1.if(表达式) 语句,if(xy)printf(“%d”,x);,2.if(表达式) 语句1 else 语句2,if(xy)printf(“%d”,x);,else printf(“%d”,y);,5.3:if 语句,3.if(表达式1) 语句1,else if (表达式2) 语句2,else if (表达式3) 语句3,else if (表达式m) 语句m,else 语句n,表达式1,表达式2,表达式3,表达式4,语句1,语句2,语句3,语句4,语句5,假,真,真,假,真,假,假,真,例如:,if(number500) cost=0.15;,else if(number300)cost=0.10;,else if(number100)cost=0.075;,else if(number50)cost=0.05,else cost=0;,5.3:if 语句,说明:,(1)三种形式的if语句在if后都有“表达式”,一般为,逻辑表达式或关系表达式,也可为其它类型,。,例如:if(b3)printf(“Hello”); if(a)printf(“%d”,a);,(2)第二种和第三种形式的if语句中,在每个else前面有一个分号,整个语句结束处有一个分号。虽然分号是C语句的组成部分,但是,if和else同属于一个语句,。,例如:,if(xy)printf(“%d”,x);,else printf(“%d”,y);,(3)在if和else后面可以只含一个内嵌的操作语句,也可以有多个操作语句, 此时用一对花括号“”将几个语句括起来成为一个,复合语句,.,例如:,if(a+bc),s=0.2*(a+b);,printf(“s=0.2*(a+b)=%fn”,s); ,else, s=0.5*c;,printf(“s=0.5*c=%f;n”,s); ,5.3:if 语句,5.3:if 语句,例5.1:输入两个实数,按代数值由小到大的次序输出这两个数,#include ,void main(), float a,b,t;,scanf(%f,%f,if(ab),t=a;a=b;b=t;,printf(%5.2f,%5.2fn,a,b);,运行情况:,3.6,-3.2,-3.20,空3.60,5.3:if 语句,例5.2 输入3个数a,b,c,要求按由小到大的顺序输出.,#include ,void,main(),float a,b,c,t;,scanf(%f,%f,%f,if(ab), t=a;a=b;b=t;,if(ac), t=a;a=c;c=t;,if(bc), t=b;b=c;c=t;,printf(%5.2f,%5.2f,%5.2fn,a,b,c);,运行情况:,3,7,1,空1.00,空3.00,空7.00,5.3:if 语句,5.3.2 if 语句的嵌套,应当注意if与else的配对关系。,else总是与它上面的最近的if配对,。,在if语句中又包含一个或多个if语句称为if语句的嵌套.一般形式如下:,if( ),if( ) 语句1,else 语句2,else,if( ) 语句3,else 语句4,内嵌if,内嵌if,if( ),if( ) 语句1,else,if( ) 语句2,else 语句3,内嵌if,5.3:if 语句,例5.3有一函数:,#include ,void main(),int x,y;,scanf(%d,if(x0)y=-1;,else if(x=0)y=0;,else y=1;,printf(x=%d,y=%dn,x,y);,-1 (x0),编一程序,输入一个x 值,输出y值. 程序清单如下:,方法1:,上例中的程序段有四个,请判断哪个是正确的?,程序1: 程序2:,if(x=0),y=-1; if(x0) y=1;,else else y=0;,if(x=0) y=0; else y=-1;,else y=1;,程序3: 程序4:,y=-1; y=0;,if(x!=0) if(x=0),if(x0) y=1; if(x0) y=1;,else y=0; else y=-1;,5.3:if 语句,例5.3有一函数:,-1 (x0),正,确,正,确,若if语句中,在表达式为“真”和“假”时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理.,条件运算符,要求有3个操作对象,称,三目运算符,C中唯一的一个三目运算符.,条件表达式,的一般形式为:,表达式1?表达式2:表达式3,它的执行过程如下图 :,5.3:if 语句,5.3.3 条件运算符,表达式1,条件表达式,取表达式2的值,条件表达式,取表达式3的值,真,假,5.3:if 语句,说明:,(1)条件运算符的执行顺序:先求解表达式1,若为非0,则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0,则求解表达式3,表达式3的值就是整个条件表达式的值。,例如:,max=(ab)?a:b,(2)条件运算符优先于赋值运算符,但比关系运算符和算术运算符都低。,例如:,max=ab?a:b,ab?a:b+1,(3)条件运算符的结合方向为,“,自右至左,”,例如:a=1,b=2,c=3,d=4,ab?a:,(,cd,?c:d) 值为4,(4)条件表达式中“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式!,例如:ab?printf(“%d”,a):printf(“%d”,b);,(5)条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同,例如:xy?1:,1.5,条件表达式的值为表达式2和表达式3中较高的类型。,5.3:if 语句,5.3:if 语句,例5.4 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换.然后输出最后得到的字母.,#include ,void main(),char ch;,scanf(%c,ch=(,ch=A & ch60n”);break;,5.5: 程序举例,例5.5写程序,判断某一年是否闰年,分析:以变量leap代表是否闰年的信息.若闰年,令leap=1;非闰年,leap=0.,最后判断leap是否为1,若是,则输出“闰年”信息。,N-S结构流程图5-13如下:,5.5: 程序举例,例5.5写程序,判断某一年是否闰年,#include void main()int year,leap;,scanf(%d,if,(year%4=0),if,(year%100=0),if(year%400=0) leap=1;,else leap=0;,else,leap=1;,else,leap=0;,if(leap) printf(%d is,year);,else printf(%d is not,year);,printf(a leap year.n); ,运行情况:,1989,1989 is not leap year.,2000,2000 is leap year.,if(year%4!=0)leap=0;,else if(year%100!=0),leap=1;,else if(year%400!=0),leap=0;,else leap=1;,if(year%4=0&year%100!=0),|(year%400=0),leap=1;,else leap=0;,例56 求a,x,2,+bxc方程的解。,基本的算法:, ,不是二次方程。,b,2,4ac,有两个相等实根。,b,2,4ac ,有两个不等实根。,b,2,4ac ,有两个共轭复根。,5.5: 程序举例,5.5: 程序举例,#include #include void main ( ) float a,b,c,disc,x1,x2,realpart,imagpart; scanf(“%f,%f,%f”,if,(fabs(a)=1e-6) printf(“is not a quadraticn”);,else, disc=b*b-4*a*c;,if,(fabs(disc)1e-6)x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a);printf(,has distinct real roots:%8.4fand8.4fn,x1,x2);,else,realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf(,has complex rootsn,); printf(,%8.4f+%8.4fin,realpart,imagpart); printf(,%8.4f-%8.4fin,realpart,imagpart); ,5.5: 程序举例,例5.7 运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:,s250km 没有折扣,250s500 2%折扣,500s1000 5%折扣,1000s2000 8%折扣,2000s3000 10%折扣,3000s 15%折扣,设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费的计算公式为:,f=p*w*s*(1-d),分析:折扣的变化是有规律的,即变化点都是250的倍数。此时我们可以设一个变量c= ( s/250),其代表250的倍数。可以用switch语句来实现。程序清单如下:,#include void main( ) int c,s;float p,w,d,f;scanf(%f,%f,%d, f=p*w*s*(1-d/,100.0,);printf(freight=%15.4fn,f);,5.5: 程序举例,5.5: 程序举例,5.3,5.4,5.5,5.8,5.10,作业:,
展开阅读全文