08091学期C程序设计(第三版)教材PPT第5章讲稿.ppt
第五章:选择结构程序设计,5.1 关系运算符和关系表达式5.2 逻辑运算符和逻辑表达式5.3 if语句5.4 switch语句5.5 程序举例,第5章:选择结构,三种基本结 构:,3.循环结构,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)大于4)=大于或等于5)=等于6)!=不等于关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,,=的优先级相同,高于=和!=,=和!=的优先级相同。,优先级相同(高),优先级相同(低),注意:在语言中,“等于”关系运算符是双等号“=”,而不是单等号“=”(赋值运算符)。,5.1:关系运算符和关系表达式,例如:ca+b 等效于c(a+b)ab=c 等效于(ab)=c a=bc 等效于a=(bc),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)(a6,因为a1,1+5=6。强调:C语言用整数“1”表示“逻辑真”,用整数“0”表示“逻辑假”。所以,关系表达式的值,还可以参与其它种类的运算,例如算术运算、逻辑运算等。,5.2:逻辑运算符和逻辑表达式,关系表达式只能描述单一条件,例如“x=0”。如需描述“x=0”、同时“x10”,就要借助逻辑表达式。用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。5.2.1 逻辑运算及其优先次序逻辑运算符及其运算规则(1)C语言提供三种逻辑运算符:&逻辑与(相当于“同时”)双目|逻辑或(相当于“或者”)双目!逻辑非(相当于“否定”)单目,例如,下面的表达式都是逻辑表达式:(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&84-!0,!算术运算符 关系运算符&|赋值运算符,5.2:逻辑运算符和逻辑表达式,(2)计算逻辑表达式时,并不是所有的逻辑运算符都被执行,只有必须执行下一个逻辑运算符才能求出表达式的解时,才执行该逻辑运算符。1)对于逻辑与(&)运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。2)对于逻辑或(|)运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。,例如,假设n1、n2、n3、n4、x、y的值分别为1、2、3、4、1、1,则求解表达式“(x=n1n2)&(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 语句,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,例如: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.1:输入两个实数,按代数值由小到大的次序输出这两个数#include void main()float a,b,t;scanf(%f,%f,运行情况:3.6,-3.2-3.20,空3.60,例5.2 输入3个数a,b,c,要求按由小到大的顺序输出.#include void main()float a,b,c,t;scanf(%f,%f,%f,运行情况: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 语句2else if()语句3 else 语句4,内嵌if,内嵌if,例5.3有一函数:,#include void main()int x,y;scanf(%d,-1(x0),y=,0(x=0),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有一函数:,-1(x0),y=,0(x=0),1(x0),正确,正确,若if语句中,在表达式为“真”和“假”时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理.条件运算符要求有3个操作对象,称三目运算符,C中唯一的一个三目运算符.条件表达式的一般形式为:表达式1?表达式2:表达式3它的执行过程如下图:,5.3:if 语句,5.3.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.4 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换.然后输出最后得到的字母.#include void main()char ch;scanf(%c,运行结果:Aa,5.4:switch 语句,switch语句是多分支选择语句.if语句只有两个分支可供选择,而实际问题中常常需要用到多分支的选择.当然多分支也可以用嵌套的if语句来处理,但如果分支较多,则嵌套的if语句层数多,程序冗长而且可读性都低.C提供switch语句直接处理多分支选择,它的一般形式如下:,5.4:switch 语句,说明:(1)switch后面括弧内的“表达式”,ANSI 标准允许它为任何类型.(2)当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句.(3)每一个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象.(4)各个case和default的出现次序不影响执行结果.,例:要求按照考试成绩的等级输出百分制分数段,用switch语句实现:switch(grade)case printf(85100);case printf(7084);case printf(6069);case printf(60);default printf(error);,5.4:switch 语句,(5)执行完一个case后面的语句后,流程控制转移到下一个case继续行.“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断.在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不在进行判断.(6)多个case可以共用一组执行语句.如:case A:case B:case C:printf(“60n”);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,运行情况: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,例56 求ax2+bxc方程的解。基本的算法:,不是二次方程。b24ac,有两个相等实根。b24ac,有两个不等实根。b24ac,有两个共轭复根。,5.5:程序举例,5.5:程序举例,#include#include void main()float a,b,c,disc,x1,x2,realpart,imagpart;scanf(“%f,%f,%f”,例5.6 求ax2+bxc方程的解。,5.5:程序举例,else if(disc1e-6)x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf(has distinct real roots:%8.4fand8.4fn,x1,x2);elserealpart=-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,5.5:程序举例,5.5:程序举例,5.35.45.55.85.10,作业:,