c语言程序设计课件_第1页
c语言程序设计课件_第2页
c语言程序设计课件_第3页
c语言程序设计课件_第4页
c语言程序设计课件_第5页
已阅读5页,还剩100页未读 继续免费阅读

下载本文档

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

文档简介

1、第第3 3章章 程序的控制结构程序的控制结构2本本 章章 主主 要要 内内 容容u3.1 3.1 算法算法u3.2 3.2 语句概述语句概述u3.3 3.3 顺序结构顺序结构u3.5 3.5 循环结构循环结构u3.6 3.6 综合例子综合例子u3.4 3.4 选择结构选择结构33.1 3.1 算算 法法4 3.1 3.1 算算 法法53.1.1 3.1.1 算法的特性算法的特性 63.1.2 3.1.2 算法的表示算法的表示73.1.2 3.1.2 算法的表示算法的表示83.1.2 3.1.2 算法的表示算法的表示93.1.2 3.1.2 算法的表示算法的表示符号名称用途起止框起止框用于描述控

2、制流程的开始和结束:开始框内标用于描述控制流程的开始和结束:开始框内标注注“开始开始”字样,结束框内标注字样,结束框内标注“结束结束”字样字样输入输出输入输出框框用于表示数据的输入和输出:框内标明输入输用于表示数据的输入和输出:框内标明输入输出的变量出的变量处理框处理框用于描述数据加工和处理:常采用文字加符号用于描述数据加工和处理:常采用文字加符号来表示计算公式和赋值操作来表示计算公式和赋值操作判断框判断框用于描述条件判断和转移关系:框内描述条件用于描述条件判断和转移关系:框内描述条件关系,两个流出边分别标注关系,两个流出边分别标注 Yes/NoYes/No、Y/NY/N、TrTrue/Fal

3、seue/False或或“真真/ /假假”,表示条件成立或不成立,表示条件成立或不成立时的转移关系时的转移关系调用框调用框用于描述过程调用或模块调用:框内标注函数用于描述过程调用或模块调用:框内标注函数或模块名或模块名流程线流程线用于连接两个图形框:箭头描述处理过程的转用于连接两个图形框:箭头描述处理过程的转移方向移方向连接框连接框用于描述多张流程图的连接:应附加文字标识用于描述多张流程图的连接:应附加文字标识连接关系连接关系传统流程图的流程:传统流程图的流程: 这种如同乱麻一样的算法称为这种如同乱麻一样的算法称为BSBS型算法,意为型算法,意为一碗面条一碗面条(A Bowl of Spagh

4、etti)(A Bowl of Spaghetti),乱无头绪。,乱无头绪。缺点:难以阅读、修改,使算法的可靠性和可维护性难以保证。解决办法:必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去。 三种基本结构和改进的流程图三种基本结构和改进的流程图 BohraBohra和和JacopiniJacopini提出了以下三种基本结构:提出了以下三种基本结构: 顺序结构、选择结构、循环结构顺序结构、选择结构、循环结构 用这三种基本结构作为表示一个良好算法的用这三种基本结构作为表示一个良好算法的基本单元。基本单元。3.1.2 3.1.2 算法的表示算法的表示三种基本结构的图示:三种基

5、本结构的图示: 顺序结构顺序结构选择结构选择结构3.1.2 3.1.2 算法的表示算法的表示3.1.2 3.1.2 算法的表示算法的表示当型当型(While型型)循环结构循环结构 直到型直到型(Until型型)循环循环 三种基本结构的共同特点:三种基本结构的共同特点:(1)(1)只有一个入口。只有一个入口。 (2)(2)只有一个出口。(只有一个出口。(注意:注意:一个菱形判断框有两个一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。)形框的出口和选择结构的出口混淆。)(3)(3)结构内的每一部分都有机会被执行

6、到。结构内的每一部分都有机会被执行到。(4)(4)结构内不存在结构内不存在“死循环死循环”( (无终止的循环无终止的循环) )。 3.1.2 3.1.2 算法的表示算法的表示 图中没有一条从图中没有一条从入口到出口的路径通入口到出口的路径通过过A A框。框。不正确的流程表示:不正确的流程表示:流程内的死循环流程内的死循环3.1.2 3.1.2 算法的表示算法的表示l由三种基本结构顺序组成的算法结构,可由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构以解决任何复杂的问题。由基本结构所构成的算法属于成的算法属于“结构化结构化”的算法,它不存的算法,它不存在无规律的转向,只在

7、本基本结构内才允在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。许存在分支和向前或向后的跳转。3.1.2 3.1.2 算法的表示算法的表示l只要具有上述四个只要具有上述四个特点的都可以作为特点的都可以作为基本结构。可以自基本结构。可以自己定义基本结构,己定义基本结构,并由这些基本结构并由这些基本结构组成结构化程序。组成结构化程序。上图符合基本结构的特点上图符合基本结构的特点3.1.2 3.1.2 算法的表示算法的表示 右图是一个多分右图是一个多分支选择结构,根据表支选择结构,根据表达式的值决定执行路达式的值决定执行路线。虚线框内的结构线。虚线框内的结构一个入口一个出口,一个入

8、口一个出口,并且有上述全部的四并且有上述全部的四个特点。由此构成的个特点。由此构成的算法结构也是结构化算法结构也是结构化的算法。可以认为是的算法。可以认为是由三种基本结构所派由三种基本结构所派生出来的。生出来的。3.1.2 3.1.2 算法的表示算法的表示开开始始sum=0i=1i=100NYsum=sum+ii=i+1输输出出sum的的值值结结束束图图3-1 例例3-2算算法法描描述述203.1.2 3.1.2 算法的表示算法的表示 N-SN-S流程图用以下的流程图符号:流程图用以下的流程图符号: (1)顺序结构顺序结构(2)选择结构选择结构(3)循环结构循环结构3.1.2 3.1.2 算法

9、的表示算法的表示 用三种用三种N-SN-S流程图中的基本框,可以组成复杂的流程图中的基本框,可以组成复杂的N-SN-S流程图。图中的流程图。图中的A A框或框或B B框,可以是一个简单的操框,可以是一个简单的操作,也可以是三个基本结构之一。作,也可以是三个基本结构之一。 A框可以是一个选择结构框可以是一个选择结构 B框可以是一个循环结构框可以是一个循环结构 3.1.2 3.1.2 算法的表示算法的表示3.1.2 3.1.2 算法的表示算法的表示例:判定例:判定2000200025002500年中的每一年是否闰年,年中的每一年是否闰年,并将结果输出。并将结果输出。 分析:分析:闰年的条件是:闰年

10、的条件是:(1)(1)能被能被4 4整除,但不能整除,但不能被被100100整除的年份都是闰年,如整除的年份都是闰年,如1996,20041996,2004年年是闰年;是闰年;(2)(2)能被能被100100整除,又能被整除,又能被400400整除的整除的年份是闰年。如年份是闰年。如1600,20001600,2000年是闰年。不符合年是闰年。不符合这两个条件的年份不是闰年。这两个条件的年份不是闰年。 3.1.2 3.1.2 算法的表示算法的表示设设y y为被检测的年份,算法用自然语言可表示如下:为被检测的年份,算法用自然语言可表示如下:S1S1:2000y2000yS2S2:若:若y y不能

11、被不能被4 4整除,则输出整除,则输出y“y“不是闰年不是闰年”。然后转。然后转到到S6S6。S3S3:若:若y y能被能被4 4整除,不能被整除,不能被100100整除,则输出整除,则输出y“y“是闰是闰年年”。然后转到。然后转到S6S6。S4S4:若:若y y能被能被100100整除,又能被整除,又能被400400整除,输出整除,输出y“y“是闰是闰年年”, ,否则输出否则输出“不是闰年不是闰年”。然后转到。然后转到S6S6。S5: S5: 输出输出y“y“不是闰年不是闰年”。S6S6:y+1yy+1yS7S7:当:当y2500y2500时,转时,转S2S2继续执行,如果继续执行,如果y

12、y25002500,算,算法停止。法停止。3.1.2 3.1.2 算法的表示算法的表示 以上算法中每做一步都分别分离出一些范围(巳能判定为闰年或非闰年),逐步缩小范围,直至执行S5时,只可能是非闰年。 “其它”包括能被4整除,又能被100整除,而不能被400整除的那些年份(如1800、1900、2100) 是非闰年。3.1.2 3.1.2 算法的表示算法的表示用流程图表示算法要比用文字描述算法逻辑清晰、易于理解。 将判定将判定闰年的算闰年的算法用流程法用流程图表示。图表示。 将判将判定闰年定闰年的算法的算法用用N-SN-S图表示图表示3.1.2 3.1.2 算法的表示算法的表示 例例: : 对

13、一个大于或等于对一个大于或等于3 3的正整数,判断它是的正整数,判断它是不是一个素数。不是一个素数。 概念:概念:所谓素数,是指除了所谓素数,是指除了1 1和该数本身之外,不和该数本身之外,不能被其它任何整数整除的数。例如,能被其它任何整数整除的数。例如,1313是素数。是素数。因为它不能被因为它不能被2 2,3 3,4 4,1212整除。整除。分析:分析:判断一个数判断一个数n(n3)n(n3)是否素数的方法:是否素数的方法: 将将n n作为被除数,将作为被除数,将2 2到到(n-1)(n-1)各个整数轮流作各个整数轮流作为除数,如果都不能被整除,则为除数,如果都不能被整除,则n n为素数。

14、为素数。 3.1.2 3.1.2 算法的表示算法的表示算法用自然语言可表示如下:算法用自然语言可表示如下:S1S1:输入:输入n n的值的值S2S2:i=2i=2(i i作为除数)作为除数)S3S3:n n被被i i除,得余数除,得余数r rS4S4:如果:如果r=0r=0,表示,表示n n能被能被i i整除,则打印整除,则打印n“n“不是素不是素数数”,算法结束。否则执行,算法结束。否则执行S5S5S5S5:i+1ii+1iS6S6:如果:如果in-1in-1,返回,返回S3S3。否则打印。否则打印n“n“是素数是素数”。然后结束。然后结束。3.1.2 3.1.2 算法的表示算法的表示 实际

15、上,实际上,n n不必被不必被2 2到到(n-1)(n-1)的整数除,只需被的整数除,只需被2 2到到n/2n/2间整数除,甚至只需被间整数除,甚至只需被2 2到到 之间的整数除之间的整数除即可。即可。n传统流程图分析:传统流程图分析:出口出口1出口出口2此图不符合基本结构特点!此图不符合基本结构特点! 由于不能分解为三种基本结由于不能分解为三种基本结构,就无法直接用构,就无法直接用N-SN-S流程流程图的三种基本结构的符号来图的三种基本结构的符号来表示。因此,应当先作必要表示。因此,应当先作必要的变换。的变换。传统流程图变换为:传统流程图变换为:一个出口一个出口3.1.2 3.1.2 算法的

16、表示算法的表示用用N-S流程图流程图表示:表示:343.1.2 3.1.2 算法的表示算法的表示353.1.2 3.1.2 算法的表示算法的表示写写出出C C程序只是程序只是描述描述了了算法,只有算法,只有运运行程序才行程序才是是实现实现算法算法36本本 章章 主主 要要 内内 容容u3.1 3.1 算法算法u3.2 3.2 语句概述语句概述u3.3 3.3 顺序结构顺序结构u3.5 3.5 循环结构循环结构u3.6 3.6 综合例子综合例子u3.4 3.4 选择结构选择结构373.2 3.2 语句概述语句概述383.2 3.2 语句概述语句概述393.2 3.2 语句概述语句概述40本本 章

17、章 主主 要要 内内 容容u3.1 3.1 算法算法u3.2 3.2 语句概述语句概述u3.3 3.3 顺序结构顺序结构u3.5 3.5 循环结构循环结构u3.6 3.6 综合例子综合例子u3.4 3.4 选择结构选择结构413.3 3.3 顺序结构顺序结构AB图图 3-3 顺顺序序结结构构AB423.3 3.3 顺序结构顺序结构l43本本 章章 主主 要要 内内 容容u3.1 3.1 算法算法u3.2 3.2 语句概述语句概述u3.3 3.3 顺序结构顺序结构u3.5 3.5 循环结构循环结构u3.6 3.6 综合例子综合例子u3.4 3.4 选择结构选择结构443.4 3.4 选择结构选择

18、结构453.4 3.4 选择结构选择结构 表表 达达 式式语语 句句真真 ( 非非 0 )假假 ( 0 )图图 3 -4 ( a ) 单单 分分 支支 if语语 句句463.4 3.4 选择结构选择结构 表表 达达 式式语语 句句 1真真 ( 非非 0)假假 ( 0)图图 3-5( a) 双双 分分 支支 if语语 句句语语 句句 2473.4 3.4 选择结构选择结构 例3-7 输入三角形的三边长,求三角形面积。 分析:与例3-6相比,此例去掉假设前提:“设输入的三条线段能构成三角形的三条边”,因此本题在输入三条线段后要加入条件判断其能否构成三角形的三条边,若可以则计算并输出面积,否则输出提

19、示信息。源程序如下:运行情况如下:运行情况如下:Please input a, b, Please input a, b, c:3,4,5c:3,4,5area= 6.00area= 6.00Please input a, b, Please input a, b, c:1, 2, 3c:1, 2, 3it is not a trilateralit is not a trilateral思考:思考:if if后的后的“ ” ”能否去掉?若去掉,能否去掉?若去掉,表示什么意思?表示什么意思?#include #include #include #include main()main() flo

20、at a, b, c, s, area; float a, b, c, s, area; printf(Please input a, b, c:); printf(Please input a, b, c:); scanf(%f, %f, %f, &a, &b, &c); scanf(%f, %f, %f, &a, &b, &c); if (a+bc & a+cb & b+ca) / if (a+bc & a+cb & b+ca) /* *判判断断三三条线条线段能否段能否构构成成 三角形的三三角形的三条边条边*

21、*/ / s=1.0/2 s=1.0/2* *(a+b+c);(a+b+c); area=sqrt(s area=sqrt(s* *(s-a)(s-a)* *(s-b)(s-b)* *(s-c);(s-c); printf(area=%7.2f printf(area=%7.2f n, area);n, area); else printf(it is not a trilateral else printf(it is not a trilateral n);n); 483.4 3.4 选择结构选择结构 3.if3.if语句的嵌套形式(多分支情况)语句的嵌套形式(多分支情况) 在在if if

22、语句中又包含一个或多个语句中又包含一个或多个if if语句称为语句称为if if语句的嵌套。这语句的嵌套。这种情况主要用来解决多分支情况,种情况主要用来解决多分支情况,if if语句的嵌套有多种的表语句的嵌套有多种的表现形式:现形式: (1 1)下列形式为比较常用的一种:)下列形式为比较常用的一种: if if (表达式(表达式1 1) 语句语句1 1 else if else if (表达式(表达式2 2) 语句语句2 2 else if else if (表达式(表达式3 3) 语句语句3 3 else if else if (表达式(表达式mm) 语句语句mm else else 语句语

23、句n n 493.4 3.4 选择结构选择结构 例例3-8 3-8 已知学生的百分制成绩,编写程序按百分制已知学生的百分制成绩,编写程序按百分制分数进行分段评定,给出相应的等级:分数大于等于分数进行分段评定,给出相应的等级:分数大于等于9090,则评定为则评定为AA;分数在;分数在80808989之间,则评定为之间,则评定为BB;分数在分数在70707979之间,则评定为之间,则评定为CC;分数在;分数在60606969之之间,则评定为间,则评定为DD;分数小于;分数小于6060,则评定为,则评定为EE; 分析:这是一个根据百分制分数进行分段定级的多分支分析:这是一个根据百分制分数进行分段定级

24、的多分支选择问题,可利用上面介绍的选择问题,可利用上面介绍的if if语句的嵌套来解决。语句的嵌套来解决。#include #include main( )main( ) float score; float score; char grade; char grade; printf(Please enter scores:); printf(Please enter scores:); scanf(%f, &score); scanf(%f, &score); if(score100) / if(score100) /* *对输对输入入数数据的合法性据的合法性进进行行检查检查

25、* */ / printf(“Input error! printf(“Input error! n);n); else else if(score=90) grade=A; if(score=90) grade=A; else if(score=80) grade=B; else if(score=80) grade=B;else if(score=70) grade=C;else if(score=70) grade=C; else if(score=60) grade=D; else if(score=60) grade=D; else grade=E; else grade=E; pr

26、intf(%5.1f-%c printf(%5.1f-%c n, score, grade);n, score, grade); 运行情况:运行情况:Please enter sPlease enter scores:-85cores:-85Input error!Input error!Please enter sPlease enter scores:85cores:85 85.0-B 85.0-BPlease enter sPlease enter scores:100cores:100100.0-A100.0-APlease enter sPlease enter scores:56c

27、ores:56 56.0-E 56.0-E503.4 3.4 选择结构选择结构 (2 2)其他形式:)其他形式: 在嵌套内将会出现多个在嵌套内将会出现多个if if和多个和多个elseelse重叠的情况,这时要特别注意重叠的情况,这时要特别注意if if和和elseelse的配对问题。例如:的配对问题。例如: if(if(表达式表达式1) 1) if( if(表达式表达式2)2) 语句语句1 1; elseelse 语句语句2 2; 其中的其中的elseelse究竟是与哪一个究竟是与哪一个if if配对呢配对呢? ?是与表达式是与表达式2 2前还是与表达式前还是与表达式1 1前的前的if if

28、配对配对? ?语言规定,从最内层开始,语言规定,从最内层开始,elseelse总是与它上面最近的(未总是与它上面最近的(未曾配对的)曾配对的)if if配对配对, ,因此对上述例子应按前一种情况理解。因此对上述例子应按前一种情况理解。if()if()if()else.else.else.例:例: 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”);如果如果ifif与与elseelse的数目的数目不一样不一样,为实现程

29、序设计者,为实现程序设计者的企图,可以的企图,可以加花括弧加花括弧来确定配对关系。来确定配对关系。if语句嵌套语句嵌套:if (expr1) if (expr2) statement1 else statement2else if(expr3) statement3 else statement4内嵌内嵌if内嵌内嵌ifif (expr1) if (expr2) statement1 else statement2内嵌内嵌if内嵌内嵌ifif (expr1) if (expr2) statement1else statement3 if (expr1) statement1else if(ex

30、pr3) statement3 else statement4内嵌内嵌if533.4 3.4 选择结构选择结构 例例3-9 3-9 求三个数的最大数。求三个数的最大数。 分析:假设所求的三个数用变量分析:假设所求的三个数用变量x, y, zx, y, z表示表示, ,三个数的最大数用变三个数的最大数用变量量mm表示。本题有很多种的求法与写法,下面列出其中几种,请表示。本题有很多种的求法与写法,下面列出其中几种,请读者进行比较理解:读者进行比较理解: 方法方法1 1:用单分支形式:用单分支形式: if (xy & xz) m=x; if (xy & xz) m=x; if (yx

31、 &yz) m=y; if (yx &yz) m=y; if (zy &zx) m=z; if (zy &zx) m=z; 方法方法2 2:用单分支形式:用单分支形式: : m=x; m=x; if (ym) m=y; if (ym) m=y; if (zm) m=z; if (zm) m=z; 方法方法3 3:用双分支形式:用双分支形式 if (xy) m=x; if (xy) m=x; else m=y ; else m=y ; if (mz) m=m; if (mz) m=m; else m=z; else m=z; 方法方法4: 4: 用条件表达式用条件

32、表达式 m=xy ? x: y;m=xy ? x: y;m=mz ? m: z; m=mz ? m: z; 方法方法5 5:用:用if if语句的嵌套语句的嵌套 if ( xy )if ( xy ) if (xz) m=x; if (xz) m=x; else m=z; else m=z; else else if (yz) m=y; if (yz) m=y; else m=z; else m=z; 方法方法6 6:用:用if if语句的嵌套语句的嵌套m=x;m=x;if (zy)if (zy) if (zx) m=z; if (zx) m=z;else else if (yx) m=y; i

33、f (yx) m=y; 说明说明:上述的:上述的“ ” ”若去掉,结果就不正若去掉,结果就不正确了,如:确了,如:x=2,y=3,z=1x=2,y=3,z=1。543.4 3.4 选择结构选择结构 3.4.2 switch3.4.2 switch语句语句 语言还提供了另一种用于多分支选择的语言还提供了另一种用于多分支选择的switchswitch语句,语句,以代替嵌套的以代替嵌套的if if语句,简化程序的设计。语句,简化程序的设计。switchswitch语句又称语句又称为开关语句,它允许程序根据表达式的计算结果在多个为开关语句,它允许程序根据表达式的计算结果在多个分支中进行选择,常用于各种

34、分类、菜单等程序的设计。分支中进行选择,常用于各种分类、菜单等程序的设计。它的一般形式如下:它的一般形式如下: switch switch (表达式)(表达式) case case 常量表达式常量表达式1 1:语句序列:语句序列1 1 case case 常量表达式常量表达式2 2:语句序列:语句序列2 2 case case 常量表达式常量表达式n n:语句序列:语句序列n n default default :语句序列:语句序列n+1n+1 语义:语义:计算充当开关角色的表达式的值,并逐个与其后的常量表计算充当开关角色的表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表

35、达式的值相等时,即按顺达式值相比较,当表达式的值与某个常量表达式的值相等时,即按顺序执行此序执行此casecase后的所有语句,包括后续后的所有语句,包括后续casecase,而不再进行判断,直到,而不再进行判断,直到遇到遇到breakbreak或右花括号或右花括号“”(整个语句执行完毕)为止。如表达式的(整个语句执行完毕)为止。如表达式的值与所有值与所有casecase后的常量表达式均不相同时,则执行后的常量表达式均不相同时,则执行defaultdefault后的语句。后的语句。553.4 3.4 选择结构选择结构 例例3-10 3-10 用用switchswitch语句改写例语句改写例3-

36、83-8。已知学生的百分制。已知学生的百分制成绩,编写程序按百分制分数进行分段评定,给出相应成绩,编写程序按百分制分数进行分段评定,给出相应的等级:分数大于等于的等级:分数大于等于9090,则评定为,则评定为AA;分数在;分数在8 80 08989之间,则评定为之间,则评定为BB;分数在;分数在70707979之间,则之间,则评定为评定为CC;分数在;分数在60606969之间,则评定为之间,则评定为DD;分数小于分数小于6060,则评定为,则评定为EE; 分析:使用分析:使用switchswitch语句时要注意到语句时要注意到casecase后的常量表后的常量表达式最终结果只能是某一个值(点

37、),不能表示区间达式最终结果只能是某一个值(点),不能表示区间(范围)。因此要解决本例中的根据分数进行分段定级,(范围)。因此要解决本例中的根据分数进行分段定级,必须设法完成从区间到点的转化。其传统流程图如图必须设法完成从区间到点的转化。其传统流程图如图3-3-7 7。输输出出“A”10,9(a)输输出出“B”输输出出“C”输输出出“D”输输出出“E”85,4,3,2,1,0其其它它图图 3-7 例例 3-10 算算 法法 描描 述述 input invalid scoretemp67563.4 3.4 选择结构选择结构源程序如下:源程序如下: #include #include main()

38、main() float score; float score; int temp; int temp; printf(Please input score:); printf(Please input score:); scanf(%f, &score); scanf(%f, &score); if(score100) temp=-1; if(score100) temp=-1; else else temp=(int)score/10temp=(int)score/10; /; /* *采用整除采用整除方法,方法,将区间将区间取取值转值转化到点上化到点上* */ / swi

39、tch( temp ) switch( temp ) case 10: case 10: case 9: printf(A case 9: printf(A n); break;n); break; case 8: printf(B case 8: printf(B n); break;n); break; case 7: printf(C case 7: printf(C n); break;n); break; case 6: printf(D case 6: printf(D n); break;n); break; case 5: case 5: case 4: case 4: cas

40、e 3: case 3: case 2: case 2: case 1: case 1: case 0: printf(E case 0: printf(E n); break;n); break; default: printf(Input invalid score default: printf(Input invalid score n); /n); /* *处处理非法理非法数数据据* */ / 运运行情行情况况如下:如下:Please input score:-85Please input score:-85Input invalid scoreInput invalid score

41、Please input score:85Please input score:85B BPlease input score:100Please input score:100A APlease input score:56Please input score:56E E573.4 3.4 选择结构选择结构 说明说明:在使用:在使用switchswitch语句时还应注意以下几点:语句时还应注意以下几点: 1 1switchswitch后面括弧内的后面括弧内的“表达式表达式”的值一般为整的值一般为整型、字符型或枚举型数据。每个型、字符型或枚举型数据。每个casecase后的后的 “ “常量表达

42、常量表达式式”的类型应该与的类型应该与switchswitch后面括弧内的后面括弧内的“表达式表达式”的类的类型一致。型一致。 2 2由于每个由于每个casecase后的常量只是起到语句标号作用,后的常量只是起到语句标号作用,所以每一个所以每一个casecase的常量表达式的值必须互不相同,否则的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象(对表达式的同一个值,有就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。两种或多种执行方案)。 3. 3.各各casecase和和defaultdefault子句的先后顺序可以变动,而子句的先后顺序可以变动,而不会影响程序执行结

43、果。但从程序的执行效率角度考不会影响程序执行结果。但从程序的执行效率角度考虑,一般将发生频率高的情况放在前面。虑,一般将发生频率高的情况放在前面。 4. 4.在在casecase后,允许有多个语句,并可以不用后,允许有多个语句,并可以不用 括起来。括起来。 5.default 5.default子句可以省略不用。子句可以省略不用。 6.6.多个多个casecase可以共用一组执行语句,如:可以共用一组执行语句,如: case Acase A: case Bcase B: case Ccase C: printf(“printf(“60n”)60n”);break ;break ; grade

44、grade的值为的值为AA、BB或或CC时都执行同一时都执行同一组语句。组语句。 7.switch7.switch语句不同于语句不同于if if语句语句,switchswitch仅能判断一种逻辑仅能判断一种逻辑关系,即看括弧内的关系,即看括弧内的“表达式表达式”的值和指定的常量值是的值和指定的常量值是否相等,而不能进行大于、小于某个值的判断,不能表否相等,而不能进行大于、小于某个值的判断,不能表达区间的概念,而达区间的概念,而if if语句可以计算并判断各种表达式,所语句可以计算并判断各种表达式,所以以switchswitch语句并不能完全替代语句并不能完全替代if if语句。反过来,凡是能用

45、语句。反过来,凡是能用switchswitch语句解决的问题肯定能用语句解决的问题肯定能用if if语句来解决。语句来解决。例例 switch(score) case 5: printf(“Very good!”); case 4: printf(“Good!”); case 3: printf(“Pass!”); case 2: printf(“Fail!”); default : printf(“data error!”); 运行结果:运行结果:score为为5时,输出:时,输出: Very good! Good! Pass! Fail! data error!例例 void main()

46、 int x=1,y=0,a=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(“na=%d,b=%d”,a,b); 运行结果:运行结果:a=2,b=1603.4 3.4 选择结构选择结构 3.4.3 3.4.3 程序设计举例程序设计举例 例例3-11 3-11 输入三个数输入三个数a a,b b,c c,要求按由小到,要求按由小到大的顺序输出。大的顺序输出。 分析:可以用伪代码写出算法:分析:可以用伪代码写出算

47、法: if ab if ab 将将a a和和b b对换,使对换,使a a成为成为a a、b b中的小者中的小者 if ac if ac 将将a a和和c c对换,使对换,使 a a成为成为a a、c c中的小者,中的小者,则则a a是三者中最小者是三者中最小者 if bc if bc 将将b b和和c c对换,使对换,使b b是是b b、c c中的小者,也中的小者,也是三者中次小者是三者中次小者 然后顺序输出然后顺序输出a a,b b,c c即可。即可。源程序如下:源程序如下:#include #include main()main() float a, b, c, t; float a, b

48、, c, t; printf(Please input a,b,c:); printf(Please input a,b,c:); scanf(%f, %f, %f, &a, &b, &c); scanf(%f, %f, %f, &a, &b, &c); if(ab) if(ab) t=a; a=b; b=t; / t=a; a=b; b=t; /* *实现实现a a和和b b的互换的互换* */ / if(ac) if(ac) t=a; a=c; c=t; / t=a; a=c; c=t; /* *实现实现a a和和c c的互换的互换* */

49、/ if(bc) if(bc) t=b; b=c; c=t; / t=b; b=c; c=t; /* *实现实现b b和和c c的互换的互换* */ / printf(%5.2f, %5.2f, %5.2fn, a, b, c); printf(%5.2f, %5.2f, %5.2fn, a, b, c); 运行情况如下:运行情况如下:Please input a,b,c:Please input a,b,c:2, 8, 72, 8, 7 2.00, 7.00, 8.002.00, 7.00, 8.00思考:对两个变量思考:对两个变量a a和和b b的值,为什么的值,为什么要引入中间变量要引入

50、中间变量t ?t ?直接用直接用a=b;b=a;a=b;b=a;来交换行吗?来交换行吗?613.4 3.4 选择结构选择结构例例3-12 3-12 写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。 分析:满足下列两个条件之一的年份为闰年:能被分析:满足下列两个条件之一的年份为闰年:能被4 4整整除,但不能被除,但不能被100100整除的年份;能被整除的年份;能被4 4整除,又能被整除,又能被400400整除的年份;整除的年份;考虑到对任一个年份来说,要么为闰年,要么为非闰年,考虑到对任一个年份来说,要么为闰年,要么为非闰年,两者必居其一。因此可以引入一个标志变量两者必居其一。因此可以引

51、入一个标志变量leapleap代表代表是否闰年的信息。若某年为闰年,则令是否闰年的信息。若某年为闰年,则令leap=1leap=1;若为;若为非闰年,令非闰年,令1eap1eap0 0。最后判断。最后判断leapleap是否为是否为1( 1(真真) ),若是,若是,则输出则输出“闰年闰年”信息。信息。我们用图我们用图3-83-8表示判别闰年的算法。表示判别闰年的算法。623.4 3.4 选择结构选择结构#include #include main()main() int year, leap; int year, leap; printf(Please input year:); printf

52、(Please input year:); scanf(%d, &year); scanf(%d, &year); if (year%4=0) if (year%4=0) if (year%100=0) if (year%100=0) if (year%400=0) if (year%400=0) leap=1; leap=1; else leap=0; else leap=0; else leap=1; else leap=1; else leap=0; else leap=0;if (leap)if (leap)printf(%d is a leap yearn, year

53、);printf(%d is a leap yearn, year);elseelse printf(%d is not a leap yearn, year); printf(%d is not a leap yearn, year); 运行情况如下运行情况如下: :Please input year:1989Please input year:19891989 is not a leap year1989 is not a leap yearPlease input year:2004Please input year:20042004 is a leap year2004 is a le

54、ap year思考:程序的最后一个思考:程序的最后一个if if语句的语句的if (leap) if (leap) 为什么为什么不写成不写成if (leap=1)?if (leap=1)?633.4 3.4 选择结构选择结构 说明:本例中通过引入标志变量说明:本例中通过引入标志变量leapleap来表示两种不同状态值的方法,对优来表示两种不同状态值的方法,对优化程序和提高程序的可读性非常有效,希望能够理解并掌握。化程序和提高程序的可读性非常有效,希望能够理解并掌握。 从流程图可以看到,对闰年进行判断时有四个可能的出口。上述程序代码从流程图可以看到,对闰年进行判断时有四个可能的出口。上述程序代码

55、的写法可以理解为对四个出口从左到右扫描得到,那么若对四个出口从右到左的写法可以理解为对四个出口从左到右扫描得到,那么若对四个出口从右到左扫描则也可以将程序中第扫描则也可以将程序中第7 71515行改写成以下的行改写成以下的if if语句:语句: if(year if(year4 !=0) 1eap=04 !=0) 1eap=0; else if(year else if(year100!=0) leap=1100!=0) leap=1; else if(year else if(year400!=0) 1eap=0400!=0) 1eap=0; else leap=1; else leap=1

56、; 也可以用一个逻辑表达式包含所有的闰年条件,将上述也可以用一个逻辑表达式包含所有的闰年条件,将上述if if语句用下面的语句用下面的if if语语句代替:句代替: if(yearif(year4 40 0yearyear100 !=0) | (year100 !=0) | (year400=0) leap=1400=0) leap=1; else leap=0else leap=0;643.4 3.4 选择结构选择结构 例例3-13 3-13 求下列分段函数的值:求下列分段函数的值: 分析:上述的分段函数可以分析:上述的分段函数可以看作一个多分支选择问题,看作一个多分支选择问题,有两种解法。

57、有两种解法。5 . 45 . 3235 . 35 . 22*35 . 25 . 1235 . 15 . 023xxxxxxxxy法一:利用法一:利用if if语句的嵌套所对应的源程序:语句的嵌套所对应的源程序:#include #include main()main() float x, y;float x, y;printf(Please input x:);printf(Please input x:);scanf(%f, &x);scanf(%f, &x);if(x=4.5)if(x=4.5) printf(x errorn); printf(x errorn);else

58、else if (x1.5) y=3+2 if (x1.5) y=3+2* *x;x; else if (x2.5) y=3-2 else if (x2.5) y=3-2* *x;x; else if (x3.5) y=3 else if (x3.5) y=3* *2 2* *x;x; else y=3/(2 else y=3/(2* *x);x);printf(y=%fn, y);printf(y=%fn, y); 法二:使用法二:使用switchswitch语句,注意如何完成从区间值到语句,注意如何完成从区间值到点的转化。观察原来四个区间的特点,可以采用点的转化。观察原来四个区间的特点,可

59、以采用把原来把原来x x值加上值加上0.50.5再取整,或者把原来再取整,或者把原来x x值除以值除以0.0.5 5再取整两种方法。下面是采用前面一种方法所对再取整两种方法。下面是采用前面一种方法所对应的源程序:应的源程序:#include #include main()main() float x, y;float x, y; printf(Please input x:); printf(Please input x:); scanf(%f, &x); scanf(%f, &x);switch switch ( ( (intint) )(x+0.5)(x+0.5) ) ca

60、se 1: y=3+2 case 1: y=3+2* *x; printf(y=%fn, y); break;x; printf(y=%fn, y); break; case 2: y=3-2 case 2: y=3-2* *x; printf(y=%fn, y); break;x; printf(y=%fn, y); break; case 3: y=3 case 3: y=3* *2 2* *x; printf(y=%fn, y); break;x; printf(y=%fn, y); break; case 4: y=3/(2 case 4: y=3/(2* *x); printf(y=%fn, y); break;x); printf(y=%fn, y); break; default: printf(x errorn); default: printf(x errorn); 运行情况如下:运行情况如下:Plea

温馨提示

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

评论

0/150

提交评论