c语言第5章选择结构程序设计_第1页
c语言第5章选择结构程序设计_第2页
c语言第5章选择结构程序设计_第3页
c语言第5章选择结构程序设计_第4页
c语言第5章选择结构程序设计_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、第第5章章 选择结构程序设计选择结构程序设计 一、教学要求:一、教学要求: 1、掌握关系运算和逻辑运算, 2、学会构造正确的条件表达式; 3、掌握if 和switch语句的使用 4、学会编写选择结构的程序 二、教学重点与难点二、教学重点与难点 1、条件表达式的构造 2、分支语句的格式与使用(if else语句和switch语句) 3、编写选择结构的程序 三、教学方法与课时数三、教学方法与课时数 方法:讲授,程序演示,上机实验 课时数:理论4节,上机2节 四四 教学内容教学内容 要设计选择结构程序,要考虑两个方面的问 题:一是在C语言中如何来表示条件,二是在C 语言中实现选择结构用什么语句。 在

2、C语言中表示条件,一般用关系表达式或 逻辑表达式,实现选择结构用if语句或switch语句。 5.1 关系运算及其表达式关系运算及其表达式 5.2 逻辑运算及其表达式逻辑运算及其表达式 5.3 if语句语句 5.4 switch语句语句 5.5 选择结构程序举例选择结构程序举例 5.1 关系运算及其表达式关系运算及其表达式 所谓“关系运算”实际上就是“比较运算”,即将两 个数据进行比较,判定两个数据是否符合给定的关系。 例如,“a b”中的“”表示一个大于关系运算。如 果a的值是5,b的值是3,则大于关系运算“”的结果为 “真”,即条件成立;如果a的值是2,b的值是3,则大于 关系运算“”的结

3、果为“假”,即条件不成立。 关系运算符及其优先次序关系运算符及其优先次序 1关系运算符关系运算符 C语言提供6种关系运算符: (小于小于), (大于大于), =(大于或等于大于或等于), =(等于等于), !=(不等于不等于) 注意注意:在中,“等于”关系运算符是双等号“= =”, 而不是单等号“= ”(赋值运算符)。 2优先级 (1)在关系运算符中,前4个优先级相同,后2个也相同,且前4 个高于后2个。 (2)与其它种类运算符的优先级关系 关系运算符的优先级,低于算术运算符,但高于赋值运算符。 关系表达式关系表达式 1关系表达式的概念 所谓关系表达式是指,用关系运算符将两个表达式连 接起来,

4、进行关系运算的式子。 例如,下面的关系表达式都是合法的: ab,a+bc-d,(a=3)=b,(ab)= =(bc) 2关系表达式的值逻辑值(非“真”即“假”)。 由于语言没有逻辑型数据,所以用整数“”表示 “逻辑真”,用整数“”表示“逻辑假”。 例如,假设num1=3,num2=4,num3=5, 则: (1)num1num2的值=0。 (2)(num1num2)!=num3的值=1。 (3)num1num2num3的值=1。 思考题思考题:任意改变num1或num2的值,会影 响整个表达式的值吗?为什么? (4)(num1num2)+num3的值=6,因为 num1num2的值=1,1+5

5、=6。 再次强调再次强调:C语言用整数“1”表示“逻辑 真”,用整数“0”表示“逻辑假”。所以,关系 表达式的值,还可以参与其它种类的运算,例如 算术运算、逻辑运算等。 【例5.1】 main() char c=k; int i=1,j=2,k=3; float x=3e+5,y=0.85; printf(%d,%dn,a+5=k+1); printf(%d,%dn,1j5,x-5.25=0”。 如果需要描述“x=0”、同时“x=0) printf(n input two numbers: ); scanf(%d%d, max=a; if (maxb) printf(max=%dn,a); e

6、lse printf(max=%dn,b); 输入两个整数,输出其中的大数。改用if-else语句判别 a,b的大小,若a大,则输出a,否则输出b。 3.第三种形式为if-else-if形式 前二种形式的if语句一般都用于两个分支的情况。 当有多个分 支选择时,可采用if-else-if语句,其一般形式为: if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; else if(表达式m) 语句m; else 语句n; 其语义是:依次判断表达式的值,当出现某个值为真时,则执行 其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的 表达

7、式均为假,则执行语句n。然后继续执行后续程序。 if-else-ifif-else-if语句的执行过程如图语句的执行过程如图3333所示。所示。 【例5.5】 #includestdio.h main() char c; printf(input a character: ); c=getchar(); if(c=0 b+; else a=0; b=10; 当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。 其一般形式可表示如下: if(表达式) if语句; 或者为 if(表达式) if语句; else if语句; 在嵌套内的if语句可能又是if-else型的,这将会出现多个

8、if和多 个else重叠的情况,这时要特别注意if和else的配对问题。 例如: if(表达式1) if(表达式2) 语句1; else 语句2; 其中的其中的else else 究竟是与哪一个究竟是与哪一个if if 配对呢配对呢? ? 应该理解为: if(表达式1) if(表达式2) 语句1; else 语句2; 还是应理解为: if(表达式1) if(表达式2) 语句1; else 语句2; 为了避免这种二义性,语言规定,else 总是与它前面最近的if 配对,因此对上述例子应按前一种情况理解。 【例5.6】 main() int a,b; printf(please input A,B

9、:); scanf(%d%d, if(a!=b) if(ab) printf(ABn); else printf(AB、Ab) printf(ABn); else printf(A=A printf(ch=%cn,ch); 5.4 switch语句语句 C语言提供了switch语句直接处理多分支选择。 案例案例5.10 从键盘上输入一个百分制成绩score,按下列原则输出 其等级:score90,等级为A;80score90,等级为B; 70score80,等级为C;60score70,等级为D;score60,等级 为E。 /*案例代码文件名:AL4_5.C。*/ main() int sc

10、ore, grade; printf(“Input a score(0100): ”); scanf(“%d”, grade = score/10; /*将成绩整除10,转化成switch语句中的case标 号*/ switch (grade) case 10: case 9: printf(“grade=An”); break; case 8: printf(grade=Bn); break; case 7: printf(grade=Cn); break; case 6: printf(grade=Dn); break; case 5: case 4: case 3: case 2: ca

11、se 1: case 0: printf(“grade=En”); break; default: printf(“The score is out of range!n”); 程序运行情况如下: Input a score(0100): 85 grade=B 1switch语句的一般形式 switch(表达式) case 常量表达式1:语句组;break; case 常量表达式2:语句组;break; . case 常量表达式:语句组;break; default:语句组;break; 2执行过程 (1)当switch后面“表达式”的值,与某个case后 面的“常量表达式”的值相同时,就执行

12、该case后面的语 句(组);当执行到break语句时,跳出switch语句,转 向执行switch语句的下一条。 (2)如果没有任何一个case后面的“常量表达式” 的值,与“表达式”的值匹配,则执行default 后面的语 句(组)。然后,再执行switch语句的下一条。 3说明 (1)switch后面的“表达式”,可以是int、char和 枚举型中的一种。 (2)每个case后面“常量表达式”的值,必须各不 相同,否则会出现相互矛盾的现象(即对表达式的同一 值,有两种或两种以上的执行方案)。 (3)case后面的常量表达式仅起语句标号作用,并后面的常量表达式仅起语句标号作用,并 不进行条

13、件判断不进行条件判断。系统一旦找到入口标号,就从此标号 开始执行,不再进行标号判断,所以必须加上break语句, 以便结束switch语句。 思考题思考题:如果去掉案例案例5.10程序中的所有break语 句,且输入的成绩为75,输出会如何? (4)各case及default子句的先后次序,不 影响程序执行结果。 (5)多个case子句,可共用同一语句(组)。 例如,在案例案例5.105.10中的“case 10: ”和 “case 9: ”共用语句“printf(grade=An); break;”,“case 5: ”“case 0: ”共用 语句“printf(grade=En); br

14、eak;”。 (6)用switch语句实现的多分支结构程序, 完全可以用if语句或if语句的嵌套来实现。 5.5 选择结构程序设计举例选择结构程序设计举例 案例案例5.12 求一元二次方程ax2+bx+c=0的解(a0)。 /*案例代码文件名:AL4_6.C。*/ /*功能:求一元二次方程的解。*/ #include math.h main() float a,b,c,disc,x1,x2,p,q; scanf(“%f,%f,%f”, disc=b*b-4*a*c; if (fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a);/*求出两个不相等的实根*/ x2=(-

15、b-sqrt(disc)/(2*a); printf(x1=%7.2f,x2=%7.2fn, x1, x2); else p=-b/(2*a);/*求出两个共轭复根*/ q=sqrt(fabs(disc)/(2*a); printf(“x1=%7.2f + %7.2f in“, p, q);/*输出两个共轭复根*/ printf(”x2=%7.2f - %7.2f in“, p, q); 说明说明:由于实数在计算机中存储时,经常会有一些 微小误差,所以本案例判断disc是否为0的方法是:判断 disc的绝对值是否小于一个很小的数(例如10-6)。 思考题思考题:如果将系数a、b、c定义成整数,

16、能否直 接判断disc是否等于0? 案例案例5.7 已知某公司员工的保底薪水为500,某月所接工程的利 润profit(整数)与利润提成的关系如下(计量单位:元): profit1000没有提成; 1000profit2000提成10%; 2000profit5000提成15%; 5000profit10000提成20%; 10000profit提成25%。 算法设计要点:算法设计要点: 为使用switch语句,必须将利润profit与提成的关系,转换成某些 整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍 (1000、2000、5000、),如果将利润profit整除1000

17、,则当: profit1000对应0、1 1000profit2000对应1、2 2000profit5000对应2、3、4、5 5000profit10000对应5、6、7、8、9、10 10000profit对应10、11、12、 为解决相邻两个区间的重叠问题,最简单的方法就是:利润 profit先减1(最小增量),然后再整除1000即可: profit1000对应0 1000profit2000对应1 2000profit5000对应2、3、4 5000profit10000对应5、6、7、8、9 10000profit对应10、11、12、 /*案例代码文件名:AL4_7.C。*/ m

18、ain() long profit; int grade; float salary=500; printf(Input profit: ); scanf(%ld, grade= (profit 1) / 1000;/*将利润-1、再整除1000,转化成 switch语句中的case标号*/ switch(grade) case 0: break;/*profit1000 */ case 1: salary += profit*0.1; break;/*1000profit2000 */ case 2: case 3: case 4: salary += profit*0.15; break;/*2000profit5000 */ case 5: case 6: case 7: case 8: case 9: salary += profit*0.2; break;/*5000profit10000 */ default: salary += profit*0.25;/*10000p

温馨提示

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

评论

0/150

提交评论