收藏 分享(赏)

北京科技大学 《C语言》 第4章.ppt

上传人:weiwoduzun 文档编号:5619841 上传时间:2019-03-10 格式:PPT 页数:52 大小:1.18MB
下载 相关 举报
北京科技大学 《C语言》 第4章.ppt_第1页
第1页 / 共52页
北京科技大学 《C语言》 第4章.ppt_第2页
第2页 / 共52页
北京科技大学 《C语言》 第4章.ppt_第3页
第3页 / 共52页
北京科技大学 《C语言》 第4章.ppt_第4页
第4页 / 共52页
北京科技大学 《C语言》 第4章.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

1、第4章 选择结构程序设计,北京科技大学 计算机系,C 语言程序设计,2,2019/2/5,2,提出问题:,自然语言:如果 那么否则 C语言:分支语句,?,问题1: 如何根据收入,确定他的纳税比例及纳税额?,?,问题2 如何根据学生的分数判断是否及格?,3,2019/2/5,3,本章主要内容,4.0 关系、逻辑与条件运算符 4.1 if语句 4.1.1 if语句的一般形式 4.1.2 if语句的嵌套 4.2 switch语句 4.2.1 switch语句的一般形式 4.2.2 break语句 4.3 选择结构程序设计举例,4,4,关系运算,关系运算符 (左结合) = =c 等价于 a = ( b

2、=c )与 (a=b)=c 不等价,5,5,关系运算说明:,关系运算的结果应该是逻辑值。C语言用数值用 1 表示逻辑真, 0 表示逻辑假 例如: 75 的值是 1,57 的值是 0ab的值是 0, ab 的值是1 即关系表达式的值:0 或1 实型数可进行大于或小于比较,但通常不进行 = 或 != 的关系运算,6,关系运算,关系运算符优先于赋值,低于算术 int a=3, b=2, c=1;a=cf=abc 两边操作数的数据类型不同时,系统自动将它们转换成相同的数据类型 左结合性,注意与数学式的区别0 0 & x6,6,7,7,逻辑运算符,逻辑运算符 & | ! 逻辑运算符的运算规则,8,8,逻

3、辑表达式,逻辑表达式 用逻辑运算符将运算对象连接成的式子 形式:例如:0&b a &b | c&d a | b-5 | c/4 !x+y = z,9,9,逻辑表达式,逻辑运算符的优先级 和结合性: !是单目运算符,右结合,高于算术 & 和 | 是双目运算符,左结合,高于赋值运算符,低于关系运算符 & 的优先级高于 |例如:a + b & c d! a + b = c,10,10,逻辑运算规则,逻辑表达式的运算规则: 从左到右依次进行逻辑计算 运算对象为非0表示逻辑真 运算对象为0表示逻辑假 逻辑运算的结果为 0 或 1 例如设:a=15,b=0,c=-2a & b & c 结果为0a | b

4、| c 结果为1(a+c) | b & c 结果为1,11,11,逻辑运算规则(续),运算按照从左至右的顺序进行,一旦能够确定逻辑表达式的值,就立即结束运算 逻辑运算的短路性质 例如设:a=1,b=0,c=-2 a & b & c,(a+) | + b& -c,为 0,运算终止,表达式值为 0,为非0,运算终止,表达式值为 1 且a为2,b为0,c为-2 (b,c保持原值),12,逻辑表达式,例: x=1;y=1;z=0; x = x | y ,12,k,x,y,z = 1, 0, 5, 5,13,13,关系与逻辑运算符的应用,表示数学公式abc 判断a, b, c三条线段能否组成一个三角形

5、a, b不同时为负 作业,14,14,条件表达式运算,条件运算符:? : 条件表达式的一般形式表达式1 ? 表达式2 : 表达式3 例如:m=10 & b20 ? a : bx= 3+a5 ? 100 : 200,C语言中唯一的三目运算符,要正确区分用 ?和 :分隔的表达式 涉及条件运算符的优先级与结合性,15,条件表达式运算,条件表达式的值:表达式1 ? 表达式2 : 表达式3 表达式1的值非0,则计算表达式2的值作为整个表达式的值; 表达式1的值为0,则计算表达式3的值作为整个表达式的值; 表达式2和3的类型不一致时,结果为精度较高的类型。如:mn ? 2 : 2.5,15,16,16,条

6、件运算符优先级,条件运算符优先级高于赋值、逗号运算符,低于其他运算符 例如: m=10 & b20 ? a : b x=3+a5 ? 100 : 200,等价于:(mn) ?(x) :(a+3),等价于:(a+=10 & b20) ? a : b,等价于:x= ( 3+a5 ) ? 100 : 200 ),17,17,条件运算符的结合性,条件运算符具有右结合性 当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。,例如:wx ? x+w : xy ? x : y 与 wx ? x+w : ( xy ? x : y) 等价与

7、 (wx ? x+w : xy) ? x : y 不等价,18,2019/2/5,18,本章主要内容,4.0 关系、逻辑与条件运算符 4.1 if语句 4.1.1 if语句的一般形式 4.1.2 if语句的嵌套 4.2 switch语句 4.2.1 switch语句的一般形式 4.2.2 break语句 4.3 选择结构程序设计举例,19,2019/2/5,19,简单分支语句,语句一般格式if (表达式) 语句,功能: 计算表达式的值,如果是一个非0值(即逻辑真),就执行内嵌语句,否则(即逻辑假)跳过内嵌语句,顺序执行后续语句。,20,2019/2/5,20,简单分支语句的算法:,例如: if

8、 (x0) m+; if ( ab ) c=a; a=b; b=c; ,21,2019/2/5,21,双重分支语句,语句一般格式 if (表达式) 语句1 else 语句2 功能: 计算表达式的值,如果它的值是一个非0值(逻辑真),就执行内嵌语句1,之后跳过内嵌语句2,执行后续语句;否则跳过内嵌语句1,执行内嵌语句2,之后执行后续语句。,22,2019/2/5,22,双重分支语句的算法:,例如: if (x0) m+; else m-; if ( ch= a ,23,2019/2/5,23,多重分支语句,语句一般格式 if (表达式1) 语句1 else if (表达式2) 语句2 else

9、if (表达式m) 语句m else 语句 n 功能: 依次计算并判断表达式i,为非0时执行后面的语句,都为0时,执行语句n 无论执行完那个语句分支,都转到后续语句,24,2019/2/5,24,多重分支语句的算法,流程图,表达式m ?,25,2019/2/5,25,多重分支语句的算法,N-S结构图,例如: if (a0) x= -1 ; else if (a=0 ) x= 0 ; else x=1 ;,26,2019/2/5,26,if语句的简单应用,【例4.1】输入一个字符,如果是大写字母,则将其转换为小写字母输出,否则直接输出。,输入:用 getchar 或 scnaf 函数 ch是否为

10、大写字母: ch=A & ch=65 & ch = 90) 大写字母转换为小写字母: ch=ch+32 输出:用 putchar 或 printf 函数,思路:,27,2019/2/5,27,程序:,#include “stdio.h“ main( ) char ch;ch=getchar( );if (ch=A ,程序运行情况如下: G g,运行jc4_1,可使用条件表达式代替,putchar(ch=A putchar ( n),28,2019/2/5,28,4.1.2 if语句的嵌套,如果if的内嵌语句中又使用了一个if语句,则构成if语句的嵌套。,【例4.a】比较两个整数的关系。 #in

11、clude main( ) int x, y;printf (“Enter integer X and Y:“);scanf (“%d%d“, ,应该正确判断: if的内嵌语句 if和else的配对,运行jc4_a,if ( x != y )if ( x y ) printf (“XYn“);else printf (“XYn“);else printf (“X=Yn“);,提倡缩格书写 有利于阅读程序,29,2019/2/5,29,双重(或多重)分支if语句的嵌套形式 if (表达式) if 语句 else if 语句,if语句嵌套的形式,简单if语句的嵌套形式 if (表达式) if 语句

12、,可以是各种形式的if语句,可以是各种形式的if语句,如果是简单if语句, 必须用“ ”括起,30,2019/2/5,30, if (c=50) printf(“50150n“); if (c=50) printf(“50=c=100n“); else printf(“c50n“);,例如:, if (c=50) printf(“50=c=100n“);,与哪个if 配对?,31,2019/2/5,31,再例如:,if(ab) /*1 */ if(ac) /*2 */ if(ad) flag=1; /*3 */ else flag=2; /*4 */ else flag=3; /*5 */,问

13、题:第4 行和第5 行的 else 和哪一个 if 相匹配? 分析:匹配方案可以有很多种:(2-4,1-5)、(3-4, 2-5),(1-4,),匹配规则:在嵌套的ifelse语句中,else总是与上面的、离它最近的、在同一复合语句中还没有配对的if配对。,32,2019/2/5,32,等价于:, if (ab)if (ac)if (ad) flag=1;else flag=2;else flag=3;, if (ab) if (ac)if (ad) flag=1;else flag=2; else flag=3;,flag=3的条件:,flag=3 的条件:,当 cab 时,当 a b 时,

14、33,2019/2/5,33,举例,【例4.4】输入一个数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为5的倍数。,x%2等于0?,x%5等于0?,34,2019/2/5,34,程序:,main( ) int x;scanf (“%d“, ,等价于 if(x%2),等价于 if(!(x%5),35,2019/2/5,35,学习if语句的难点,正确用表达式描述条件 例如:当x大于5小于10时令x自增if ( 5x10 ) x+;,if else 语句的配对 正确判断内嵌语句 例如:if(xy)x=x+3; y=y-2;elsex=x-3; y=y+2;,if (x5 , , ,36,20

15、19/2/5,36,熟悉常用的if 表达式形式,例如有定义:int a,b=0; a等于什么值时,执行b=2 ;语句? if (a=0) b=2; if (a=1) b=2; if (a!=0) b=2; if (a=1) b=2; if (a=0) b=2; if (a) b=2; if (!a) b=2;,等价于if (a!=0) b=2;,等价于if (a=0) b=2;,37,2019/2/5,37,38,2019/2/5,38,4.2 switch语句,switch语句的一般形式 switch (表达式) case 常量表达式1: 语句序列1case 常量表达式2: 语句序列2cas

16、e 常量表达式n: 语句序列ndefault : 语句序列n+1 功能: 计算表达式的值,与常量表达式的值比较,等于第i个值时,顺序执行语句序列i、i+1、 、 n+1 若与所有常量表达式值都不相等,执行语句序列n+1。,39,2019/2/5,39,switch语句的算法描述,N-S结构图,例如: switch (a) case 5: printf(“,当a等于5,输出:&#$ 当a等于2,输出:#$ 当a是其他值,输出:$,40,2019/2/5,40,说明:,“case 常量表达式i:”等价于语句标号,计算出的表达式值等于哪个语句标号,就从哪个位置开始顺序向下执行语句序列。 语句位置影响

17、运行结果,例如: switch (a) case 2: printf(“#“);default: printf(“$“);case 5: printf(“ ,当a等于2,输出: #$& 当a是其他值,输出:$& 当a等于5,输出: &,switch与break语句结合才能实现 程序的分支,break; break; break;,41,break语句,形式:break; 功能:终止switch语句/循环语句的执行,继续执行switch语句/循环语句后面的语句 break语句可以改变case的语句标号作用,终止后续case语句序列的执行。switch语句和break语句结合,可以实现程序的选择控

18、制(break语句还可以在循环语句中使用),2019/2/5,41,42,2019/2/5,42,switch语句的简单应用,【例4.3】已知x=100,y=15,要求输入一个算术运算符(+、-、* 或 / ),并对x和y进行指定的算术运算。,思路: 设x和y为float型变量并赋初值; 输入的运算符op为char型变量; 根据op的值(为+、-、*、/)进行x和y的相加、相减、相乘、相除运算(选择分支); 还要考虑到输入字符不是+、-、* 或 / 时的情况,43,2019/2/5,43,程序:,#include “stdio.h“ main( ) float x=100,y=15,z; ch

19、ar op;op=getchar( );switch (op) case +: z=x+y; break;case -: z=x-y; break;case *: z=x*y; break;case /: z=x/y; break;default: z=0;if(int)z!=0) printf(“%f%c%f=%fn“,x,op,y,z);else printf (“%c is not an operatorn“,op); ,运行jc4_3,实型数通常不使用z=0或z!=0的比较 可用if(int)z) 代替,44,2019/2/5,44,注意:,switch语句的书写格式:语句体本身必须用

20、花括号括起;case和default后面如果有多条语句,则可以不必使用花括号;case和常量表达式之间必须有空格;default可以写在语句体的任何位置,也可以省略不写 允许switch嵌套使用,但同一个switch语句中,任意两个case的常量表达式值不能相同。,45,2019/2/5,45,4.3 选择结构程序设计举例,【例4.6】求一元二次方程ax2+bx+c=0的根。,思路:一元二次方程的根取决于系数a,b,c求根公式:,判别式d = b2- 4ac 当 d = 0时,方程有两个相等的实根: x1=x2=-b/(2*a) 当d 0时,方程有两个不相等的实根: x1=(-b+sqrt(d

21、)/(2*a) x2=(-b-sqrt(d)/(2*a) 当d 0时,方程有两个虚根: x1=jp+ipi x2=jp-ipi,实部 jp=-b/(2*a) 虚部 ip=sqrt(-d)/(2*a),46,2019/2/5,46,算法:,ax2+bx+c=0,47,2019/2/5,47,程序:,#include “math.h“ main( ) float a,b,c,d,x1,x2,lp,ip;scanf(“%f%f%f“, ,48,2019/2/5,48,程序(续):,else if (d1e-6) /* 不相等的实根 */ x1=(-b+sqrt(d)/(2*a); x2=(-b-sq

22、rt(d)/(2*a);printf(“has two real roots:n“) ;printf(“x1=%8.4f, x2=%8.4fn“,x1,x2);else /* 虚根 */ lp=-b/(2*a);ip=sqrt(-d)/(2*a);printf(“has two complex roots: n“);printf(“x1=%8.4f+%8.4fin“,lp,ip);printf(“x2=%8.4f-%8.4fin“,lp,ip);,运行jc4_6,49,2019/2/5,49,举例(续):,【例4.b】输入年份,判别该年是否为闰年。,思路:年份year为闰年的条件为 能够被4整

23、除,但不能被100整除的年份; 能够被400整除的年份。 只要满足任意一个就可以确定它是闰年。 例如: 1996年、2000年是闰年 1998年、1900年不是闰年,设定标志变量leap,只要符合其中一个条件的就是闰年,令 leap =1;否则令 leap=0,50,2019/2/5,50,算法:,year%4=0 & year%100 !=0,51,2019/2/5,51,程序:,main( ) int year, leap ;scanf(“%d“, ,运行jc4_b,52,总结: 运算符 if语句 if语句的形式:简单 双重分支 多重分支 if语句的嵌套 switch语句 switch语句的形式 break语句,2019/2/5,52,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报