收藏 分享(赏)

第4章选择结构程序设计.ppt

上传人:myk79025 文档编号:9658536 上传时间:2019-08-21 格式:PPT 页数:50 大小:299KB
下载 相关 举报
第4章选择结构程序设计.ppt_第1页
第1页 / 共50页
第4章选择结构程序设计.ppt_第2页
第2页 / 共50页
第4章选择结构程序设计.ppt_第3页
第3页 / 共50页
第4章选择结构程序设计.ppt_第4页
第4页 / 共50页
第4章选择结构程序设计.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

1、第四章 选择(分支)结构程序设计,一、关系运算符与关系表达式 二、逻辑运算符与逻辑表达式 三、条件运算符和条件表达式 四、if语句 五、if语句的嵌套 六、多分支结构switch语句 综合实例,引例ch4_001 :输入两个数,计算它们的商并输出.,#include void main() float a,b,div;scanf(“%f%f“, ,当输入0到变量b中时,会导致除数为0!可见,程序中需要对变量b的值进行判断,如果为0,给出错误提示。,修改程序如下:,#include void main() float a,b,div;scanf(“%f%f“, ,C语言中一般采用关系表达式和逻辑

2、表达式来描述判断条件,程序中的运算,运算符与表达式 1. 算术运算符 2. 赋值运算符 3 .关系运算符 4 .逻辑运算符 5. 条件运算符 6 .逗号运算符,关系运算符,关系运算符,=,=,=,!= 优先级:右图所示 结合方向 :从左到右 运算结果:逻辑值“真” 或“假”C语言中用1代表真,0代表假,例 int a=3,b=2,c=1,d,f;ab (ab)=cb+cbf=abc,/1,/1,/0,/d=1,/f=0,关系运算符,例 若a=-5; b=0; x=-3;则 a=x=b的值为,0,例 5278,值为0,例 int i=1, j=7,a; a=i+(j%4!=0); 则a=,2,例

3、 a0 结果为A100 结果为,1,0,例 若x=3,则0=x=2的值为多少?,1,多种运算符的混合计算,int a=3,b=2,c=1,d; 如何求表达式d=a-1bc的值?该表达式包括赋值、关系、算术三种运算符,其中,算术运算的优先级最高,其次为关系运算符,最后是赋值运算符,因此,计算过程如下: (1)进行算术运算,得到d=2bc。 (2) 进行关系运算,求2bc。根据结合方向按左到右的顺序进行计算,即先计算2b,其值为0,再计算0c,其值为0。关系运算结束后,得到d=0。 (3) 进行赋值运算,将0赋给d。,运算符与表达式,运算符与表达式 1. 算术运算符 2. 赋值运算符 3 .关系运

4、算符 4 .逻辑运算符 5. 条件运算符 6 .逗号运算符,有些情况下,只用关系表达式并不能完整地描述一个判断条件。 例ch4_002 ,要判断变量choice的值是否在区间1,12内,能否直接写成if( 1 void main() int choice=20;if(1=choice=12)printf(“choice落在区间1,12内n“);elseprintf(“choice没落在区间1,12内n“); 程序运行结果如下: choice落在区间1,12内 运行结果错误!,如何正确表示变量choice的值是在区间1,12内? 正确的表示方法如下: choice=1 & choice=12,逻

5、辑运算符,! (单目运算符) & |(双目运算符) 优先级:右图所示 结合方向 :右图所示,高,低,运算结果: 真或假,值为1或0 C语言中用1表示“真”,用0表示“假”,逻辑运算符,练习: a=4;b=5;!aa&ba|b!a|b4&0|253&2|84-!0c&d,结果为真,值为1,结果为假,值为0,结果为真,值为1,结果为真,值为1,结果为真,值为1,结果为真,值为1,结果为真,值为1,操作数:0表示“假”,非0表示“真”,逻辑表达式中,操作数不是逻辑量(即“真”或“假”),如何处理呢?,在一个“&”表达式中,若“&”的左端为0,则不必计算右端,该表达式的值肯定为0. 在一个“|”表达式

6、中,若“|”的左端为1,则不必计算右端,该表达式的值肯定为1. 短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符.,/结果为0,b的值仍然为10,例(ch4_003) a=0;b=10; a&(b=100),逻辑运算符,1. 逻辑运算符两侧运算对象的数据类型( ) A)只能是0或1 B)只能是0或非0正数 C)只能是整型或字符型数据 D)可以是任何类型的数据 2. 下列运算符优先级关系正确的是( ) A) “!”“&”“/”“=” B) “!”“/”“=”“&” C) “!”“/”“&”“=” D) “/” “!”“&

7、”“=” 3. 能表达关系x=A)& (ch =A)& (ch =ch)5. 将数学式ab或ac改写成C语言的表达式_。 6. 20x30或x-100的 C语言的表达式_。,运算符与表达式,运算符与表达式 1. 算术运算符 2. 赋值运算符 3 .关系运算符 4 .逻辑运算符 5. 条件运算符 6 .逗号运算符,条件运算符三目运算符,5. 条件运算符 expr1 ? expr2 : expr3 规则:如果expr1为真(或expr1的值非0) ,则表达式的值为expr2,否则表达式的值为expr3.结合方向:从右到左 思考;如何求|b|,main() int a,b,c;a=3;b=4;c=(

8、ab)?a:b;printf(“%dn“,c);,C=4,求 |b|printf(“|b|=%dn”,b=0? b:-b);,条件运算符的优先级高于赋值运算符,三种控制结构,顺序结构 选择结构 if条件语句和switch语句 循环结构,选择结构,例ch4_004:求两数中的较大数。 #include void main() int a,b,max;printf(“PLease input 2 numbers:“);scanf(“%d%d“, ,max=a; if (bmax) max=b;,max=(ab)?a:b;,选择结构单分支if语句、双分支if语句,if (条件e)语句序列1 else

9、 语句序列2,If (条件e)语句序列,单分支if结构,如右所示:,条件e通常是关系表达式或逻辑表达式,也可以是数值表达式。如果数值表达式的值为非0,则表示条件成立,执行语句序列1 ;如果数值表达式的值为0,表示条件不成立,执行语句序列2 ;,条件e成立(为真),执行语句序列;条件e不成立(为假)时,跳过语句系列,继续执行其后面的语句。,与单分支if语句不同,双分支if-else语句不但指定了条件为真时需要执行的语句,还指定了条件为假时要执行的语句。,如:if (a=b,说明: if后面的表达式e必须有括号,if(x) if(x!=0) /x的值非0,条件成立if(!x) if(x=0) /!

10、x的值非0,条件成立 C语言中,要注意区分“=”和“=” 区分if(x=5) 与 if(x=5) 的不同之处 条件满足或不满足所执行的语句如果超过一条,则应该用花括号括起来,构成复合语句,例 考虑下面程序的输出结果: if(xy)x=0; y=1; elsex+; y+;,Compile Error!,Ns流程图,输入A,B,C,AB?,是,否,MAX=A,MAX=B,输出MAX,CMAX?,是,MAX=C,例ch4_005:求三个数中的最大数。算法1如下:,选择结构,求三数中的最大数。程序如下: main() int a,b,c,max;scanf(“%d%d%d“, ,max=a ; if

11、 (bmax) max=b;if (cmax) max=c;,选择结构,选择结构,算法2:求三数中的最大数。 算法描述 S1:令max等于第一个数; S2:将max与第 2个数进行比较,若后者大于MAX,将max修正为第 2个数; S3:将max与第 3个数进行比较,若后者大于MAX,将max修正为第 3个数; S4:结束,选择结构单分支if结构,例CH4_006:将两个数由小到大排序。a放较小数,b放较大数 算法描述:如果ab,则交换a和b的值 ; if (ab) c=a; a=b; b=c;,将a、b、c三个数由小到大排序,算法描述 如果ab,则交换a和b的值,使a为a,b间的较小数; 如

12、果ac, 则交换a和c的值,使a为最小数 ; 如果bc,则交换b和c的值,则c中为最大数。,双分支if语句,例CH4_007从键盘输入一个年份,判断该年是否为闰年,并输出结论。判断闰年的条件是符合下面二个条件之一: 能被4整除,但不能被100整除; 能被400整除。采用双分支if语句解决该问题,程序代码如下:,#include void main(void)int year;printf (“请输入年份:“);scanf(“%d“, ,“%”是 “求余”算术运算符,如果两数相除的余数为0,则说明这两数能整除。,多分支条件语句,单分支和双分支条件语句都只进行一次条件判断,然后根据判断结果来决定程

13、序的执行流程,但有些问题需要进行一连串的判断,满足不同的条件就执行不同的操作。这时就需要用到多分支条件语句。 其语法格式如下: if(条件1)语句1; else if(条件2) 如计算分段函数语句2; else if(条件n)语句n; else语句n+1;,例CH4_008某商场实行打折促销活动,折扣率根据客户购买商品的金额来定,两者的对应关系如下表所示。编写一个程序,从键盘输入客户购买商品的金额后,自动计算出购买商品的金额和应付金额。,程序代码如下:,#include void main() double cost,cost1; /分别表示购买金额和应付金额printf(“请输入购买商品的金

14、额:“); /屏幕提示信息scanf(“%lf“, ,多分支if语句,可以看出,if-else if语句是通过一连串的判断来寻找问题的解。它列出了一系列操作,每一种操作都是在相应的条件下才能执行。该语句开始执行后,依次对各个条件进行测试,一旦符合某一条件,就转去执行该条件下的操作,而其它部分将被跳过;如果没有一个条件满足,就执行最后一个else所指定的操作,这个else可以看作“其它”。如果没有一个条件满足,且最后一个else不存在,则该if-else if结构将不执行任何操作。,多分支if 语句,例CH4_009根据成绩输出评价,5. 给一个不多于4位的正整数,要求:(1)求出它是几位数(2

15、)逆序输出各位数字,如原数为4321,应输出1234,if 语句的嵌套形式,if (条件e1)if (条件e2)else else,if (条件e1) elseif (条件e2)else,if (条件e1) else if (条件e2) else,等价,多分支if语句,例CH4_010 : 判断输入的3位自然数是否为水仙花数。所谓“水仙花数”是指满足各个位上的数的立方和等于自身这样条件的3位自然数。例如:153=13+53+33思路:1)变量的定义:因为在判断“水仙花数”的条件时需求各个位上的数的立方和,因此需要定义三个变量分别存放百位、十位、个位上的数字,所以需定义四个变量x、a、b、c,均

16、定义成整型。2)输入:输入x。,if 语句的嵌套,if 语句的嵌套,3)计算:第一步:先判断输入x的是否是一个三位数。第二步:如果x是一个三位数,先根据x分别求出a、b、ca=x/100,b=x/10%10, c=x%10然后判断: 如果x等于a3+b3+c3,则输出“x是一个水仙花数”;否则输出“x不是一个水仙花数”。,if 语句的嵌套,CH4_010程序如下: #include main( ) int x,a,b,c; scanf(“%d“, ,if 语句的嵌套,例CH4_011已知男性60岁退休。女性55岁退休,输入一个人的年龄和性别,判断是退休还是在工作,并输出结果。输入性别时,F或f

17、时表示女性,M或m时表示男性。 编程思路: (1)年龄定义为整型数据,性别定义为字符型数据。 (2)先根据性别对if语句进行分支。 (3)在女性分支里,再嵌套一个if语句,判断年龄是否大于55。 (4)在男性分支里,再嵌套一个if语句,判断年龄是否大于60。,程序代码如下: #include void main() int age; /变量age表示年龄char sex; /变量sex表示性别printf(“请输入性别和年龄(F(f)/M(m)):“);scanf(“%c%d“, ,书写时采用缩进格式,将配对的if-else的位置对齐,可以提高程序的可读性。,if 语句的嵌套形式,当程序中存在

18、嵌套的if .else结构时,由后向前使每个else与其前面的最靠近它的if配对。若一个else的上面又有一个未经配对的else,则先处理内层(上面)的else的配对。,若分支较多,则嵌套的if 语句层次多,程序冗长而且降低可读性。 多分支结构:switch结构(并不能完全取代多分支if语句,多分支结构 switch语句,switch(表达式) case 常量表达式1:语句组1;(break;)case 常量表达式2:语句组n;(break;)case 常量表达式n:语句组n;(break;) Default:语句组n+1;(break;) ,Switch后面括号内的表达式的值类型应为整数类型

19、包括字符型; 每一个case常量必须互不相同 case标号只起标记的作用,根据表达式的值找到匹配的入口标号,并不在此进行条件检查 执行一个case子句后,应当用break语句使流程跳出switch结构。,从键盘输入一个算术运算式,输出计算结果,算术运算式的格式如下:a op b,其中,a、b为两个整数,op为算术运算符,包括:+、-、*、/、%。 算法分析: a、b定义为整型数据, op为字符型数据 进行何种算术运算,由算术运算符op的值确定,即从+、-、*、/、% 5种运算中选择一种,因而属于多分支选择问题,采用switch语句实现。,为了避免除0错误,提高程序的健壮性,该程序应作何修改?,

20、程序代码如下: #include void main() int a,b;char op;printf(“请输入算术运算式:“);scanf(“%d%c%d“, ,可将“/”和“%”这两个分支中的执行语句改为if语句,以便对输入的数据进行检测,检测合法再计算,否则给出错误提示。修改后的部分程序代码如下: case /:if(b=0) printf(“被0除错误!n“);elseprintf(“结果为:%dn“,a/b);break; case %:if(b=0) printf(“被0除错误!n“);elseprintf(“结果为:%dn“,a%b);break;,1. 以下程序运行后的输出结果

21、是: void main() int a=1,b=3,c=5;if(c=a+b) printf(“yesn“);else printf(“non“); 2. 有以下程序 main() int i=1,j=2,k=3; if(i+=1 程序运行后的输出结果是_。,yes,2 3 3,3. 以下程序运行后的输出结果是_。 void main() int n=0,m=1,x=2; if(!n) x=-1; if(m) x=x-2; if(x) x=-3; printf(“%dn“,x); 4. 以下程序运行后的输出结果是_。void main() char n=c; switch(n+) defau

22、lt:printf(“error“);break; case a: case b:printf(“good“);break; case c:printf(“pass“); case d:printf(“warn“); ,1. A为奇数时表达式的值为真,否则为假,不能满足此要求的表达式是( ) A) A%2=1 B) !( A%2=0) C) !(A%2) D) A%2 【答案】C 2. 以下四个选项中,不能看作一条语句的是( ) A) ; B) a=0,b=0,c=0; C) if(a0); D)if(b=0) m=1;n=2; 【答案】D 3设有:int a=0,b=5;可执行x+的语句是(

23、 ) A) if(a) x+; B)if(a=b) x+; C) if(a=y)z=x; x=y; y=z; A) x=10,y=20,z=30 B) x=20,y=30,z=30 C) x=20,y=30,z=10 D) x=20,y=30,z=20 【答案】B,5. 以下不正确的语句为( ) A) if(xy); B) if(x=y) 【答案】C,8下列程序段运行后,x的值是( ) int a,b,c,x ; a=b=c=0 ; x=35 ; if( !a) x- ; else if(b); if(c) x=3; else x=4; A) 3 B) 4 C) 34 D) 35 【答案】B

24、9. 下面程序的输出结果是( ) void main() int c,x=1,y=1; c=x+|y+ ; printf(“n%d %d %d n“,x,y,c); A) 1 1 0 B) 2 1 1 C)0 1 1 D) 0 0 1 【答案】B 10. 若w=1,x=2,y=3,z=4,则条件表达式wx?w:yz?y:z的值是( ) A) 4 B) 3 C) 2 D) 1 【答案】B,11. 以下关于switch语句的叙述中,错误的是( ) A) switch语句允许嵌套使用 B) 语句中必须有default部分,才能构成完整的switch语句 C) 语句中各case与后面的常量表达式之间必

25、须有空格 D) 只有与break语句结合使用,switch语句才能实现程序的选择控制 【答案】B 12. 有以下程序,其中k的初值为八进制数void main() int k=011;printf(“%dn“,k+);程序运行后的输出结果是( )A)12 B)11 C)10 D)9 【答案】D 13. 若有定义语句:int a=3,b=2,c=1;,以下选项中错误的赋值表达式是( ) A) a=(b=4)=3; B) a=b=c+1; C) a=(b=4)+c; D) a=1+(b=c=4) 【答案】A,14. 已知int x=(1,2,3,4);变量x的值是( ) A) 1 B) 2 C)

26、3 D) 4 【答案】D 15. 已知int x=5,y=5,z=5;执行语句x%=y+z;后,x的值是( ) A) 0 B) 1 C) 5 D) 6 【答案】C 16. 若a是数值类型,则逻辑表达式(a=1)|(a!=1)的值是( )A) 1 B) 0 C) 2 D) 不知道a的值,不能确定 【解析】a无论取何值,表达式a=1和a!=1总有一个的值为真(用1表示),因此选A。 【答案】A 17. 若变量均已正确定义且赋值,以下合法的C语言赋值语句是( ) A) x=y=5; B) x=n%2.5; C) x+n=i; D) x=5=4+1; 【答案】 A 18. 逗号表达式“(a=3*5,a

27、*4),a+15”的值是( ) A) 15 B) 60 C) 30 D) 不确定 【答案】C,控制结构选择结构,按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为7084分,C等为6069分,D等为60分以下。成绩的等级由键盘输入,若成绩等级输入错误,则程序输出错误提示。 联想猜词游戏:有6个表示6门课程名的单词c、cobol、basic、bcdl、ada、algol,请你任意输入前2个字母后,即可猜出你所要输入的课程名。 已知银行整存整取存款不同期限的月息利率分别为0.315%(期限一年); 0.330%(期限二年); 0.345%(期限三年); 0.375%(期限五年); 0.420%(期限八年),编写一程序,要求输入存款的本金和期限,计算到期时从银行得到的利息与本金的合计。,

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

当前位置:首页 > 企业管理 > 管理学资料

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


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

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

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