c语言第4章选择-2013_第1页
c语言第4章选择-2013_第2页
c语言第4章选择-2013_第3页
c语言第4章选择-2013_第4页
c语言第4章选择-2013_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章本章要点本章要点n 算法 n 关系表达式n 逻辑表达式n 选择结构程序设计4.1 4.1 关于算法关于算法4.2 4.2 条件判断条件判断4.3 4.3 用用if if语句实现选择结构语句实现选择结构4.4 4.4 利用利用switchswitch语句实现多分支选择结构语句实现多分支选择结构4.5 4.5 程序举例程序举例一个程序由两部分构成: 数据结构。程序中数据的类型和数据的组织形式 , 是对数据的描述。 算法。操作步骤,是对操作的描述。著名计算机科学家沃思提出一个公式: 数据结构数据结构 + 算法算法 = 程序程序数据结构算法程序设计方法语言工具数据结构算法程序设计方法语言工具完整

2、的程序设计应该是:n计算机算法分为两类: 数值运算算法。目的是求数解值,例如求方程的根、求函数的定积分等。 非数值运算算法。应用较数值运算算法来说更广泛,例如图书检索、人事管理、行车调度管理等。一个算法应该具有以下特点:一个算法应该具有以下特点:n有穷性:包含有限的操作步骤。n确定性:算法中的每一个步骤都应当是确定的。 n有零个或多个输入:输入是指在执行算法时需要从外界取得必要的信息。n有一个或多个输出:算法的目的是为了求解,“解” 就是输出。 n有效性:算法中的每一个步骤都应当能有效地执行,并得到确定的结果 。算法的表示方法: 用自然语言表示。用自然语言表示通俗易懂,但文字冗长,容易出现歧义

3、性。 用流程图表示算法 。用图形表示算法,直观形象,易于理解。 (3)用伪代码表示。书写方便,便于向程序语言转化,易于修改。n用流程图表示算法美国国家标准化协会ANSI(American National Standard Institute)规定了一些常用的流程图符号:起止框起止框判断框判断框处理框处理框输入输入/输出框输出框注释框注释框流向线流向线连接点连接点n用N-S流程图表示算法1973年美国学者I.Nassi和B.Shneiderman提出了一种新的流程图形式。在这种流程图中,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框,或者说,由一些基本

4、的框组成一个大的框。这种流程图又称N-S结构化流程图。n N-S流程图用以下的流程图符号:(1)顺序结构(2)选择结构(3)循环结构例例4.1 将求将求5!的算法用流程图表示的算法用流程图表示n用伪代码表示算法n概念:伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法。n特点:它如同一篇文章一样 ,自上而下地写下来。每一行(或几行)表示一个基本操作。它不用图形符号,因此书写方便 、格式紧凑,也比较好懂,也便于向计算机语言算法(即程序)过渡。n用处:适用于设计过程中需要反复修改时的流程描述。例例4.2 将求将求5!的算法用伪代码表示的算法用伪代码表示可以写成以下形式:可以写成以下形式:

5、 BEGIN算法开始算法开始 1t 2 i while i5 ti t i+1 i print t END算法结束算法结束n一个结构化程序 就是用高级语言表示的结构化算法。用三种基本结构组成的程序必然是结构化的程序,这种程序便于编写、便于阅读、便于修改和维护。n 结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。n结构化程序设计方法的基本思路是:把一个复杂问题的求解过程 分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。 采取以下方法来保证得到结构化的程序:n自顶向下;n逐步细化;n模块化设计;n结构化编码。自顶向下,逐步细化方法的优点: 考虑周全,结构清晰,层

6、次分明,作者容易写,读者容易看。如果发现某一部分中有一段内容不妥,需要修改,只需找出该部分修改有关段落即可,与其它部分无关。我们提倡用这种方法设计程序。这就是用工程的方法设计程序。模块设计的方法:模块化设计的思想实际上是一种“分而治之”的思想,把一个大任务分为若干个子任务,每一个子任务就相对简单了。在拿到一个程序模块以后,根据程序模块的功能将它划分为若干个子模块,如果这些子模块的规模还嫌大,还再可以划分为更小的模块。这个过程采用自顶向下方法来实现。子模块一般不超过50行。划分子模块时应注意模块的独立性,即:使一个模块完成一项功能,耦合性愈少愈好。 许多问题常常需要根据条件判断的结果做不同的处理

7、,例如分段函数的求值等,它们都是需要根据条件做出判断,然后根据判断结果从两组(或几组)操作中选择某一组执行。C语言程序设计时,对这些问题可采用选择结构实现。 选择结构中条件判断的结果有两种,如学生考试成绩是否及格,答案只有“及格”或“不及格”两种。计算机中用逻辑量(布尔量)来表示这样的问题,逻辑值有“真”和“假”两种。因为C语言没有提供逻辑型数据,所以进行逻辑运算时,规定将所有非0值都作为“真”、0作为“假”处理。逻辑运算结果为“真”时输出值为1,结果为“假”时表示为0。所以,逻辑值(“真”和“假”)也可以参加算术运算。 1.关系运算符及其优先次序1. (小于)2. (大于)4. = (大于或

8、等于)5. = (等于)6. != (不等于)优先级相同(高)优先级相同(高)优先级相同(低)优先级相同(低)说明:关系运算符的优先级低于算术运算符关系运算符的优先级高于赋值运算符2.关系表达式用关系运算符将两个表达式(可以是算术表达式或 关系表达式,逻辑表达式,赋值表达式,字符表达式) 接起来的式子,称关系表达式例:ab,a+bb+c,(a=3)(b=5),ab)(bb”的值为“真”,表达式的值为1。C C语言中没有专用语言中没有专用的逻辑值,的逻辑值,1 1代表代表真,真,0 0代表假代表假注意: (1)实型数比较时,尽量不要使用等于(=)运算符,因为实型数的舍入误差可能造成两个本来应相等

9、的数不相等,通常使用“”、“=”和“dc也是合法的关系表达式,但在实际应用中很少使用,因为该表达式并不能表示条件“a+b的值大于d并且大于c”。 1.逻辑运算符及其优先次序1. & (逻辑与) 相当于其他语言中的AND2. | (逻辑或) 相当于其他语言中的OR3. ! (逻辑非) 相当于其他语言中的NOTXX & YYXYX | YX! X逻辑与 & 逻辑或 | 逻辑非 ! a b a&b a|b !a假 假 假 假 真假 真 假 真 真真 假 假 真 假真 真 真 真 假 2.逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就 是逻辑表达式逻辑表达式

10、的值应该是一个逻辑量“真”或“假”。例:设a=4,b=5:!a的值为0 a&b的值为1a|b的值为1 !a|b的值为14&0|2的值为1任何非零的数值被认作任何非零的数值被认作“真真” 当一个表达式中出现多个逻辑运算符时,首先按优先级计算,当同时出现多个相同优先级的运算符时,再按结合性计算。 1)逻辑运算符的优先级 (1)3个逻辑运算符中,“!”的优先级最高,其次是“&”,最后是“|”。 (2)逻辑运算符和其他运算符的优先级次序如图所示。 逻辑非高算术运算符关系运算符逻辑与逻辑或赋值运算符低 逻辑运算符的优先级 3)逻辑与“&”、逻辑或“|”是短路运算符,即在逻

11、辑表达式的求解过程中,并不是表达式中的所有运算符都被执行到。只要能根据前面的计算结果就能确定整个逻辑表达式的值,则后面的运算就不再进行,这样可以提高运算速度。 在一个或多个“&”相连的表达式中,只要有一个操作数为假,就不做后面的“&”运算,整个表达式的值必为0(假)。而由一个或多个“|”相连的表达式中,只要有一个操作数为非0(真),就不做后面的“|”运算,整个表达式的值必为非0(真)。4)逻辑与、逻辑或及逻辑非的结合性如图所示。! :从右向左& :从左向右| :从左向右例:53&84-!0 运算过程 1&0逻辑值为083逻辑值为1表达式值为0例4.1 用

12、逻辑表达式来表示闰年的条件能被4整除,但不能被100整除。能被4整除,又能被400整除答答 (year%4=0&year%100!=0)|year%400=0案案 值为真(1)是闰年,否则为非闰年。If语句的三种基本形式(1)if (表达式) 语句例: if(xy) printf(“%d”,x);表达式语句真(非0)假(0)(2)if(表达式) 语句1 else 语句2例: if (xy) printf(“%d”,x); else printf(“%d”,y); 条件条件 语句语句1 语句语句2YN(3)if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3

13、)语句3 else if(表达式m)语句m else 语句nif(ch = a & ch = A & ch = 0 & ch = 9) letter =2;else letter=3;说明:(1).3种形式的if语句中在if后面都有表达式,类型任意,但一般为逻辑表达式或关系表达式。(2).if语句中有内嵌语句,每个内嵌语句必须以分号结束。 (3).else语句不能作为语句单独使用,它是if语句的一部分,必须与if配对使用。 (4).在if和else后面可以只含有一个内嵌的操作语句,如果需要使用多个语句,并须使用复合语句。#includevoid main() float

14、 a,b,t; scanf(“%f,%f”,&a,&b); if(ab) t=a; a=b; b=t; printf(“%5.2f,%5.2fn”,a,b);ynabt=aa=bb=t例4.3 输入两个实数,按其数值由小到大的顺序输出这两个数。例4.4 分段计算水费 004( )01532.510.515xxyf xxxx源程序-分段计算水费# include int main(void) double x, y; printf(Enter x:); scanf(%lf, &x); if (x 0) y = 0; else if (x = 15) y = 4 * x /

15、 3; else y = 2.5 * x - 10.5; printf(f(%.2f) = %.2fn, x, y); return 0;Enter x: -0.5f(-0.50) = 0.00 Enter x: 9.5f(9.50) = 12.67Enter x: 21.3f(21.30) = 42.75004( )01532.510.515xxyf xxxxEnter x: ?练习输入一个整数,判断其实偶数还是奇数,然后将判断结果显示在屏幕上。在if语句中又包含一个或多个if语句称为if语句的嵌套。形式:If()if() 语句1else 语句2Elseif() 语句3else 语句4内嵌内

16、嵌ifif匹配规则:Else总是与它上面的,最近的,统一复合语句中的,未配对的if语句配对。例:If()if() 语句1elseif() 语句2else 语句3例:If()if() 语句1elseif() 语句2else 语句3当当ifif和和elseelse数目不同时,可以加数目不同时,可以加花括号花括号来确定配对关系。来确定配对关系。例: 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”); -1 (x0)算法1: 算法

17、2:输入x 输入x若x0,则y=-1 若x0,则y=1 若x=0,则y=0输出y 若x0,则y=1 输出y #includevoid main() int x,y; scanf(“%d”,&x); 程序段 printf(“x=%d,y=%dn”,x,y); 上例中的程序段有四个,请判断哪个是正确的?程序1: 程序2: If(x=0) Y=-1; if(x0) y=1; Else else y=0; If(x=0) y=0; else y=-1; Else y=1;程序3: 程序4: Y=-1; y=0; If(x!=0) if(x=0) If(x0) y=1; if(x0) y=1;

18、Else y=0; Else y=-1;正确正确条件表达式用来处理语句中判别的表达式的值无论为“真”或“假” 都要向同一个变量赋值执行一个赋值语句的情况。格式: 表达式?表达式表达式 功能: 判断表达式1的值,如果成立就执行表 达式2,否则就执行表达式3使用场合:若在语句中,当被判别的表达式的 值为“真”或“假” 时,都执行一个赋值语 句且向同一个变量赋值时,可以用一个 条件运算符来处理。 例: () =; ;当ab时将a的值赋给max,当ab时将b的值赋给max,可以看到无论ab是否满足,都是向同一个变量赋值。 可以用下面的条件运算符来处理: ()?;说明:(1).(1).条件运算符的执行顺

19、序:先求解表达式,若为非(真)条件运算符的执行顺序:先求解表达式,若为非(真) 则求解表达式,此时表达式的值就作为整个条件表达式则求解表达式,此时表达式的值就作为整个条件表达式 的值。若表达式的值为(假),则求解表达式,表达的值。若表达式的值为(假),则求解表达式,表达 式的值就是整个条件表达式的值。式的值就是整个条件表达式的值。 (2).(2).条件运算符优先级高于赋值运算符条件运算符优先级高于赋值运算符 ,低于关系运算符,低于关系运算符 和算术运算符。和算术运算符。 (3).(3).条件运算符的结合方向为条件运算符的结合方向为“自右至左自右至左”。 ( (4).4).“表达式表达式2 2”

20、和和“表达式表达式3 3”不仅可以是数值表达式,还可以不仅可以是数值表达式,还可以 是赋值表达式或函数表达式。是赋值表达式或函数表达式。(5).(5).条件表达式中,表达式的类型可以与表达式和表达条件表达式中,表达式的类型可以与表达式和表达 式的类型不同。式的类型不同。 例4.4输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。 #include void main ( ) char ch; scanf(%c,& ch); ch=(ch=A& ch=Z)?(ch+32):ch; printf(%cn,ch); 如果字符变量c

21、h的值为大写字母,则条件表达式的值为(),即相应的小写字母。如果ch的值不是大写字母,则条件表达式的值为,即不进行转换。 switch语句的格式:switch (表达式) case常量表达式:语句 case常量表达式:语句 case常量表达式:语句 default :语句 例例: :要求按照考试成绩的等级输出百分制分数段,用要求按照考试成绩的等级输出百分制分数段,用switchswitch语句实现:语句实现:switch(gradegrade) case printfprintf();); break;break; case printf printf ();); break;break; c

22、ase printf printf ();); break;break; case printf printf ();); break;break; default( printf printf );); 说明: switchswitch后面括弧内的后面括弧内的“表达式表达式”, 标准允许它为任何类型。标准允许它为任何类型。(2) (2) 当表达式的值与某一个当表达式的值与某一个casecase后面的常量表达后面的常量表达式的值相等时,就执行此式的值相等时,就执行此casecase后面的语句,若后面的语句,若所有的所有的casecase中的常量表达式的值都没有与表达中的常量表达式的值都没有与表

23、达式的值匹配的,就执行式的值匹配的,就执行defaultdefault后面的语句。后面的语句。(3) (3) 每一个每一个casecase的常量表达式的值必须互不相同,的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象(对表达式的同否则就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。一个值,有两种或多种执行方案)。(4) 各个各个case和和default的出现次序不影响执行结的出现次序不影响执行结 果。例如,可以先出现果。例如,可以先出现“default:”,再出现,再出现 “case :”,然后是,然后是“case:”。(5) 执行完一个执行完一个case后面的语

24、句后,流程控制转移到后面的语句后,流程控制转移到下一下一 个个case继续执行。继续执行。“case常量表达式常量表达式”只是起只是起语句标号作用,并不是在条件判断。在执行语句标号作用,并不是在条件判断。在执行 switch语句时,根据语句时,根据switch后面表达式的值后面表达式的值 找到匹配的找到匹配的入口标号,就从此标号开始执行下去,不再进行判入口标号,就从此标号开始执行下去,不再进行判断。断。应该在执行一个应该在执行一个case分支后分支后,可以用一个可以用一个break语句来终止语句来终止switch语句的执行。语句的执行。 (6) 多个多个case可以共用一组执行语句。可以共用一

25、组执行语句。 例例4.5 编写四则运算计算器程序。编写四则运算计算器程序。 #include #include void main() void main() float a,b;char op; float a,b;char op;printf(printf(请输入操作数和四则运算符请输入操作数和四则运算符:n);:n);scanf(%f%c%f,&a,&op,&b);scanf(%f%c%f,&a,&op,&b);switch(op)switch(op) case +: printf(%1.0f+%1.0f=%fn,a,b,a+b);brea

26、k;case +: printf(%1.0f+%1.0f=%fn,a,b,a+b);break; case -: printf(%1.0f-%1.0f=%fn,a,b,a-b);break;case -: printf(%1.0f-%1.0f=%fn,a,b,a-b);break; case case * *: printf(%1.0f: printf(%1.0f* *%1.0f=%fn,a,b,a%1.0f=%fn,a,b,a* *b);break;b);break; case /: printf(%1.0f/%1.0f=%fn,a,b,a/b);break;case /: printf(%

27、1.0f/%1.0f=%fn,a,b,a/b);break; default: printf(default: printf(输入错误输入错误n); /n); /* * 显示输入错误信息显示输入错误信息 * */ / 程序运行结果如下:请输入操作数和四则运算符:10*810*8=80.000000 程序举例 例例4.6 4.6 运输公司对用户计算运费。运输公司对用户计算运费。路程()越远,每公里运费越低。标准如下:路程()越远,每公里运费越低。标准如下: 没有折扣没有折扣 折扣折扣 折扣折扣 折扣折扣 折扣折扣 折扣折扣设每公里每吨货物的基本运费为,货物重为,设每公里每吨货物的基本运费为,货物

28、重为,距离为,折扣为,则总运费的计算公式为:距离为,折扣为,则总运费的计算公式为:* * * *()() 程序举例 分析折扣变化的规律性:分析折扣变化的规律性:折扣的折扣的“变化点变化点”都是的倍数都是的倍数 在横轴上加一种坐标,在横轴上加一种坐标,c c的值为的值为s/250s/250。c c代表代表250250的倍数。的倍数。 ,无折扣;,无折扣;,折扣;,折扣;,;,;,;,;,;,; ,。,。 程序举例(续) 运行情况:please enter price,weight,distance:23,345.7,136.45freight=1081349.64 程序举例 例例4.7 4.7 求求axax2 2方程的解。方程的解。基本的算法:基本的算法: ,不是二次方程。,不是二次方程。 b b2 2,有两个相等实根。,有两个相等实根。 b b2 2,有两个不等实根。,有两个不等实根。 b b2 2,有两个共轭复根。,有两个共轭复根。程序举例 程序举例 运行情况: please enter a,b,c: , The equation has two : . please enter a,b,c: ,2 :. . . plea

温馨提示

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

评论

0/150

提交评论