资源预览内容
第1页 / 共38页
第2页 / 共38页
第3页 / 共38页
第4页 / 共38页
第5页 / 共38页
第6页 / 共38页
第7页 / 共38页
第8页 / 共38页
第9页 / 共38页
第10页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第五章 选择结构程序设计,5.1 关系运算符和关系表达式,5.3 If语句,5.2 逻辑运算符和逻辑表达式,5.4 switch语句(开关分支语句),二分支选择结构,多分支选择结构,选择结构,存在某条件P, 若P为真,则执行A, 否则执行B。,根据表达式k的值进行选择,关系运算:将两个值进行比较,判断比较的结果是否符合给定的条件(即关系运算符)。 关系运算符 种类:= != 结合方向:自左向右 优先级别:,例 ca+b /c(a+b) ab!=c /(ab)!=c a=bc /a=(bc),关系表达式的值:是逻辑值“真”或“假”,用1和0表示,例 int a=3,b=2,c=1,d,f; ab (ab)=c b+cb f=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,5.1 关系运算符和关系表达式,注意区分“=”与“=”,例 若a=0; b=0.5; x=0.3; 则 a=x=b的值为,0,例 5278在C中是允许的, 值为,0,例 int i=1, j=7,a; a=i+(j%4!=0); 则a=,2,例 a0 结果为 A100 结果为,1,0,关系运算注意(1),字符量的比较是根据ASCII值的大小,例 注意区分“=”与“=” int a=0,b=1; if(a=b) printf(“a equal to b”); else printf(“a not equal to b”);,关系运算注意(2),() 应改成 if (a=b),逻辑运算符 种类: !(逻辑非) &(逻辑与) |(逻辑或) 逻辑运算真值表,C语言中,运算量: 0表示“假”, 非0表示“真” 逻辑运算结果: 0表示“假”, 1表示“真” 只能是0或1,不可能是其他数值,5.2 逻辑运算符和逻辑表达式,例 ab&xy a=b|x=y !a|ab,优先级:,结合方向:,/ (a=x) & (x=b),/ (ab)&(xy),/ (a=b)|(x=y),/ (!a)|(ab),逻辑运算符和表达式(2),例 a=4;b=5; !a a&b a|b !a|b 4&0|2 53&2|84-!0 c&d,值为1,值为0,值为1,值为1,值为1,值为1,/ (53)&2|(8(4-(!0) 值为1,优先级:,结合方向:,逻辑运算符和表达式(3),逻辑运算符两侧的运算对象的类型还可以是字符型、实型等,系统最终以0和非0来判定“真”、“假”,短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符,例 a (m=ab)&(n=cd),/结果m=0,n=1,逻辑运算符和表达式(4),因为m=0,n=cd不被执行,所以n保持原值,练习:写出C语言的表达式,abs(x)2 或 (x2) | (x-2),x=(1+a) & (y=b),(x-1)*(x-2)=0) & (x!=0) 或(x=2) & (x!=0),if语句(条件选择语句) if语句的三种形式 形式一: 格式:if (expression) statement 执行过程:,例:if (xy) printf(“%d”,x);,形式二: 格式:if (expression) statement1 else statement2 执行过程:,例:if (xy) max=x; else max=y;,5.3 If语句,例:if (xy) x=x%2; printf(“%d“, x); ,形式三: 格式:,if ( expr1 ) statement1 else if (expr2 ) statement2 else if (expr3 ) statement3 . else statementn ,执行过程:,选择型程序设计形式,系统从上往下依次判断各个表达式的值,一旦表达式的值为真,则执行与之相关的语句,并终止整个语句序列的执行。若所有条件均不满足,则执行最后一个else语句或后续语句。,例5-5,如:if(a=b,if后面的表达式类型任意,可以是逻辑、关系,甚至是算术表达式。,语句可以是复合语句。即若语句不止一条,则必须用 括起来。 if(x) if(x!=0) if(!x) if(x=0),例 考虑下面程序的输出结果: #include void main() int x,y; scanf(“%d,%d”, ,Compile Error!,说明:,: 一般形式:,if语句嵌套在if语句中又包含一个或多个if语句,#include main() int x,y; printf(“Enter integer x,y:“); scanf(“%d,%d“, ,运行:Enter integer x,y:12,23 XY Enter integer x,y:12,12 X=Y,例 输入两数并判断其大小关系,缺省 时,else总是和它上面离它最近的未配对的if配对,if else 配对原则:,else部分不能独立存在,它必定是if语句的一部分,例: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,修改: if (a=b) if(b=c) printf(“a=b=c”); else printf(“a!=b”);,实现if else 正确配对方法:加 ,实现if else 正确配对方法,例: 有一函数:,y=,1 (x0),编一程序,输入一个x值,输出y值。,有以下几种写法,请判断哪些是正确的?,程序2:将程序1的if语句改为: /*exp52.c*/ #include main ( ) int x, y; scanf(“d“, ,程序1: /*exp51.c*/ #include main ( ) int x, y; scanf(“d“, ,程序4:将程序1的if语句改为: /*exp54.c*/ #include main() int x,y; scanf(“%d“, ,程序3:将程序1的if语句改为: /*exp53.c*/ #include main() int x,y; scanf(“%d“, ,1. 程序1 和程序2 是正确的。 它们代表的函数为:,2. 程序3 和程序4 是错误的。 它们代表的函数为:,结论:,思考练习:如何修改程序3,4使得它们结果正确?,一般形式: expr1 ? expr2 : expr3 /唯一的三目运算符 功能:先判expr1, 若非0,则值为expr2的值,否则为expr3的值 执行过程,例 求 a+|b| printf(“a+|b|=%dn”,b0?a+b:a-b);,例 (a=b)?Y:N (x%2=1)?1:0 (x=0)?x:-x (c=a & c=z)?c-a+A:c,优先级: 13,结合方向:自右向左 如 ab?a:cd?c:d ab?a:(cd?c:d),条件运算符与表达式,例 max=ab? a:b; 当ab. max a. 否则maxb,条件运算符可嵌套 如 x0?1:(x0?-1:0),1. 条件表达式不能取代一般的if语句,只有当if 的两 个分支为给同一变量赋值时才可替代if。,if (ab) printf(“%d“, a); else printf(“%d“, b);,可写成:,printf(“%d“, ab? a:b);,如:,注意:,2. expr1、expr2、expr3类型可不同,表达式值取较高的类型,#include void main ( ) char ch; scanf (“%c“, ,例 任输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。,运行结果如下: A a,例 x?a:b /若x为float,x=0.0, 表达式值为98.0; / x0.0, 表达式值为97.0 xy?1:1.5 /xy ,值为1.0; xy ,值为1.5,分析:判断一个字符ch是否为大写字母的方法: ch=A & ch =65 & ch = 90 大写字母转换为小写字母的方法: ch + 32 ch + (a-A),5.4 switch 多分支选择语句,用if或if/else或它们的嵌套也可使程序实现多路分支,但容易出现下面的问题:, 可读性差, 破坏结构,解决问题的方法:采用switch语句。,switch(表达式) case 常量表达式1: 语句体1 case 常量表达式2: 语句体2 case 常量表达式n: 语句体n default : 语句体(n+1) ,一般形式:, 若与所有常量表达式值不相等,则从default后的语句开始执行。,注:default 可有可无。,说明:,表达式可以是整型、字符型或枚举型 常量表达式的类型必须与表达式的类型一致(整型与字符型通用) 常量表达式的值必须唯一,且没有先后次序 case后可包含多个可执行语句,且不必加 常量表达式仅起语句标号作用,不作求值判断,例: 根据成绩等级打印百分数段.,switch (grade), case A: printf (“85100n“);,case B: printf (“7084n“);,case C: printf (“6069n“);,case D: printf (“60n“);,default: printf (“errorn“);,程序如下:,/*exp55.c*/ #include void main() char grade; scanf(“%c“, ,运行结果为:,A,程序运行结果不在预料之中!,产生错误的原因:常量表达式仅起语句标号作用,不作求值判断,没有完全起到分支作用。,85-100 70-84 60-69 60 Error,switch (表达式) case 常表1: 语句1; break; case 常表2 : 语句2; break; case 常表n : 语句n; break; default: 语句n+1; ,一般形式为:,解决办法: 增加break语句, 使之跳出switch结构。,修改程序为:,/*exp56.c*/ #include void main() char grade; scanf(“%c“, ,switch (grade) case A : case B: case C: printf(“60n“); break; case D: printf(“60n“); break; ,例如:,注意: 有时几种情况(即多个case)可共用一组执行语句。,思考:如何用switch语句重做例5-5(评价学生成绩),4,5,6,7: d=0.08 8,9,10,11: d=0.1,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号