c语言课件第5章选择控制结构_第1页
c语言课件第5章选择控制结构_第2页
c语言课件第5章选择控制结构_第3页
c语言课件第5章选择控制结构_第4页
c语言课件第5章选择控制结构_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

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

文档简介

1、第5章 选择控制结构本章学习内容 算法的描述方法 用于单分支控制的if语句 用于双分支控制的if-else语句 用于多路选择的switch语句 break语句在switch语句中的作用 关系运算符 条件运算符 逻辑运算符 程序测试生活中的问题求解:Problem: 烤蛋糕(Baking a Cake)How to solve: Start 将烤箱预热 准备一个盘子 在盘子上抹上一些黄油 将面粉、鸡蛋、糖和香精混合在一起搅拌均匀 将搅拌好的面粉团放在盘子上 将盘子放到烤箱内 End按照某种步骤顺序进行(算法)然后转换为程序(一组指令集合)5.1 计算机中的问题求解复杂问题-分治策略Problem

2、: 准备早餐( Prepare a Breakfast)1.Start2.准备早餐3.End1. Start2. 准备早餐 2.1 准备一个金枪鱼三明治 2.2 准备一些薯条 2.3 冲一杯咖啡3. End分治策略1. Start2.准备早餐 2.1 准备一个金枪鱼三明治 2.1.1 拿来两片面包 2.1.2 准备一些金枪鱼酱 2.2 准备一些薯片 2.3 冲一杯咖啡3. End分治策略1. Start2.准备早餐 2.1 准备一个金枪鱼三明治 2.1.1 拿来两片面包 2.1.2 准备一些金枪鱼酱 2.2 准备一些薯片 2.2.1 将土豆切成片 2.2.2 油炸这些土豆片 2.3 冲一杯咖啡

3、3. End分治策略分治策略1. Start2.准备早餐 2.1 准备一个金枪鱼三明治 2.1.1 拿来两片面包 2.1.2 准备一些金枪鱼酱 2.2 准备一些薯片 2.2.1 将土豆切成片 2.2.2 油炸这些土豆片 2.3 冲一杯咖啡 2.3.1 烧些开水放入杯中 2.3.2 在水杯中加入一些咖啡和糖3. End5.2 算法的概念及其描述方法面向对象程序 = 对象 + 消息 面向过程的程序 = 数据结构 + 算法计算机中的算法( Algorithm )为解决一个具体问题而采取的、确定的、有限的操作步骤,仅指计算机能执行的算法对操作或者行为的描述5.2 算法的概念及其描述方法算法的特性有穷性

4、在合理的时间内完成确定性,无歧义 如果x0,则输出Yes;如果x0,则输出No有效性 能有效执行负数开平方没有输入或有多个输入 有一个或多个输出 5.2 算法的概念及其描述方法算法的描述方法自然语言描述传统流程图在1966年,Bohra 与 Jacopini 提出N-S结构化流程图1973年,美国学者I.Nassi 和 B.Shneiderman 提出伪码(Pseudocode)表示流程图(Flowchart)流程图:用图形表示算法过程开始/结束框SymbolSemantic一般处理框输入/输出框判断框连接符流程线计算机中的问题求解过程确定问题的输入和输出.抽象模型设计算法(流程图)编写代码顺

5、序结构( Sequence Structure)按照自上而下的顺序执行,且只执行一次表达式语句赋值计算标准库函数调用语句 scanf(%d, &price); printf(%d, price);ABC下列要求能否用顺序结构实现?1.输入三角形的三边长度a,b,c,判断是否构成三角形,如能则求出三角形的周长和面积。 如何判断是否合理的三角形。接下来怎么处理?2. 比较两个数的大小,输出较大者。 如何确定大数?3. 将m-n之间的偶数输出到屏幕上 哪些是偶数?如何判断一个数是偶数?三种结构顺序(简单程序)选择循环选择结构类似“如果,那么执行操作”。用来对某个条件进行判断,然后根据判断的结果选择下

6、一步相应的操作。流程图正常工作是是工作日? 休息否if - elseSingle SelectionDouble SelectionMultiple Selectionifif - else - if选择结构(分支结构) (Selection Structure)选择结构(分支结构)程序经常需要根据不同的条件执行不同操作即需要先进行逻辑判断,再选择对应分支称为选择结构,也称为分支控制结构。需要解决两个问题1)如何描述判断条件2)如何使用语句改变执行顺序,即分情况执行?在C语言中表示条件,一般用关系表达式和逻辑表达式,实现选择结构用if语句或switch语句。5.3 关系运算符与关系表达式简单条

7、件用关系表达式,复杂条件需要关系表达式和逻辑表达式关系运算实际上就是“比较运算”,即将两个数据进行比较,判定两个数据是否符合给定的关系。结果为逻辑值关系运算符将两个操作数联接起来组成的表达式,称为关系表达式 例如xc条件要转化为关系描述x%2!=0 a b中(表示一个大于关系运算)5.3 关系运算符与关系表达式关系运算符描述例子值小于6 91 (true)=小于等于5 大于2 60 (false)=大于等于9 = 51 (true)=等于7 = 50 (false)!=不等于6 != 51 (true)高低前四种优先级高,后两种低。同级运算符的结合性是左结合性,即自左向右进行。关系表达式关系表

8、达式通常表达一个判断条件。一个判断条件的结果只有两种:“真”或者“假”C语言没有专门表示“真”或者“假”的类型。关系运算计算的结果是0(假)和1(真)而C语言在判断时,将非0值作为“真”,0值作为“假”。也就是说只要表达式的值为0,就认为表达式“假”或者条件不成立。反之表达式为“真”,条件成立。n%2!=0和n%2注意关系运算符不能在符号中插入空格,也不能写反不要将“=”和“=”混淆 x=2 和 x=2作为条件的区别?关系运算的优先级都低于算术类,高于赋值类ca+b等效于c(a+b)ab=c等效于(ab)=ca=bc等效于a=(bc等效于a=(bc)注意:abc如何运算? (ab)c练习将下列

9、条件表示为关系表达式x和y不相等n是偶数n是负数x不是y的倍数单分支if语句的简单形式: if ( 条件表达式 ) 语句;规则:如果条件成立(表达式结果为真),执行语句。否则不执行执行过程:先计算条件表达式,根据结果“真”或者“假”决定是否执行语句5.4 用于单分支控制的条件语句if 语句书写形式书写形式:if (expression)statement;或者if (expression) statement1;statement2; 复合语句被当做一条语句看待表达式非0为真if语句书写形式书写形式:if (expression)statement;或者if (expression) stat

10、ement1;statement2; 如果多条语句一起执行,别忘了大括号别漏了小括号!【例】从键盘输入某学生的成绩对其判定是否及格。若不及格,不作任何输出。main() float a; printf(“please input Score:”); scanf(“%f”,&a); if(a=60) printf(“nPassed”);#include main() int a, b, max; printf(Input a,b:); scanf(%d,%d, &a, &b); if (a b)max = a; if (a b) max = a;else max = b;将流程图转换为C程序No

11、YesInput a and bOutput maxa b?max bmax aStartEnd【例5.2】计算两整数的最大值 printf(max = %dn, max);#include main() int a, b, max; printf(Input a, b:); scanf(%d,%d, &a, &b); if (a b) max = a; else max = b; printf(max = %d, max); if (a b) max = a; if (a = b) max = b;【例5.2】计算两整数的最大值 注意if和else两个分支一次只能执行一个,不可能同时执行(不

12、是所有的语句被执行到。只有被选择的分支才能被执行到)if语句一定要用()将条件表达式括起来。else后面没有条件表达式else不能单独使用,必须与if配对if/else后面的必须是一条语句。如果需要在每个分支中执行多条语句,需要用大括号将它们组合成一条复合语句。当if和else下面的语句仅由一条语句构成时,也可不使用复合语句形式if/else语句无论写在几行上,本身都作为一条语句练习输入两个实数,按照从小到大的顺序输出它们输入一个整数,打印它是否是负数输入一个整数,打印它是奇数还是偶数#include main() int a, b, max; printf(Input a, b:); sca

13、nf(%d,%d, &a, &b); if (a b) max = a; else max = b; printf(max = %d, max); max = a b ? a : b;表达式1 ? 表达式2 : 表达式35.6 条件运算符和条件表达式【例5.3】三目运算符“?:”一般格式: 表达式1?表达式2:表达式3 “表达式1”一般表示条件。三个表达式类型可各不相同。运算规则 如果表达式1值为非0(即真),则计算表达式2并将其运算结果作为条件表达式的值;否则,计算表达式3并将表达式3运算结果作为条件表达式的值。 max = (ab) ? a : b ; 等价于 if (ab) max=a;

14、 else max=b;5.7 用于多分支控制的条件语句Multi-way if步骤aif (表达式1)步骤m if (表达式2) 步骤n 步骤zStep aexpression1Step mStep nStep ztruefalseexpression2truefalse步骤 a表达式1步骤m步骤n步骤ztruefalse表达式2truefalse5.7用于多分支控制的条件语句Cascaded if步骤aif (表达式1) 步骤m else if (表达式2) 步骤n else 步骤x 步骤zStep aexpression1Step mStep nStep ztruefalseexpres

15、sion2truefalseStep x步骤a表达式1步骤m步骤n步骤ztruefalse表达式2truefalse步骤xif语句允许嵌套。即在“if语句”或(和)“else语句”中,又包含有if语句的情况。 if ( 条件1 ) 语句1; else if ( 条件2 ) 语句2; else if ( 条件3 ) 语句3; else 语句n; 5.7 用于多分支控制的条件语句多路分支执行过程:沿着分支前进,遇到条件先判断,然后选择分支本质就是一条if/else语句。if语句嵌套时,else子句与if的匹配原则:与在它上面、距它最近、且尚未匹配的if配对。为明确匹配关系,避免匹配错误,建议:将内

16、嵌的if语句用花括号括起来。用缩进表示对应关系。对应if/else竖直对齐 锯齿风格 便于阅读和纠错如何输出三个整数的最大值【例5.4】从键盘键入a、b和c,编程计算并输出一元二次方程ax2+bx+c=0的根。当a=0时,输出“该方程不是一元二次方程”,当a不为0时,将b2-4ac结果分“0”“=0”“0”分别计算并输出P70#include#include#include#define EPS 1e-6main()float a,b,c,disc,p,q;printf(please input a,b,c);scanf(%f%f%f,&a,&b,&c);if(fabs(a)EPS)/和0比较

17、,如果接近0printf(不是一元二次方程!);exit(0);disc=b*b-4*a*c;p=-b/(2*a);q=sqrt(fabs(disc)/(2*a);浮点数只能近似表示实数,所以不能通过if(disc=0)来和0比较。同样,比较两个浮点数是否相等应该判断两浮点数差值的绝对值是否足够接近0if(fabs(disc)EPS)printf(x1=%.2f,x2=%.2f,p+q,p-q);elseprintf(x1=%.2f+%.2fi,p,q);printf(x1=%.2f-%.2fi,p,q);5.8用于多路选择的switch语句 当分支较多时,可以使用开关语句switch根据一个

18、表达式的不同取值,选择其中的一个或者多个分支去执行switch语句的一般形式是:switch ()case : case : case : default:语句组;break; 5.8用于多路选择的switch语句 switch (expression) case value1 :statement1;break;case value2 :statement2;break;default :statementX;break;注意一定要有大括号!一定要有冒号!别漏了空格! !重要规则:常量类型应该和switch括号内表达式一致!switch (expression) case value1 :s

19、tatement1;break;case value2 :statement2;break;default :statementX;break;一定是int或者 char类型!5.8用于多路选择的switch语句 注意!Switch语句的执行过程:首先计算switch后表达式的值,然后将该值依次与case后的常量进行比较。当它们相等时,执行相应case语句代码。遇到break语句跳出switch语句。如果没有break语句,程序将依次执行下面的case后语句,直到碰到break或者switch右花括号。若没有任何一个case常量与表达式的值相匹配,则执行default语句。Example: s

20、witch (month) case 1:printf(Januaryn);break;case 2:printf(Februaryn);break;case 3:printf(Marchn);break;default:printf(Othersn);break; printf(End);假设 month = 1, 那么 这步将被执行,然后case 在这里终止.跳到 January_JanuaryEnd _5.8用于多路选择的switch语句 Example: switch (month) case 1:printf(Januaryn);break;case 2:printf(Februar

21、yn);break;case 3:printf(Marchn);break;default:printf(Othersn);break; printf(End);这步将被执行,然后March_MarchEnd _假设 month = 3, 那么 case 在这里终止.跳到 5.8用于多路选择的switch语句 Example: switch (month) case 1:printf(Januaryn);break;case 2:printf(Februaryn);break;case 3:printf(Marchn);break;default:printf(Othersn);break;

22、printf(End);现在如果把 break 去掉,会如何执行?5.8用于多路选择的switch语句 Example: switch (month) case 1:printf(Januaryn);break;case 2:printf(Februaryn);case 3:printf(Marchn);break;default:printf(Othersn);break; printf(End);去掉break!5.8用于多路选择的switch语句 Example: switch (month) case 1:printf(Januaryn);break;case 2:printf(Feb

23、ruaryn);case 3:printf(Marchn);break;default:printf(Othersn);break; printf(End);这步将被执行。然后February_March _假设 month = 2, 那么 case 在这里终止. 跳到End _继续执行. 所以这步被执行。那么执行这一步。然后5.8用于多路选择的switch语句 Example: switch (month) case 1:printf(Januaryn);break;case 2:printf(Februaryn);case 3:printf(Marchn);break;default:pr

24、intf(Othersn);break; printf(End);现在,如果这些 breaks 都被去掉,会出现什么样的结果?如果month = 1 ?如果 month = 34 ?5.8用于多路选择的switch语句 最好不省略!【例5.5】 计算器程序编程设计一个简单的计算器程序,要求用户从键盘输入如下形式的表达式: 操作数1 运算符op 操作数2 然后,计算并输出表达式的值 指定的运算符为 加(+) 减(-) 乘(*) 除(/) main()int data1, data2; /*定义两个操作符*/char op; /*定义运算符*/printf(Please enter the exp

25、ression:);scanf(%d%c%d, &data1, &op, &data2); /*输入运算表达式*/switch (op) case +: /*处理加法*/printf(%d + %d = %dn, data1, data2, data1 + data2); break;case -: /*处理减法*/printf(%d - %d = %dn, data1, data2, data1 - data2);break;case *: /*处理乘法*/printf(%d * %d = %dn, data1, data2, data1 * data2); break;case /: /*

26、处理除法*/if (0 = data2) printf(Division by zero!n);else printf(%d/%d = %dn, data1, data2, data1/data2); break;default: printf(“Invalid operator! n”);/处理非法输入【例5.5】 Why?注释掉会怎样?思考题语句if(0=data2)的必要性避免“除零错误”为什么不用if (data2 = 0)?思考题如果要求对浮点数进行运算,那么程序如何修改?修改例5.5程序,使其能进行浮点数的算术运算,同时允许使用字符*、x与X作为乘号,并且允许输入的算术表达式中的操

27、作数和运算符之间加入任意多个空格符。 main()float data1, data2; char op; printf(Please enter the expression:);scanf(%f %c%f, &data1, &op, &data2); switch (op) case +:printf(%f + %f = %fn, data1, data2, data1 + data2); break;case -:printf(%f - %f = %fn, data1, data2, data1 - data2);break;case *: case x:case X:printf(%f

28、 * %f = %fn, data1, data2, data1 * data2); break;case /:if (fabs(data2) = 1e-7) /* 实数与0比较 */ printf(Division by zero!n);else printf(%f/%f = %fn, data1, data2, data1/data2); break;default: printf(Invalid operator! n);【例5.6】 取绝对值函数【例】从键盘上输入一个百分制成绩score,按下列原则输出其等级:score90,等级为A;80score90,等级为B;70score80;

29、score60,等级为E。main()int score, grade; printf(“Input a score(0100): ”); scanf(“%d”, &score); grade = score/10; 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: c

30、ase 1: case 0: printf(“grade=En”); break; default: printf(“The score is out of range!n”);程序运行情况如下:Input a score(0100): 85grade=B说明(1)switch后面的“表达式”不能为空,必须是int、char(或者枚举型)中的一种。case后面必须是整数类型或字符型的常量表达式。case和后面的常量表达式需要空格间隔(2)每个case后面“常量表达式”的值,必须各不相同。(3)case后面的常量表达式仅起语句标号作用,并不进行条件判断。一旦找到入口标号,就从此标号开始执行,不再

31、进行标号判断,所以一般每个分支后都要有break语句(4)各case及default子句的先后次序不影响程序执行结果。(5)多个case子句,可共用同一语句(组)。例如“case 5: ”“case 0: ”共用语句“printf(”grade=En“); break;”。(6)case后面的语句虽然包含多条,但可以不用大括号括起来(7)default最好不省略(8)switch语句可看作为一条复合语句switch和if-else的区别?ifelse ifelse结构用于对多条件并列测试,从中取一的情形;switch结构用于单条件测试,从其多种结果中取一种的情形switch只能判断“等于”整型

32、值,而不能表示大于、小于和区间5.9逻辑运算符和逻辑表达式如何表示3x5? if(3x=0”。如果需要描述复杂条件例如 ” x=0”同时” x=0) & (x10)的值为“真”,(x5)的值为“假”。3x3)&(x= A) & (ch 4 ) & ! 5 | 2if(x)和if(x!=0) if(x%2)重要! 4! ! 43&4&53|0 3&0|2 !4|3&2a&b4&!a+2运算符&和|都具有“短路”特性。即若含有&和|的表达式的值可以由左操作数单独计算出来,那么将不再计算右操作数。(尽量使用最少的操作数来确定表达式的值,这就意味着表达式中的某些操作数可能不会被计算 ) 1)对于逻辑与运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。 2)对于逻辑或运算,如果第一个操作数被判定为“真”,系统不再判定或求解第二操作数。&和|的短路计算Example: (a = 1) & (b+ = 5) ( 0 = 1 ) & ( b+ = 5 ) 0 & ( b+

温馨提示

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

评论

0/150

提交评论