第3章-选择结构程序设计ppt课件_第1页
第3章-选择结构程序设计ppt课件_第2页
第3章-选择结构程序设计ppt课件_第3页
第3章-选择结构程序设计ppt课件_第4页
第3章-选择结构程序设计ppt课件_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

,第3章选择结构程序设计,顺序结构程序由各种基本语句组成,并严格按照语句的书写顺序执行。在解决实际问题的过程中,常常需要程序根据对某个特定条件的测试来决定下一步要进行的操作。为此,C语言提供了可以进行程序流程选择控制的语句,这些语句构成的程序结构称为选择结构,也称为分支结构,是结构化程序设计的三种基本结构之一。本章主要介绍选择结构语句。,3.1选择结构的概念3.2if语句3.3switch语句3.4程序举例,第3章,第3章选择结构程序设计,3.1选择结构的概念,到目前为止,所介绍的程序都属于顺序结构,顺序结构程序中的所有语句都将被按照书写的顺序执行一次。但是在实际应用中,常常需要根据不同情况选择不同的执行语句,这时需要设计分支结构。例如,在前面我们介绍了用海伦公式求三条边长分别为3、4、5的三角形的面积。该程序的局限性很大,它不能判别三边长度是否满足构成三角形的条件。为此,将该问题的算法用流程图和N-S图描述,如图3-1所示。,图3-1使用海伦公式求三角形面积的流程图和N-S图描述,3.1选择结构的概念,#include#includevoidmain()floata,b,c,p,s;/*定义单精度实型变量a,b,c,p,s*/printf(inputa,b,c=);/*输出提示信息*/scanf(%f,%f,%f,3.1选择结构的概念,程序运行结果:inputa,b,c=3,4,5s=6.00inputa,b,c=0,2,3dataerror!inputa,b,c=9,2,4dataerror!,此程序在执行时,由用户键入三角形的三边长度,通过程序第7行“if()”判断输入数据是否满足构成三角形的条件:所有的边长大于0,并且所有两边之和均要大于第三边。若满足,则计算并输出结果;反之,只要其中有一个条件不满足,就不能构成三角形,程序输出“dataerror!”出错信息。在C语言中,当需要根据选择条件来确定程序的执行流程,选择某一个分支来执行,这样的程序结构被称为选择结构(分支、结构)。C语言提供了两种控制语句来实现这种选择结构:if条件语句和switch开关语句。,3.1选择结构的概念,3.2if语句,选择结构程序设计中条件语句的作用是,使程序按某种条件有选择地执行一条或多条语句。用if语句可以构成选择(分支)结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种基本形式。,3.2if语句,3.2.1if语句的三种形式1.第一种形式(单分支选择结构)语句格式如下:if(表达式)语句;语句功能:首先计算表达式的值,若表达式的值为真(非0),则执行语句;若表达式的值为假(0),则该语句不起作用,继续执行下面的语句。其流程图和N-S图描述,如图3-2所示。,例3.1任意输入两个整数,输出其中的大数。,(a)流程图描述,(b)N-S图描述,3.2if语句,程序运行结果:inputa,b=5,3max=5,#includevoidmain()inta,b,max;/*定义整型变量a,b,max*/printf(inputa,b=);/*输出提示信息*/scanf(%d,%d,/*输出max的值*/,3.2if语句,例3.2输入一个成绩,当成绩60时,输出“Pass!”,否则什么都不输出。,#includevoidmain()floatscore;/*定义整型变量score,用以表示成绩*/printf(inputscore:);/*输出提示信息*/scanf(%f,/*成绩大于等于60分,输出Pass!*/,程序运行结果:inputscore:75Pass!/*成绩大于等于60分输出Pass!*/inputscore:55/*成绩小于60分什么都不输出*/inputscore:95Pass!/*成绩大于等于60分输出Pass!*/,3.2if语句,2第二种形式(双分支选择结构)语句格式:if(表达式)语句1;else语句2;语句功能:首先计算表达式的值,若表达式的值为真(非0),则执行语句1,否则执行语句2。流程图和NS图描述如图所示。,(a)流程图描述,(b)N-S图描述,3.2if语句,例3.3任意输入两个整数,输出其中的大数。,(a)流程图描述,(b)N-S图描述,3.2if语句,#includevoidmain()inta,b;/*定义整型变量a,b*/printf(inputa,b=);/*输出提示信息*/scanf(%d,%d,/*若ab)t=a;a=b;b=t;当a=55、b=33时,执行后可得到a=55和b=33。当a=33、b=55时,执行ab为假,t=a不被执行,但a=b和b=t要执行,若t没有赋过值,则会出错。,#includevoidmain()inta,b,t;printf(inputa,b=);scanf(%d,%d,例3.6任意输入2个整数,按代数值从小到大的顺序输出这2个整数。,3.2if语句,在if语句中又包含一个或多个if语句,称为if语句的嵌套。其一般形式如下:if(表达式1)if(表达式2)语句1;else语句2;elseif(表达式3)语句3;else语句4;,3.2.2if语句的的嵌套,3.2if语句,3.2if语句,在嵌套的if语句中规定,else总是与它上面最近的尚未与else配对的if配对。因此,在使用if语句嵌套的时候,应当注意if与else的配对关系。例如,对于下面的形式:if(表达式1)if(表达式2)语句1;elseif(表达式2)语句2;else语句3;,程序设计者希望第三行的else与第一行的if对应,但实际上else总是与它前面最近的未配对的if配对,因此第三行的else是与第二行的if配对,因为它们相距最近。所以内嵌套的if语句也包含else部分,如果if与else的数目不能一致,为实现程序设计者的意图,可以加花括号来确定配对关系。例如:if(表达式1)if(表达式2)语句1;else语句2;,3.2if语句,例3.7修改例3.4,排除不可能的分数。例3.4并不是一个完整的程序,它要求输入的分数应该是0100之间,否则不能给出正确结果。例如输入-5或101,都将被认为是不正确的。使用嵌套的if语句则可以排除不可能的分数。,3.2if语句,#includevoidmain()floatscore;/*定义整型变量score,用以表示成绩*/printf(inputscore:);/*输出提示信息*/scanf(%f,/*提示输入数据有误*/,程序运行结果:inputscore:75Pass!inputscore:155Errorscore!,3.2if语句,本例是在ifelse形式的if分支中又嵌套了一个ifelse语句。前面介绍的很多程序都未对输入的数据是否符合实际情况进行判断,这其实不是一种好的设计思想。好的程序设计者应该了解所有被处理的数据的范围,如果用户输入的数据不在正确范围内,应该提示用户输入数据有误。,3.2if语句,例3.8有一分段函数,编写程序,要求输入一个x值,输出y值。,3.2if语句,3.2if语句,(b)N-S图描述,3.2if语句,3.2if语句,#include#includevoidmain()floatx,y;printf(inputx=);scanf(%f,/*输出x,y的值*/,程序运行结果:inputx=-3.0x=-3.000,y=3.000inputx=8.0x=8.000,y=29.000,3.2if语句,3.3switch语句,前面介绍的if语句,常用于两种情况的选择结构,要表示两种以上条件的选择结构,则要用if语句的嵌套形式,但如果嵌套的if语句比较多时,程序比较冗长且可读性降低。在C语言中,可直接用switch语句来实现多种情况的选择结构。,在C语言中,可直接用switch语句来实现多种情况的选择结构。其一般形式如下:switch(表达式)case常量1:语句1;case常量2:语句2;case常量3:语句3;case常量n:语句n;default语句n+1;/*根据需要可有可无*/,3.3switch语句,switch语句的执行过程:首先计算表达式的值,并逐个与case后面的常量的值相比较,当表达式的值与某个常量的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后面的语句。如表达式的值与所有case后面的常量的值均不相等时,则执行default后面的语句。,图3-10switch语句的执行过程,3.3switch语句,switch(class)caseA:printf(GREAT!n);caseB:printf(GOOD!n);caseC:printf(OK!n);caseD:printf(NO!n);default:printf(ERROR!n);若class的值为B,则输出结果是:GOOD!OK!NO!ERROR!若class的值为D,则输出结果是:NO!ERROR!若class的值为F,则输出结果是:ERROR!,从例题可以看到,switch语句的功能是:根据switch后面表达式的值找到匹配的入口处,就从此入口处开始执行下去,不再进行判断。,例如:,3.3switch语句,关于switch语句的说明和注意事项:switch后面圆括号内表达式以及case后面的常量的值必须为整型、字符型或枚举类型,并且每个case后面常量的类型应该与switch后面圆括号内表达式的类型一致。case后面常量的值必须互不相同,否则会出现相互矛盾的现象。,3.3switch语句,多个case可以共用一组执行语句。例如:switch(ch)caseA:caseB:caseC:printf(=60n);该switch语句表示当ch的值为A、B、C时,都会执行printf(=60n);语句。case和常量之间要有空格。case和default可以出现在任何位置,其先后次序不影响执行结果,但习惯上将default放在switchcase结构的底部。,3.3switch语句,例3.9从键盘上输入一个大写字母,若字母为A输出GOOD!,字母为B输出OK!,字母为C输出NO!,输入其它字母,输出ERROR!。,#includevoidmain()charch;printf(inputacharacter:);scanf(%c,程序运行结果:inputacharacter:AGOOD!inputacharacter:GERROR!,3.3switch语句,也可以将程序中的switch结构改写成如下:#includevoidmain()charch;printf(inputacharacter:);scanf(%c,不影响执行的效果。但需要注意的是,当case与default的顺序或各case之间的顺序改变后,有关case或default后面的语句可能要做一些修改。例如,在上述修改中,要在原default中的语句后加一个break语句,原caseC后面的break语句可以去掉。,3.3switch语句,程序段的运行结果:x=1,y=0 x=2,switch结构可以嵌套,即在一个switch语句中嵌套另一个switch语句,这时可以用break语句使流程跳出switch结构,但是要注意break只能跳出最内层的switch语句。intx=1,y=0;switch(x)case1:switch(y)case0:printf(x=1,y=0n);break;case1:printf(y=1n);break;case2:printf(x=2n);,3.3switch语句,例3.10从键盘上输入一个数字,输出一个有关星期几的英文单词。,图3-11例3.10的流程图描述,3.3switch语句,#includevoidmain()inta;printf(inputintegernumber:);scanf(%d,/*若a匹配不成功,则输出输入有误信息*/,结果:inputintegernumber:5Fridayinputintegernumber:55inputerror!,思考:若将程序中的所有break语句去掉,程序的结果会正确吗?如果不正确将会出现什么情况?,3.3switch语句,3.4程序举例,3.4程序举例,例3.11从键盘上输入一个字符,请判别输入字符的种类,即判别它是数字字符、英文字符、空格或回车,还是其他字符。,(a)流程图描述,(b)N-S图描述,3.4程序举例,#includevoidmain()charch;printf(Inputacharacter:);ch=getchar();/*从键盘输入一个字符*/if(ch=|ch=n)/*若字符为空格或回车,则输出为空格或回车*/printf(Thisisablankorenter.n);elseif(ch=0,程序运行结果:Inputaharacter:55Thisisadigit.Inputacharacter:+Thisisanothercharacter.,3.4程序举例,例3.12编写一个程序,求一元二次方程的根。一元二次方程的求根公式为:,因此,程序必须对系数、的各种可能的情况分别进行处理:(1)当时,方程无解。(2)当时,方程的解为。(3)当时,时,有两个不相等的实根。时,有两个相等的实根。时,有两个共轭复根。,3.4程序举例,(a)流程图描述,3.4程序举例,(b)N-S图描述,3.4程序举例,#include#includevoidmain()floata,b,c,d,r,p;/*定义单精度实型变量a,b,c,d,r,p*/floatx1,x2;/*定义单精度实型变量x1,x2*/printf(inputa,b,c=);/*输出提示信息*/scanf(%f,%f,%f,/*若a=0,b0,则方程有一个实根*/,3.4程序举例,elsed=b*b-4*a*c;if(fabs(d)1e-6)x1=(-b+sqrt(d)/(2*a);x2=(-b-sqrt(d)/(2*a);printf(x1=%ftx2=%fn,x1,x2);/*若a0,b2-4ac0则有两个不相等的实根*/elser=-b/(2*a);p=sqrt(-d)/(2*a);/*若a0,b2-4ac0则方程有两个共轭复根*/printf(x1=%f+%finx2=%f-%fin,r,p,r,p);,3.4程序举例,程序运行结果:inputa,b,c=2,6,1x1=-0.177124x2=-2.822876inputa,b,c=1,3,5x1=-1.500000+1.658312ix1=-1.500000-1.658312iinputa,b,c=2,4,2x1=x2=-1.000000inputa,b,c=0,0,1Noanswer!,我们在前面讲过,由于实数在计算和存储时会有一些微小的误差,从而实数一般不能直接进行判断“相等”,而是判断接近或近似。因此,对于判断实数a、b、d是否等于0时,我们采用的办法是判别a、b、d的绝对值fabs(a)、fabs(b)、fabs(d)是否小于一个很小的数(例如10-6)。如果小于此数,就认为a、b、d等于0。,3.4程序举例,3.4程序举例,图3-14例3.13的流程图描述,3.4程序举例,程序运行结果:inputascore(0-100):7575:C,#includevoidmain()intscore,grade;printf(inputascore(0-100):);scanf(%d,/*显示输入有误信息*/,3.4程序举例,例3.14四

温馨提示

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

评论

0/150

提交评论