《kj-第4章选择结构程序的设计课件.ppt》由会员分享,可在线阅读,更多相关《kj-第4章选择结构程序的设计课件.ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第1页第第4章章 选择结构程序的设计选择结构程序的设计本章概述 本章的学习目标主要内容第2页本章概述本章概述l首先介绍条件表达式和逻辑表达式首先介绍条件表达式和逻辑表达式l其次介绍了选择结构的基本语句其次介绍了选择结构的基本语句If语句及其语句及其三种形式三种形式lswitch语句的介绍语句的介绍l if语句和语句和switch语句的嵌套使用语句的嵌套使用l相应程序举例相应程序举例第3页本章的学习目标本章的学习目标l本章教学目的本章教学目的:l 掌握关系表达式和逻辑表达式的使用方法,掌握关系表达式和逻辑表达式的使用方法,能使用能使用if和和switch 语句编写简单的程序。语句编写简单的程序。
2、l本章教学重点:本章教学重点:if和和switch 语句语句l本章教学难点:本章教学难点:if和和switch语句的嵌套语句的嵌套第4页主要内容主要内容l4.1 关系运算及关系表达式关系运算及关系表达式l4.2 逻辑运算及逻辑表达式逻辑运算及逻辑表达式l4.3 if语句语句l4.4 switch语句语句l4.5 if语句和语句和switch语句的嵌套形式语句的嵌套形式l4.6 程序举例程序举例第5页4.1 关系运算及关系表达式关系运算及关系表达式l 所谓所谓“关系运算关系运算”实际上就是实际上就是“比较运比较运算算”,即将两个数据进行比较,判定两个,即将两个数据进行比较,判定两个数据是否符合给
3、定的关系。数据是否符合给定的关系。 例如,例如,“a ba b”中的中的“ ”表示一个大于关系运表示一个大于关系运算。算。如果如果a的值是的值是5,b的值是的值是3,则大于关系运算,则大于关系运算“”的结果为的结果为“真真”,即条件成立;,即条件成立;如果如果a的值是的值是2,b的值是的值是3,则大于关系运算,则大于关系运算“”的结果为的结果为“假假”,即条件不成立。,即条件不成立。第6页4.1 关系运算及关系表达式关系运算及关系表达式l 关系运算符及其优先次序关系运算符及其优先次序1 1关系运算符关系运算符 C C语言提供语言提供6 6种关系运算符:种关系运算符: (小于小于), =(),
4、(大于大于), =(), =(大于或等于大于或等于), ), =( =(等于等于), !=(), !=(不等于不等于) ) 2 2优先级优先级 在关系运算符中,前在关系运算符中,前4 4个优先级相同,后个优先级相同,后2 2个也相个也相同,且前同,且前4 4个高于后个高于后2 2个。个。第7页4.1 关系运算及关系表达式关系运算及关系表达式l注意:注意:在语言中,在语言中,“等于等于”关系运算符是双等号关系运算符是双等号” ”= =”= =”,而不是单等号,而不是单等号“= = ”(赋值运算符)。(赋值运算符)。应避免对实数作相等或不等的判断应避免对实数作相等或不等的判断,如如 1.0/3.0
5、*3.0= =1.0 ,可,可改写为:改写为:fabs(1.0/3.0*3.0-1.0)bab,a+bc-da+bc-d,(a=3)=(b=5)(a=3)=ba=b,(ab)= =(bc)(ab)= =(bc)2关系表达式的值关系表达式的值逻辑值(非逻辑值(非“真真”即即“假假”)。)。第9页4.1关系运算及关系表达式关系运算及关系表达式l注意:注意:可以把关系表达式的值赋给其他变量,可以把关系表达式的值赋给其他变量, z= (xy+3) 当x=23,y=12时,z的值为1。 a=(b!=c) 当b=2、c=2时,a的值为0。关系运算符是自左至右的结合方向,关系运算符是自左至右的结合方向, 若
6、a=3、b=2、c=1, y=(abc) ,则y 的值为0。 因为按照自左至右的结合方向,先执行关系运算“ab”得值为1(“真”),再执行关系运算“1c”,得值为0(“假”),因此y为0。第10页4.1关系运算及关系表达式关系运算及关系表达式l关系运算符的优先级低于算术运算符。关系运算符的优先关系运算符的优先级低于算术运算符。关系运算符的优先级高于赋值运算符。根据优先级的规定,下面左边的关系级高于赋值运算符。根据优先级的规定,下面左边的关系表达式可以简化为下面右边的形式:表达式可以简化为下面右边的形式:(b*b-4*a*c)=0 b*b-4*a*c=0z= (xy+3) z= xy+3(ab)
7、= = c ab= =c a=(b!=c) a=b!=c当然为提高程序的可读性、可维护性你不妨多使用括当然为提高程序的可读性、可维护性你不妨多使用括号,因为号,因为C语言中的有些优先级很容易让你不小心犯错。语言中的有些优先级很容易让你不小心犯错。第11页4.2 逻辑运算及其表达式逻辑运算及其表达式l关系表达式只能描述单一条件,例如关系表达式只能描述单一条件,例如“x=0”。如果需要描述。如果需要描述“x=0”、同时、同时“x0)&(y0) x0 & y0 (x= =3)| |(y!= 6) x= =3 | | y!= 6 (x0) & (!z) x0 & !z第14页4.2 逻辑运算及其表达式
8、逻辑运算及其表达式l4.2.2 逻辑表达式逻辑表达式1逻辑表达式的概念逻辑表达式的概念 所谓逻辑表达式是指,用逻辑运算符将1个或多个表达式连接起来,进行逻辑运算的式子。在C语言中,用逻辑表达式表示多个条件的组合。 例如,(year%4=0)&(year%100!=0)|(year%400=0)就是一个判断一个年份是否是闰年的逻辑表达式。 逻辑表达式的值也是一个逻辑值(非“真”即“假”)。第15页4.2 逻辑运算及其表达式逻辑运算及其表达式l4.2.2 逻辑表达式逻辑表达式2逻辑量的真假判定逻辑量的真假判定和非和非 语言用整数“”表示“逻辑真”、用“”表示“逻辑假”。但在判断一个数据的“真”或“
9、假”时,却以和非为根据:如果为,则判定为“逻辑假”;如果为非,则判定为“逻辑真”。 例如,假设num=12,则: !num的值= , num=1 num31的值=1。第16页4.2 逻辑运算及其表达式逻辑运算及其表达式l3说明说明逻辑运算符两侧的操作数,除可以是和非的整数外,也可以逻辑运算符两侧的操作数,除可以是和非的整数外,也可以是其它任何类型的数据,如实型、字符型等。是其它任何类型的数据,如实型、字符型等。注意:在逻辑表达式的求解中,并不是所有的逻辑运算符都被按注意:在逻辑表达式的求解中,并不是所有的逻辑运算符都被按顺序执行,若计算到某一步时,逻辑表达式的值是顺序执行,若计算到某一步时,逻
10、辑表达式的值是“真真”是是“假假”已经明确,则不再执行后面的逻辑运算符。例如:已经明确,则不再执行后面的逻辑运算符。例如: (1)对于逻辑表达式)对于逻辑表达式a & b & c , 只有只有a为真(非为真(非0)时,)时,才需要判别才需要判别b的值,只有的值,只有a和和b都为真的情况下才需要判别都为真的情况下才需要判别c的值。的值。只要只要a为假,就不再去判断为假,就不再去判断b和和c(此时整个表达式已确定为(此时整个表达式已确定为假)。如果假)。如果a为真,为真,b为假,就不再去判断为假,就不再去判断c。 (2)对于逻辑表达式)对于逻辑表达式a | | b | | c, 只要只要a为真(非
11、为真(非0),就不再),就不再去判断去判断b和和c。只有。只有a为假,才去判断为假,才去判断b。a和和b都为假时,才去都为假时,才去判断判断c。第17页4.3 if语句语句lif语句是用来判定所给定的条件是否满足,语句是用来判定所给定的条件是否满足,根据判定的结果(真或假),决定执行哪根据判定的结果(真或假),决定执行哪条分支的语句。条分支的语句。 l4.3.1 if语句的三种形式语句的三种形式1第一种第一种if语句格式如下:语句格式如下: if(表达式)语句(表达式)语句它的执行过程见图,若表达式为它的执行过程见图,若表达式为“真真”,则执行该语句,则执行该语句,否则不执行该语句。否则不执行
12、该语句。第18页4.3 if语句语句l例例4.1 从键盘输入一个整数从键盘输入一个整数x,如果,如果x0,则打印,则打印x的值。的值。 # include int main() int x; printf(Input x:); scanf(%d,&x); if (x0) printf(x=%dn, x); return 0; 第19页4.3 if语句语句l2第二种第二种if语句格式如下:语句格式如下:if(表达式)(表达式) 语句语句1else 语句语句2它的执行过程是它的执行过程是: 若表达式为若表达式为“真真”,则执行,则执行该语句该语句1,否则执行语句,否则执行语句2,语句,语句1和语句
13、和语句2只能只能有其中一个语句被执行到。有其中一个语句被执行到。 第20页4.3 if语句语句 # include int main() int a; printf(输入一个整数输入一个整数:); scanf(%d,&a); if(a%2= =0) printf(%d 是偶数是偶数n,a); else printf(%d 是奇数是奇数n,a); return 0; 例例4.2 从键盘输入一个整数,判断该整数是奇数还是偶数。从键盘输入一个整数,判断该整数是奇数还是偶数。第21页3第三种第三种if语句格式如下:语句格式如下:l3第三种第三种if语句格式如下:语句格式如下:if(表达式(表达式1)
14、语句语句1else if(表达式(表达式2) 语句语句2else if(表达式(表达式n-1) 语句语句n-1else 语句语句n第22页3第三种第三种if语句格式如下:语句格式如下:第23页4.3 if语句语句 # include int main() float x,y; printf(Input x:); scanf(%f,&x); if(x1) y=x+1; else if (1=x & x2) y=x+2; /*或写成或写成else if (x2) y=x+2;*/ else y=x+3; printf(x=%f, y=%fn,x,y); return 0; 2321211xxxxx
15、xy例例4.3 输入输入x,计算并输出下列分段函数,计算并输出下列分段函数y的值。的值。第24页4.3 if语句语句l4.3.2 条件运算符条件运算符 条件运算符要求有条件运算符要求有3个操作对象,称为三目运算符,它是个操作对象,称为三目运算符,它是C语言中语言中唯一的一个三目运算符。条件表达式的一般形式如下:唯一的一个三目运算符。条件表达式的一般形式如下: 表达式表达式1?表达式?表达式2:表达式:表达式3 它的执行过程是:先求解表达式它的执行过程是:先求解表达式1,若表达式,若表达式1为为“真真”,则取表,则取表达式达式2的值为该条件表达式的值,否则取表达式的值为该条件表达式的值,否则取表
16、达式3的值为该条件表的值为该条件表达式的值。达式的值。 例如以下的例如以下的if语句:语句: if(x=y)s=x*y; else s=x+y; 可以用下面的条件运算符来处理:可以用下面的条件运算符来处理: s=(x=y)?)?(x*y) :(x+y) ; 其中其中“(x=y)?)?(x*y) :(x+y)”是一个是一个“条件表达式条件表达式”。第25页4.3 if语句语句l4.3.2 条件运算符条件运算符说明:说明: (1)条件运算符优先于赋值运算符)条件运算符优先于赋值运算符。 因此上面在因此上面在“s =(x=y)?)?(x*y) :(x+y) ;”中,是先中,是先求解条件表达式,再将它
17、的值赋给求解条件表达式,再将它的值赋给s。 (2)条件运算符的优先级别低于关系运算符和算术运算)条件运算符的优先级别低于关系运算符和算术运算符符。因此条件表达式:。因此条件表达式: s =(x=y)?)?(x*y) :(x+y) ; 括号可以不要,写成下面形式:括号可以不要,写成下面形式: s = x8?0:y3?1:-1 相当于相当于 x8?0:(:(y3?1:-1) (4)条件表达式中)条件表达式中“表达式表达式2”和和“表达式表达式3” 不仅可以是数值表达不仅可以是数值表达式,也可以是赋值表达式或函数表达式。式,也可以是赋值表达式或函数表达式。例如:例如: xy ?(?(z=x+y):(
18、):(z=x*y) 或或 xy ?putchar(A):putchar(a) 即即xy成立时,上面条件表达式的值是成立时,上面条件表达式的值是putchar(A);否则上面条件;否则上面条件表达式的值是表达式的值是putchar(a)。函数。函数putchar的返回值是参数本身,即显的返回值是参数本身,即显示的字符。示的字符。 第27页4.3 if语句语句例例4.4 输入一个输入一个2位整数,判断它的十位数码是否为位整数,判断它的十位数码是否为3,如果是,如果是3,将它乘以将它乘以10;如果不是,将它乘以;如果不是,将它乘以6。然后输出乘以。然后输出乘以10或乘以或乘以6后后的结果。的结果。
19、# include int main() int m, k; scanf(%d,&m); k=(m/10=3)?(m=m*10) : (m=m*6); printf(%dn,k); return 0; 第28页4.4 switch语句语句l1switch语句的一般形式语句的一般形式switch(表达式表达式) case 常量表达式常量表达式1:语句组;:语句组;break; case 常量表达式常量表达式2:语句组;:语句组;break; . case 常量表达式:语句组;常量表达式:语句组;break; default:语句组;:语句组;break; 第29页4.4 switch语句语句l2
20、执行过程执行过程(1)当)当switch后面后面“表达式表达式”的值,与某个的值,与某个case后面的后面的“常量表达式常量表达式”的值相同时,就执的值相同时,就执行该行该case后面的语句(组);当执行到后面的语句(组);当执行到break语句时,跳出语句时,跳出switch语句,转向执行语句,转向执行switch语语句的下一条。句的下一条。(2)如果没有任何一个)如果没有任何一个case后面的后面的“常量表常量表达式达式”的值,与的值,与“表达式表达式”的值匹配,则执行的值匹配,则执行default 后面的语句(组)。然后,再执行后面的语句(组)。然后,再执行switch语句的下一条。语句
21、的下一条。第30页4.4 switch语句语句l3注意问题:注意问题:(l)switch后的表达式的类型与常量表达式后的表达式的类型与常量表达式的类型必须一致。的类型必须一致。(2)每一个)每一个case的常量表达式的值必须互不的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象。相同,否则就会出现互相矛盾的现象。(3)在)在case后面虽然包含了一个以上执行语后面虽然包含了一个以上执行语句,但可以不用花括弧括起来,会自动顺序执句,但可以不用花括弧括起来,会自动顺序执行本行本case后面所有的执行语句。当然加上花括后面所有的执行语句。当然加上花括弧也可以。弧也可以。第31页4.4 swit
22、ch语句语句l3注意问题:注意问题:(4)break语句的作用是使流程跳出语句的作用是使流程跳出switch结构,即终止结构,即终止switch语句的执行。格式中的语句的执行。格式中的break语句一般情况下不要省略,因为没有语句一般情况下不要省略,因为没有break语句,无法跳出语句,无法跳出switch结构,会继续执结构,会继续执行下一条行下一条case后面的语句。最后一个分支后面的语句。最后一个分支(default)可以不加)可以不加break语句。语句。(5)各个)各个case和和default的出现次序不影响执的出现次序不影响执行结果。行结果。第32页4.4 switch语句语句l例
23、例4.5 分析下面程序。分析下面程序。 # include int main() char ch; printf(Input Y/N(y/n):); scanf(%c,&ch); switch(ch) case y: case Y: printf(this is Y or yn); break; case n: case N: printf(this is N or nn); break; default: printf(this is other char.n); return 0; 第33页4.5 if语句和语句和switch语句的嵌套形式语句的嵌套形式l4.5.1 if语句的嵌套语句的嵌
24、套在在if语句中可以包含一个或多个语句中可以包含一个或多个if语句,称为语句,称为if语句的嵌套。如下语句的嵌套。如下所示:所示: if()() if()() 语句语句1 else 语句语句2 else if()() 语句语句3 else 语句语句4 应当注意if与else的配对关系。else总是与它上面的最近的未配对的if配对。如果if与else的数目不一样,为实现程序设计者的意图,可以加花括弧来确定配对关系。第34页 # include int main() float x,y; printf(Input x:); scanf(%f,&x); if(x10) if(x0) y=5*x-6;
25、 else y=4*x; else y=2*x+3; printf(x=%f, y=%fn,x,y); return 0; 例例4.6 输入输入x,计算并输出下列分段函数,计算并输出下列分段函数y的值。的值。第35页4.5 .2 switch语句的嵌套语句的嵌套l例例4.7 分析下面程序。分析下面程序。 # include int main() float x,y; printf(Input x:); scanf(%f,&x); switch(x=0) case 0 : y=5*x-6; break; case 1: switch (x=10) case 0 : y=4*x; break; c
26、ase 1 : y=2*x+3; break; printf(y=%fn,y); return 0; 运行程序:运行程序: 若输入若输入-2,则,则(x=0)为假,为假,则输出则输出-16,即是按照,即是按照y=5*x-6来来计算并输出计算并输出y值。值。 若输入若输入8,则,则(x=0)为真,而为真,而(x=10) 为假,则输出为假,则输出32,即是,即是按照按照y=4*x来计算并输出来计算并输出y值。值。 若输入若输入12,则,则(x=0)为真,为真,而而(x=10) 也为真,则输出也为真,则输出27,即是按照即是按照y=2*x+3来计算并输出来计算并输出y值。值。 所以例所以例4.7的程
27、序,功能与例的程序,功能与例4.6相同。相同。第36页4.6 程序设计举例程序设计举例l例例4.8 输入三个数输入三个数a,b,c,要求按由小到,要求按由小到大的顺序输出。大的顺序输出。# include int main()float a,b,c,t; scanf(%f%f%f,&a,&b,&c); 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(%f %f %fn,a,b,c); return 0;第37页4.6 程序设计举例程序设计举例l例例4.9 输入一个百分制成绩,要求输出一输入一个百分
28、制成绩,要求输出一个用英文字母表示的等级制成绩,大于或个用英文字母表示的等级制成绩,大于或等于等于90分的为分的为A等,小于等,小于90分但大于或分但大于或等于等于80分的为分的为B等,小于等,小于80分但大于或分但大于或等于等于70分的为分的为C等,小于等,小于70分但大于或分但大于或等于等于60分的为分的为D等,其余为等,其余为E等。等。第38页程序清单:程序清单: # include int main() float score; int grade; scanf(“%f”, &score); grade =(int)()(score/10); switch(grade) case 0:
29、case 1:case 2: case 3: case 4: case 5:printf(“E n”););break; case 6:printf(“Dn”););break; case 7:printf(“Cn”););break; case 8:printf(“Bn”););break; case 9: case 10:printf(“An”);); return 0; 第39页第二种方法第二种方法:l上面的上面的switch语句,可以用下面比较简洁语句,可以用下面比较简洁的形式替换:的形式替换: switch(grade) case 10: case 9: printf(“An”);b
30、reak; case 8: printf(“Bn”);break; case 7: printf(“Cn”);break; case 6: printf(“Dn”);break; default: printf(“E n”); 第40页例例4.10求求ax2+bx+c=0方程的解。方程的解。l对于对于ax2+bx+c=0方程(方程(a不等于不等于0),),应该有以下几种可能:应该有以下几种可能: (1)b2-4ac=0, 有两个相等实根。有两个相等实根。 (2)b2-4ac0, 有两个不相等实根。有两个不相等实根。 (3)b2-4ac0, 有两个共轭复根。有两个共轭复根。程序中将程序中将d=0
31、(即(即b*b-4*a*c=0)用)用fabs(d)=1e-6代替,函代替,函数数fabs(d)的值是的值是d的绝对值。的绝对值。这是由于这是由于d是实型的,在计算和存储时会有一些误差,如果直是实型的,在计算和存储时会有一些误差,如果直接使用接使用“if (d=0)”进行判断,可能由于误差的存在,使本来进行判断,可能由于误差的存在,使本来应该条件为应该条件为“真真”的情况出现偏差。的情况出现偏差。因此用因此用“if (fabs(d)=1e-6)”代替代替“if (d=0)”,1e-6是一个很是一个很小的正数,如果小的正数,如果(fabs(d)=1e-6)成立,就认为成立,就认为(d=0) 成立
32、。成立。 第41页程序清单程序清单#include #include int main( ) float a,b,c,d,x1,x2,p,q; scanf(%f%f%f,&a,&b,&c); d=b*b-4*a*c; if (fabs(d)1e-6) x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf(有两个不相等的实根:有两个不相等的实根:%f 和和 %fn, x1, x2); else p=-b/(2*a); q=sqrt(-d)/(2*a); printf(有两个共轭复根有两个共轭复根n); printf(%8.4f+%8.4fin,p,
33、q); printf(%8.4f-%8.4fin,p,q); return 0;第42页例例4.11企业发放的奖金根据利润企业发放的奖金根据利润i提成提成。利润利润i100000时,奖金可提时,奖金可提10%;当当100000i=200000时,其中时,其中10万元按万元按10%提成,高提成,高于于10万元的部分,可提成万元的部分,可提成7.5%;当当200000 i=400000时,其中时,其中20万元仍按上述办法提万元仍按上述办法提成(下同),高于成(下同),高于20万元的部分按万元的部分按5%提成;提成;当当400000i=600000,高于,高于40万元的部分按万元的部分按3%提成;提
34、成;当当600000 i1000000时,高于时,高于100万元的部分按万元的部分按1%提成。提成。从键盘输入当月利润从键盘输入当月利润i,求应发放奖金总数。,求应发放奖金总数。第43页方法一:用方法一:用if语句编程序语句编程序 # include int main() long i; float bonus,bon1,bon2,bon4,bon6,bon10; bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; prin
35、tf(Input I:); scanf(%ld,&i); if(i=100000) bonus=i*0.1; else if(i=200000) bonus=bon1+(i-100000)*0.075; else if(i=400000) bonus=bon2+(i-200000)*0.05; else if(i=600000) bonus=bon4+(i-400000)*0.03; else if(i=1000000) bonus=bon6+(i-600000)*0.015; else bonus=bon10+(i-1000000)*0.01; printf(the bonus is %fn
36、,bonus); return 0; 第44页方法二:用方法二:用switch语句编程序语句编程序l# include lint main()llong i; int c; float bonus,bon1,bon2,bon4,bon6,bon10;l bon1=100000*0.1; bon2=bon1+100000*0.075; bon4=bon2+200000*0.05; l bon6=bon4+200000*0.03; bon10=bon6+400000*0.015; printf(Input i:);l scanf(%ld,&i); c=i/100000; if(c10) c=10;
37、l switch(c)l case 0: bonus=i*0.1;break;l case 1: bonus=bon1+(i-100000)*0.075;break;l case 2: case 3: bonus=bon2+(i-200000)*0.05;break;l case 4: case 5: bonus=bon4+(i-400000)*0.03;break;l case 6: case 7: case 8: case 9: bonus=bon6+(i-600000)*0.015;break;l case 10:bonus=bon10+(i-1000000)*0.01;l l printf(the bonus is %fn,bonus); return 0;l第45页4.7 本章小结本章小结 l本章首先介绍条件表达式和逻辑表达式。本章首先介绍条件表达式和逻辑表达式。l然后介绍了选择结构的基本语句然后介绍了选择结构的基本语句If语句及其语句及其三种形式。三种形式。l然后介绍了然后介绍了switch语句语句,介绍了介绍了 if语句和语句和switch语句的嵌套使用。语句的嵌套使用。l最后举例说明如何使用选择结构设计程序。最后举例说明如何使用选择结构设计程序。
限制150内