C语言第四版第5章-选择结构程序设计课件_第1页
C语言第四版第5章-选择结构程序设计课件_第2页
C语言第四版第5章-选择结构程序设计课件_第3页
C语言第四版第5章-选择结构程序设计课件_第4页
C语言第四版第5章-选择结构程序设计课件_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章选择结构设计c程序设计整体概述THEFIRSTPARTOFTHEOVERALLOVERVIEW,PLEASESUMMARIZETHECONTENT第一部分主要内容关系表达式和逻辑表达式选择结构简介if

语句switch语句选择结构程序示例关系运算符种类:<<===>=>!=优先级别:结合方向:自左向右例c>a+ba>b!=ca==b<ca=b>c

关系表达式的值:是逻辑值“真”或“假”,用1和0表示例inta=3,b=2,c=1,d,f;a>b(a>b)==cb+c<ad=a>bf=a>b>c//表达式值1//表达式值1//表达式值0//d=1//f=0关系运算符和表达式<<=>>===!=优先级6(高)优先级7(低)//c>(a+b)//(a>b)!=c//a==(b<c)//a=(b>c)例若a=0;b=0.5;x=0.3;则a<=x<=b的值为0例5>2>7>8在C中是允许的,值为0例inti=1,j=7,a;a=i+(j%4!=0);则a=2例‘a’>0结果为‘A’>100结果为10关系运算注意(1)例注意区分“=”与“==”inta=0,b=1;if(a=b)printf(“aequaltob”);elseprintf(“anotequaltob”);关系运算注意(2)ab!a!ba&&ba||b真假真假假假真真逻辑运算符种类:!&&||逻辑运算真值表C语言中,运算量:0表示“假”,非0表示“真”,运算结果:“假”用0表示,“真”用1表示,真假假假假假真真假假真真真假真真逻辑运算符和表达式!(2)&&(11)||(12)高低例a<=x&&x<=ba>b&&x>ya==b||x==y!a||a>b优先级:结合方向:!:从右向左&&:从左向右||:从左向右//(a<=x)&&(x<=b)//(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)…续逻辑运算符和表达式(2)!(2)&&(11)||(12)高低优先级:结合方向:例a=4;b=5;!aa&&ba||b!a||b4&&0||25>3&&2||8<4-!0‘c’&&‘d’值为1值为0值为1值为1值为1值为1//(5>3)&&2||(8<(4-(!0)))值为1!:从右向左&&:从左向右||:从左向右…续逻辑运算符和表达式(3)优先级:结合方向:短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符例a&&b&&c//只在a为真时,才判别b的值;只在a、b都为真时,才判别c的值例a||b||c//只在a为假时,才判别b的值;只在a、b都为假时,才判别c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b)&&(n=c>d)//结果m=0,n=1…续逻辑运算符和表达式(4)!(2)&&(11)||(12)高低!:从右向左&&:从左向右||:从左向右…续逻辑运算符和表达式(4)一般形式:expr1?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句例if(a>b)printf(“%d”,a);elseprintf(“%d”,b);printf(“%d”,a>b?a:b);例求a+|b|printf(“a+|b|=%d\n”,b>0?a+b:a-b);expr1取expr2值取expr3值非0=0例(a==b)?’Y’:’N’(x%2==1)?1:0(x>=0)?x:-x(c>=‘a’&&c<=‘z’)?c-’a’+’A’:c条件运算符可嵌套如x>0?1:(x<0?-1:0)优先级:13结合方向:自右向左如a>b?a:c>d?c:d

a>b?a:(c>d?c:d)expr1、expr2、expr3类型可不同,表达式值取较高的类型例x?‘a’:‘b’//x=0,表达式值为‘b’;x‡0,表达式值为‘a’x>y?1:1.5//x>y,值为1.0;x<y,值为1.5条件运算符与表达式PAB真假PBA真假A1A2AiAnk=k2k=k1k=knk=ki......二分支选择结构多分支选择结构1选择结构简介形式一:格式:if(expression)statement执行过程exprstatement非0=0例:x=10,y=5;

if(x>y)printf(“%d”,x);printf(“%d”,y);exprstatement1statement2非0=0形式二:格式:if(expression)statement1elsestatement2执行过程:例:x=10,y=20;if(x>y)max=x;elsemax=y;printf(“%d”,max);例:if(x>y){max=x;i++;}elsemax=y;if语句if(expr1)statement1elseif(expr2)statement2elseif(expr3)statement3...[elsestatementn]expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0执行过程:

例:if(salary>1000)index=0.4;elseif(salary>800)index=0.3;elseif(salary>600)index=0.2;elseif(salary>400)index=0.1;elseindex=0;

形式三:如:if(a==b&&x==y)printf(“a=b,x=y”);if(3)printf(“OK”);if(‘a’)printf(“%d”,’a’)if(x)x++if(x!=0)x++if(!x)x++if(x==0)x++if后面的表达式类型任意,必须用()语句可以是任意语句(通常是复合语句)当if和else之间是多条语句时,使用语言的复合方式,仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)。

else子句(可选)是if语句的一部分,必须与if配对使用,不能单独使用。例考虑下面程序的输出结果:#include<stdio.h>main(){intx,y;scanf(“%d,%d”,&x,&y);if(x>y)x=y;y=x;elsex++;y++;printf(“%d,%d\n”,x,y);}CompileError!对If语句的说明例考虑下面程序的输出结果:#include<stdio.h>main(){intx,y;scanf(“%d,%d”,&x,&y);if(x>y){x=y;y=x;}else{x++;y++;}printf(“%d,%d\n”,x,y);}和VFif语句的比较语法:IF

逻辑表达式

[THEN]

程序组1

[ELSE

程序组2]

ENDIFif

分数>=90

replace

等级

with

'优'

display

elsedisplayendif例:if(x>y){max=x;i++;}elsemax=y;形式二:格式:if(expression)statement1elsestatement2一般形式:if(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4内嵌if内嵌ifif(expr1)if(expr2)statement1elsestatement2内嵌ifif(expr1)if(expr2)statement1elsestatement3

内嵌ifif(expr1)statement1elseif(expr3)statement3elsestatement4内嵌ifif语句嵌套缺省{}时,else总是和它上面离它最近的未配对的if配对if(……)if(……)if(……)else…...else…...else…...if~else配对原则例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);实现if~else正确配对方法:加{}#include<stdio.h>main(){intx,y;printf("Enterintegerx,y:");scanf("%d,%d",&x,&y);if(x!=y)if(x>y)printf("X>Y\n");elseprintf("X<Y\n");elseprintf("X==Y\n");}运行:Enterintegerx,y:12,23X<YEnterintegerx,y:12,6X>YEnterintegerx,y:12,12X==Y例输入两数并判断其大小关系输入三角形的三条边a,b,c,判断它们能否构成三角形通过键盘输入一个字符,判断该字符是数字字符、大写字母、小写字母、空格还是其他字符。游戏:贪吃蛇第一步请编写一个程序:在屏幕中央显示一个笑脸,通过wzas键控制笑脸上下左右移动一般形式switch(表达式){caseE1:

语句组1;break;caseE2:

语句组2;break;…….caseEn:

语句组n;break;default:

语句组;

break}s=1,k=0;switch(s){case1:k+=1;t=t+1;break;case2:k+=2;break;default:k+=3;}printf(“%d”,k);3switch语句(开关分支语句)1、当switch后面“表达式”的值,与某个case后面的“常量表达式”的值相同时,就执行该case后面的语句(组);当执行到break语句时,跳出switch语句,转向执行switch语句的下一条。2、如果没有任何一个case后面的“常量表达式”的值,与“表达式”的值匹配,则执行default后面的语句(组)。然后,再执行switch语句的下一条。switch表达式语句组1语句组2语句组n语句组…...E1E2Endefaultcase(1)switch后面的“表达式”,可以是int、char和枚举型中的一种。(2)每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象(即对表达式的同一值,有两种或两种以上的执行方案)。(3)case后面的常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。(4)case后可包含多个可执行语句,且不必加{}(5)switch可嵌套(6)多个case可共用一组执行语句…续执行过程说明switch(x>5){case0:y++;case1:y--;}switch(x){case65:y++;case‘A’:y--;}switch(){casex>10:y++;casex<10:y--;}如:……case‘A’:case‘B’:case‘C’:printf(“score>60\n”);break;……..…续说明例score=5;switch(score){case5:printf(“Verygood!”);case4:printf(“Good!”);case3:printf(“Pass!”);case2:printf(“Fail!”);default:printf(“dataerror!”);}运行结果:score为5时,输出:Verygood!Good!Pass!Fail!dataerror!switch示例(1)switch示例:菜单程序在屏幕上显示一张如下所示的时间表:*****Time*****1morning2afternoon3nightPleaseenteryourchoice:

操作人员根据提示进行选择,程序根据输入的时间序号显示相应的问候信息,选择1时显示"Goodmorning",选择2时显示"Goodafternoon",选择3时显示"Goodnight",对于其他选择显示"Selectionerror!",用switch语句编程实现。从键盘上输入一个百分制成绩score,按下列原则输出其等级:score≥90,等级为A;80≤score<90,等级为B;70≤score<80,等级为C;60≤score<70,等级为D;score<60,等级为E。Switch示例(3):main()

{intscore,grade;

printf(“Inputascore(0~100):”);

scanf(“%d”,&score);

grade=score/10;/*将成绩整除10,转化成switch语句中的case标号*/

switch(grade){case10:case9:printf(“grade=A\n”);break;case8:printf("grade=B\n");break;case7:printf("grade=C\n");break;case6:printf("grade=D\n");break;case5:case4:case3:case2:case1:case0:printf(“grade=E\n”);break;default:printf(“Thescoreisoutofrange!\n”);}

}

[程序演示]程序运行情况如下:Inputascore(0~100):85↙grade=B

游戏:贪吃蛇第一步(使用switch完成)请编写一个程序:在屏幕中央显示一个笑脸,通过wzas键控制笑脸上下左右移动4选择结构程序设计举例[案例1]求一元二次方程ax2+bx+c=0的解(a≠0)。

#include"math.h"

main()

{floata,b,c,disc,x1,x2,p,q;

scanf(“%f,%f,%f”,&a,&b,&c);

disc=b*b-4*a*c;

if(fabs(disc)<=1e-6) /*fabs():求绝对值库函数*/

printf(“x1=x2=%7.2f\n”,-b/(2*a));/*输出两个相等的实根*/

else

{if(disc>1e-6)

{x1=(-b+sqrt(disc))/(2*a); /*求出两个不相等的实根*/

x2=(-b-sqrt(disc))/(2*a);

printf(“x1=%7.2f,x2=%7.2f\n”,x1,x2);

}

else

{p=-b/(2*a); /*求出两个共轭复根*/

q=sqrt(fabs(disc))/(2*a);

printf(“x1=%7.2f+%7.2fi\n“,p,q);printf(”x2=%7.2f-%7.2fi\n“,p,q);

}

}

}[案例2]已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下(计量单位:元):profit≤1000 没有提成;1000<profit≤2000 提成10%;2000<profit≤5000 提成15%;5000<profit≤10000 提成20%;10000<profit 提成25%。算法设计要点:为使用switch语句,必须将利润profit与提成的关系,转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、……),如果将利润profit整除1000,则当:profit≤1000 对应0、11000<profit≤2000 对应1、22000<profit≤5000 对应2、3、4、55000<profit≤10000 对应5、6、7、8、9、1010000<profit 对应10、11、12、……

为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit先减1,然后再整除1000即可:profit≤1000 对应01000<profit≤2000 对应12000<profit≤5000 对应2、3、45000<profit≤10000 对应5、6、7、8、910000<profit 对应10、11、12、……/*案例代码*/main(){longprofit;intgrade;floatsalary=500;printf("Inputprofit:");scanf("%ld",&profit);grade=(profit–1)/1000; /*将利润-1、再整除1000,转化成switch语句中的case标号*/switch(grade){case0:break; case1:salary+=profit*0.1;break;case2:case3:case4:salary+=profit*0.15;break; case5:case6:case7:case8:case9:salary+=profit*0.2;break; default:salary+=profit*0.25; }printf("salary=%.2f\n",salary);}阅读程序,写出运行结果voidmain(){inta=10,b=4,c=3;if(a<b)a=b;if(a<c)a=c;printf("%d,%d,%d\n",a,b,c);}阅读程序,写出运行结果voidmain(){intx=100,a=10,b=20,ok1=5,ok2=0;if(a<b)if(b!=15)if(!ok1)x=1;elseif(ok2)x=10;elsex=-1;printf("%d\n",x);}阅读程序,写出运行结果main(){intk,a=1,b=2;k=(a++==b)?2:3;printf("%d",k);}阅读程序,写出运行结果voidmain(){ ints=1,k=0; switch(s) { case1:k+=1; case2:k+=2;break; default:k+=3;}printf(“%d”,k);}练习【例】a=b=3;printf(“%d”,(a=3)&&(b=-3));的输出结果是()A.无输出B.结果不确定C.0D.1答案:D【例】当C的值不为0时,在下列选项中,能正确将C的值赋给变量a、b的是()。A.c=b=a;B.(a=c)||(b=c);C.(a=c)&&(b=c);D.a=c=b;答案:C练习【例】设intx=2,y=1;表达式(!x||y––)的值是()A.-2B.1C.2D.-1答案:B

【例】当m=4,n=3,p=1时,表达式k=m>n>p的值是:A.1B.0C.trueD.fals

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论