《c语言程序设计教学资料》第5章---选择控制结构.ppt

上传人:本田雅阁 文档编号:3045504 上传时间:2019-06-29 格式:PPT 页数:87 大小:10.24MB
返回 下载 相关 举报
《c语言程序设计教学资料》第5章---选择控制结构.ppt_第1页
第1页 / 共87页
《c语言程序设计教学资料》第5章---选择控制结构.ppt_第2页
第2页 / 共87页
《c语言程序设计教学资料》第5章---选择控制结构.ppt_第3页
第3页 / 共87页
《c语言程序设计教学资料》第5章---选择控制结构.ppt_第4页
第4页 / 共87页
《c语言程序设计教学资料》第5章---选择控制结构.ppt_第5页
第5页 / 共87页
点击查看更多>>
资源描述

《《c语言程序设计教学资料》第5章---选择控制结构.ppt》由会员分享,可在线阅读,更多相关《《c语言程序设计教学资料》第5章---选择控制结构.ppt(87页珍藏版)》请在三一文库上搜索。

1、第四章选择控制结构,第五章选择控制结构,内容提要:,算法的描述方法 选择结构程序设计 - if语句实现选择结构 - switch语句实现多分支选择结构,算法的描述方法,一个程序应包括两个方面的内容:,对数据的描述:在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式,即:数据结构(data structure) 对操作的描述:即要求计算机进行操作的步骤,即:算法(algorithm),著名计算机科学家沃思(Nikiklaus Wirth)提出: 数据结构+算法=程序,完整的程序设计应该是:,数据结构算法程序设计方法语言工具,算法:为解决一个问题而采取的方法和步骤。 算法是解决“做什么”

2、和“怎么做”的问题。 两大类计算机算法:数值运算算法、非数值运算算法,算法的描述方法,数值解,如:面积、积分等,分析推理、逻辑推理,如:查找、分类,算法的描述方法,算法特点:,有穷性:包含有限的操作步骤。 确定性:算法中的每一个步骤都应当是确定的。 有效性:算法中的每一个步骤都应当能有效地执行,并得到 确定的结果。 没有输入或有多个输入:输入是指在执行算法时需要从外界 取得必要的信息。 至少有一个输出:算法的目的是为了求解,“解” 就是输出。,对同一个问题,可有不同的解题方法和步骤,算法的描述方法,例: 求,方法1:1+2,+3,+4,一直加到100 加99次 方法2:100+(1+99)+(

3、2+98)+(49 +51)+50 = 100 + 49100 +50 加51次,为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。希望方法简单,运算步骤少。,常用的有算法描述方法:,算法的描述方法,- 自然语言 - 传统流程图 - NS结构化流程图 - 伪代码 - PAD图 - 其它,常用的有算法描述方法,用自然语言表示算法:,用自然语言表示通俗易懂,但文字冗长,容易出现歧义性。 用自然语言描述包含分支和循环的算法,不很方便。 除了很简单的问题外,一般不用自然语言。,用流程图表示算法:,美国国家标准化协会ANSI(American National Standar

4、d Institute)规定了一些常用的流程图符号:,流程图是用一些图框来表示各种操作,常用的有算法描述方法,x0,Y,N,一个入口,两个出口,位置不够,防止交叉,例:打印50名 学生中成绩在80分以上者的学号和成绩。,流程线不要忘记画箭头,否则难以判定各框的执行次序,流程图是表示算法的较好的工具,直观形象,易于理解,一个流程图包括以下几部分: (1) 表示相应操作的框 (2) 带箭头的流程线 (3) 框内外必要的文字说明,传统流程图的流程可以是:,这种如同乱麻一样的算法称为BS型算法,意为一碗面条(A Bowl of Spaghetti),乱无头绪。,传统流程图的弊端: - 传统的流程图用流

5、程线指出各框的执行顺序,对流程线的使用没有严格限制。 - 使用者可以毫不受限制地使流程随意地转来转去,使人难以理解算法的逻辑。,解决办法:必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去。,NS流程图表示算法:,1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本的框组成一个大的框。,常用的有算法描述方法,比文字描述直观、形象、易于理解; 比传统流程图紧凑易画。尤其是它废除了流程线,整个算法结构是由各个基本结构按顺序

6、组成的,NS流程图中的上下顺序就是执行时的顺序。 用NS图表示的算法都是结构化的算法,因为它不可能出现流程无规律的跳转,而只能自上而下地顺序执行。,NS图表示算法的优点:,常用的有算法描述方法,伪代码表示算法:,概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。 特点:它如同一篇文章一样 ,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便 、格式紧凑,也比较好懂,也便于向计算机语言算法(即程序)过渡。 用处:适用于设计过程中需要反复修改时的流程描述。,例:求5!。,BEGIN 1t 2 i while i5 ti t i+1 i print t

7、 END,开始 置t的初值为1 置i的初值为2 当i=5,执行下面操作: 使t=ti 使i=i+1 循环体到此结束 输出t的值 结束,算法的描述方法,例: 求,,写出其算法。,自然语言:,流程图:,NS图:,伪代码:,1. 0 S 2. 1n 3. S+n S 4. n+1 n 5. 判断n100? 6. 是,转3 否则转6 7. 输出S的值,用不同形式表示操作步骤,仅仅是描述了算法,要得到运行结果,必须实现算法,即:将算法描述转换成计算机语言程序。,结构化程序设计就是将程序的功能分为一个一个的模块,这种程序便于编写、便于阅读、便于修改和维护。 结构化程序设计方法的基本思路是:把一个复杂问题的

8、求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。,结构化程序设计方法,结构化程序设计方法,采取以下方法保证得到结构化的程序:,- 自顶向下; - 逐步细化; - 模块化设计; - 结构化编码。,结构化程序设计的三种基本结构是: 顺序结构、选择结构、循环结构 Bohra和Jacopini提出,用这三种基本结构作为表示一个良好算法的基本单元。,三种基本结构的图示:,顺序结构,选择结构,当型(While型)循环结构,直到型(Until型)循环,顺序结构,选择结构,While型循环结构,Until型循环,常用的有算法描述方法,三种基本结构的共同特点: (1)只有一个入口。 (

9、2)只有一个出口。 (3)结构内的每一部分都有机会被执行到。 (4)结构内不存在“死循环”(无终止的循环)。,由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。,用三种NS流程图中的基本框,可以组成复杂的NS流程图。图中的A框或B框,可以是一个简单的操作,也可以是三个基本结构之一。,A框可以是一个选择结构,B框可以是一个循环结构,顺序程序设计,顺序结构,最简单的C语言程序结构,特点是完全按照语句的出现次序执行程序。,顺序程序设计,例:将用华氏法表示的温度F转换为以摄氏法表

10、示的温度C。,NS流程图算法:,#include int main () float f,c; printf(“input f:“); scanf(“%f“, ,选择结构程序设计,在现实生活中,需要进行判断和选择的情况是很多的,如果你在家,我去拜访你 如果考试不及格,要补考 如果遇到红灯,要停车等待 周末我们去郊游 70岁以上的老年人,入公园免票,选择结构:解决需要分情况处理的问题 在进行下一个操作之前先进行条件判断 如何用C语言表达式正确描述这些判断条件? 关系表达式,逻辑表达式 如何用C语句实现这种分情况处理的算法? 条件语句,选择结构程序设计,C语言有两种选择语句: (1) if语句,实

11、现两个分支的选择结构 (2) switch语句,实现多分支的选择结构,选择结构程序设计,if语句,if语句是用来判断给定的条件是否满足 根据判定结果(真或假)决定执行给出的两种操作之一 C语言提供三种形式的if语句: (1)单分支if语句 (2)双分支if语句 (3)多分支if语句,if语句,(1)单分支if语句,格式: if(表达式) 语句;,功能:先计算“表达式”的值, 如果该值不等于0,条件为真,执行其后语句;否则,不执行其后语句。,if语句,(2)双分支if语句,格式: if(表达式) 语句1; else 语句2;,功能:先计算“表达式”的值, 如果该值不等于0,条件为真,执行“语句1

12、”;否则,条件为假,执行“语句2”。,if语句,(3)多分支if语句,格式:,功能:先计算“表达式1”的值,如果真,执行“语句1”;否则,计算“表达式2”的值,如果真,执行“语句2”;,否则,“表达式n”的值,如果真,执行“语句n”;否则,执行“语句n+1”。,if(表达式1)语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; else if(表达式n) 语句n; else 语句n+1;,if语句注意事项,(1) if语句后面的表达式必须用括号括起来。 (2) 表达式通常是逻辑表达式或关系表达式,但也可以是其它任何表达式,如赋值表达式等,甚至也可以是一个变量。

13、只要表达式非零时,表达式的值就为真,否则就是假。 (3) 在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用 括起来组成一个复合语句。但要注意的是在之后不能再加分号。 (4) 在if语句中,如果表达式是一个判断两个数是否相等的关系表达式,要当心不要将=写成了赋值运算符=。,if (a = 5) 语句; /表达式的值永远为非0, 所以其后的语句总是要执行的 if (b) 语句; /等价于if (b != 0) 语句;,运行结果:x = 0,运行结果:x != 0,If嵌套语句,if(表达式1) if (表达式2) 语句1; else 语

14、句2; else if (表达式3) 语句3; else 语句4;,if(表达式1) if (表达式2) 语句1; else 语句2;,if(表达式1) 语句1; else if (表达式2) 语句3; else 语句4;,if (表达式1) if (表达式2) 语句1; else 语句2;,例: 输入两数并判断其大小关系,#include void main ( ) int x, y; printf (“Enter integer x, y: “); scanf (“%d, %d“, ,运行结果: Enter integer x, y: 12, 23 XY Enter integer x,

15、y: 12, 12 X=Y,if_else 配对原则,语言规定,在缺省 时,else总是和它上面离它最近的未配对的if配对,运行结果:a = 0,运行结果:a = 1,例: 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 正确配对方法:加 ,#include void main() float a,b,t; scanf(%f,%f, ,例:输入两个实数,按代数值由小到大的顺序输出这两个数。,#i

16、nclude void main() float a,b; scanf(%f,%f, ,方法二:,例:输入两个整数,按代数值由小到大的顺序输出这两个数。,#include void main() int a,b; scanf(“%d,%d“, ,例:输入三个数a,b,c,要求按由小到大的顺序输出。,解题思路:可以先用伪代码写出算法: if ab,a和b对换 (a是a、b中的小者) if ac,a和c对换 (a是三者中最小者) if bc,b和c对换 (b是三者中次小者) 顺序输出a,b,c,#include void main () float a,b,c,t; scanf(%f,%f,%f,

17、 ,例:有一个函数,编一程序,输入一个x值,输出y值。,算法1: 算法2: 输入x 输入x 若x0,则y=1 若x=0,则y=0 输出y 若x0,则y=1 输出y,#include void main() int x,y; scanf(“%d”, ,#include void main() int x,y; scanf(“%d“, ,条件运算符,格式: 表达1?表达式2:表达式3 功能: 判断表达式1的值,如果成立就执行表达式2, 否则,就执行表达式3 使用场合:若在if语句中,当被判别的表达式的 值为“真”或“假” 时,都执行一个赋值语 句且向同一个变量赋值时,可以用一个 条件运算符来处理。

18、,例:,If(ab) max=a; else max=b;,当ab时将a的值赋给max,当ab时将b的值赋给max,可以看到无论ab是否满足,都是向同一个变量赋值。,可以用下面的条件运算符来处理:,max=(ab)?a:b;,说明:,(1)条件运算符的执行顺序:先求解表达式1,若为非0(真) 则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。 (2)条件运算符优先级高于赋值运算符 ,低于关系运算符和算术运算符。 (3)条件运算符的结合方向为“自右至左”。 (4)表达式2和表达式3不仅可以是数值表达式,还可以是赋

19、值表达式或函数表达式。 (5)条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。,表达1?表达式2:表达式3,#include void main () char ch; scanf(“%c“, ,例:输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。,switch语句,当需要讨论的情况较多时,用开关语句代替条件语句简化程序设计。 switch语句的作用是根据表达式的值,使流程跳转到不同的语句。,switch语句,switch语句的一般形式: switch(表达式) case 常量1 :语句1 case 常量2 :语句2 ca

20、se 常量n :语句n default : 语句n+1 ,float a, b = 4.0; scanf (“%f“, ,使用switch语句注意事项,(1) switch后面的“表达式”,可以是int、char和枚举型中的一种,但不可为浮点型。,switch ( i ) case 1: b = b + 1; break; / 可加可不加 case 2: b = b - 1; break; ,int a, b = 4; scanf (“%d“, ,(2) case后面语句(组)可加 也可以不加 ,但一般不加 。 (3) 每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象

21、。,(4) 每个case后面必须是“常量表达式”,表达式中不能包含变量。,例:按成绩分成A、B、C、D、E、F几个等级。 char score; printf (“Enter Score: “); scanf (“%d“, ,(5) case后面的“常量表达式”仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句。,#include void main ( ) char ch; ch = getchar ( ); switch ( ch ) case Y : printf (“Yesn“); bre

22、ak; case N : printf (“Non“); break; case A : printf (“Alln“); break; default : printf (“Yes,No or Alln“); ,运行结果: No,/假设输入为:N,#include void main ( ) char ch; ch = getchar ( ); switch ( ch ) case Y : printf (“Yesn“); break; case N : printf (“Non“); case A : printf (“Alln“); break; default : printf (“Y

23、es,No or Alln“); ,/假设输入为:N,运行结果: No ALL,(6)多个case子句,可共用同一语句(组)。,例:当a的值是1、2、3时,将b的值加2,当a的值是4、5、6时,将b的值减2。 int a, b = 4; scanf (“%d“, ,(7) case子句和default子句如果都带有break子句,那么它们之间顺序的变化不会影响switch语句的功能。,#include void main ( ) char ch; ch = getchar ( ); switch ( ch ) case Y : printf (“Yesn“); break; case N :

24、printf (“Non“); break; case A : printf (“Alln“); break; default : printf (“Yes,No or Alln“); break; ,#include void main ( ) char ch; ch = getchar ( ); switch ( ch ) case Y : printf (“Yesn“); break; default : printf (“Yes,No or Alln“); break; case N : printf (“Non“); break; case A : printf (“Alln“);

25、break; ,(8) case子句和default子句如果有的带有break子句,而有的没有带break子句,那么它们之间顺序的变化可能会影响输出的结果。,#include void main ( ) char ch; ch = getchar ( ); switch ( ch ) case Y : printf (“Yesn“); break; case N : printf (“Non“); break; case A : printf (“Alln“); break; default : printf (“Yes,No or Alln“); ,#include void main (

26、) char ch; ch = getchar ( ); switch ( ch ) case Y : printf (“Yesn“); break; default : printf (“Yes,No or Alln“); case N : printf (“Non“); break; case A : printf (“Alln“); break; ,/假设输入为:B,运行结果: Yes,No or All,运行结果: Yes,No or All No,/假设输入为:B,(9) switch语句可以嵌套。,#include void main ( ) int x = 1, y = 0, a

27、 = 0, b = 0; switch ( x ) case 1: switch ( y ) case 0: a+; break; case 1: b+; break; case 2: a+; b+; break; case 3: a+; b+; printf (“a = %d, b = %dn“, a, b); ,运行结果: a = 2,b = 1,(10) 常量和case中间至少有一个空格,常量的后面是冒号,常量类型应与switch后括号内表达式类型一直。,例:已知某公司员工的保底薪水为500,某月所接工程的利润profit(整数)与利润提成的关系如下所示(计量单位:元)。计算员工的当月薪

28、水。,程序应该这样来设计: 首先要定义一个变量用来存放员工所接工程的利润; 其次提示用户输入员工所接工程的利润,并调用scanf函数接受用户输入员工所接工程的利润; 然后根据上表的规则,计算该员工当月的提成比率。 最后计算该员工当月的薪水(保底薪水+所接工程的利润*提成比率),并输出结果。,#include void main ( ) long profit; /所接工程的利润 float ratio; /提成比率 float salary = 500; /薪水,初始值为保底薪水500 printf (“Input profit: “); /提示输入所接工程的利润 scanf (“%ld“,

29、/输出结果 ,运行结果: Input profit: 4000 salary = 1100.00,方法一:使用if_else if语句,#include void main ( ) long profit; /所接工程的利润 float ratio; /提成比率 float salary = 500; /薪水,初始值为保底薪水500 printf (“Input profit: “); /提示输入所接工程的利润 scanf (“%ld“, /输出结果 ,运行结果: Input profit: 4000 salary = 1100.00,方法二:使用if语句,方法三:使用switch语句,算法设

30、计要点: 为使用switch语句,必须将利润profit与提成的关系转换成某些整数与提成的关系。分析本题可知,提成的变化点都是1000的整数倍(1000、2000、5000、),如果将利润profit整除1000,则当: profit 1000 对应0、1 1000 profit 2000 对应1、2 2000 profit 5000 对应2、3、4、5 5000 profit 10000 对应5、6、7、8、9、10 10000 profit 对应10、11、12、 为解决相邻两个区间的重叠问题,最简单的方法就是:利润profit先减1(最小增量),然后再整除1000即可: profit 1

31、000 对应0 1000 profit 2000 对应1 2000 profit 5000 对应2、3、4 5000 profit 10000 对应5、6、7、8、9 10000 profit 对应10、11、12、,#include void main ( ) long profit; /所接工程的利润 int grade; float ratio; /提成比率 float salary = 500; /薪水,初始值为保底薪水500 printf (“Input profit: “); /提示输入所接工程的利润 scanf (“%ld“, /输入所接工程的利润,方法三:使用switch语句,

32、/将利润-1、再整除1000,转化成switch语句中的case标号 grade = (profit - 1) / 1000; switch ( grade ) /计算提成比率 case 0: ratio = 0; break; / profit1000 case 1: ratio = 0.10; break; / 1000profit2000 case 2: case 3: case 4: ratio = 0.15; break; / 2000profit5000 case 5: case 6: case 7: case 8: case 9: ratio = 0.20; break; / 5

33、000profit10000 default: ratio = 0.25; / 10000profit salary += profit * ratio; /计算当月薪水 printf (“salary = %.2fn“, salary); /输出结果 ,运行结果: Input profit: 4000 salary = 1100.00,例:根据用户输入的百分之成绩,按下面标准转换成五分制成绩并输出。,方法1:else-if条件语句 方法2:switch语句,#include main() int score; printf(“please enter score:”); scanf(“%d”

34、, ,#include main() int score, mark; printf(“please enter score:”); scanf(“%d”, ,例:运输公司对用户计算运费 路程(s-km)越远,每吨千米运费越低。标准如下:,s250km 没有折扣 250s500 2折扣 500s1000 5折扣 1000s2000 8折扣 2000s3000 10折扣 3000s 15折扣,设每吨每千米货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为: fpws(1-d),分析折扣变化的规律性:,折扣的“变化点”都是250的倍数在横轴上加一种坐标c,c的值为s/250

35、。c代表250的倍数。,c1,无折扣; 1c2,折扣2; 2c4,5; 4c8,8; 8c12,10; c12,15。,#include void main () int c,s; float p,w,d,f; scanf(“%f,%f,%d“, ,结果:10,20,300,freight= 588000.0000,例:写一程序,判断某一年是否闰年。 分析:,普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1900年不是闰年) 世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年),用变量leap代表是否闰年的信息。若闰年,令leap=1;非闰年,leap

36、=0。最后判断leap是否为(真),若是,则输出“闰年”信息,#include int main() int year,leap; printf(“enter year:“); scanf(“%d“, ,if(year%100!=0),if(year%400!=0),本章常见错误 P97,本章小结,语言提供了多种形式的条件语句以构成选择结构。 if语句主要用于单向选择。 if-else语句主要用于双向选择。 if-else-if语和switch语句用于多向选择。 任何一种选择结构都可以用if语句来实现,但并非所有的if语句都有等价的switch语句。switch语句只能用来实现以相等关系作为选择条件的选择结构。,习题P99,5.1,5.2,5.3,5.4,5.6,5.7,5.8,5.9,5.10,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1