条件语句与选择结构程序设计.ppt

上传人:小飞机 文档编号:6584223 上传时间:2023-11-15 格式:PPT 页数:64 大小:651KB
返回 下载 相关 举报
条件语句与选择结构程序设计.ppt_第1页
第1页 / 共64页
条件语句与选择结构程序设计.ppt_第2页
第2页 / 共64页
条件语句与选择结构程序设计.ppt_第3页
第3页 / 共64页
条件语句与选择结构程序设计.ppt_第4页
第4页 / 共64页
条件语句与选择结构程序设计.ppt_第5页
第5页 / 共64页
点击查看更多>>
资源描述

《条件语句与选择结构程序设计.ppt》由会员分享,可在线阅读,更多相关《条件语句与选择结构程序设计.ppt(64页珍藏版)》请在三一办公上搜索。

1、,第4章 选择结构程序设计,顺序结构程序由各种基本语句组成,并严格按照语句的书写顺序执行。在解决实际问题的过程中,常常需要程序根据对某个特定条件的测试来决定下一步要进行的操作。为此,C 语言提供了可以进行程序流程选择控制的语句,这些语句构成的程序结构称为选择结构,也称为分支结构,是结构化程序设计的三种基本结构之一。本章主要介绍选择结构语句。,4.1 选择结构的概念 4.2 if语句 4.3 switch 语句 4.4 程序举例,第4章,第4章 选择结构程序设计,4.1 选择结构的概念,到目前为止,所介绍的程序都属于顺序结构,顺序结构程序中的所有语句都将被按照书写的顺序执行一次。但是在实际应用中

2、,常常需要根据不同情况选择不同的执行语句,这时需要设计分支结构。例如,在前面我们介绍了用海伦公式求三条边长分别为 3、4、5 的三角形的面积。该程序的局限性很大,它不能判别三边长度是否满足构成三角形的条件。为此,将该问题的算法用流程图和N-S图描述,如图3-1所示。,图3-1 使用海伦公式求三角形面积的流程图和N-S图描述,4.1 选择结构的概念,#include#include void main()float a,b,c,p,s;/*定义单精度实型变量a,b,c,p,s*/printf(input a,b,c=);/*输出提示信息*/scanf(%f,%f,%f,4.1 选择结构的概念,程

3、序运行结果:input a,b,c=3,4,5s=6.00input a,b,c=0,2,3data error!input a,b,c=9,2,4data error!,此程序在执行时,由用户键入三角形的三边长度,通过程序第7行“if()”判断输入数据是否满足构成三角形的条件:所有的边长大于0,并且所有两边之和均要大于第三边。若满足,则计算并输出结果;反之,只要其中有一个条件不满足,就不能构成三角形,程序输出“data error!”出错信息。在C语言中,当需要根据选择条件来确定程序的执行流程,选择某一个分支来执行,这样的程序结构被称为选择结构(分支、结构)。C语言提供了两种控制语句来实现这

4、种选择结构:if条件语句和switch开关语句。,4.1 选择结构的概念,4.2 if 语句,选择结构程序设计中条件语句的作用是,使程序按某种条件有选择地执行一条或多条语句。用if语句可以构成选择(分支)结构。它根据给定的条件进行判断,以决定执行某个分支程序段。C语言的if语句有三种基本形式。,4.2 if语句,4.2.1 if语句的三种形式1.第一种形式(单分支选择结构)语句格式如下:if(表达式)语句;语句功能:首先计算表达式的值,若表达式的值为真(非0),则执行语句;若表达式的值为假(0),则该语句不起作用,继续执行下面的语句。其流程图和N-S图描述,如图3-2所示。,例4.1 任意输入

5、两个整数,输出其中的大数。,(a)流程图描述,(b)N-S图描述,4.2 if语句,程序运行结果:input a,b=5,3max=5,#include void main()int a,b,max;/*定义整型变量a,b,max*/printf(input a,b=);/*输出提示信息*/scanf(%d,%d,/*输出max的值*/,4.2 if语句,例4.2 输入一个成绩,当成绩60时,输出“Pass!”,否则什么都不输出。,#include void main()float score;/*定义整型变量score,用以表示成绩*/printf(input score:);/*输出提示信

6、息*/scanf(%f,/*成绩大于等于60分,输出Pass!*/,程序运行结果:input score:75Pass!/*成绩大于等于60分输出Pass!*/input score:55/*成绩小于60分什么都不输出*/input score:95Pass!/*成绩大于等于60分输出Pass!*/,4.2 if语句,2第二种形式(双分支选择结构)语句格式:if(表达式)语句1;else 语句2;语句功能:首先计算表达式的值,若表达式的值为真(非0),则执行语句1,否则执行语句2。流程图和NS图描述如图所示。,(a)流程图描述,(b)N-S图描述,4.2 if语句,例4.3 任意输入两个整数,

7、输出其中的大数。,(a)流程图描述,(b)N-S图描述,4.2 if语句,#include void main()int a,b;/*定义整型变量a,b*/printf(input a,b=);/*输出提示信息*/scanf(%d,%d,/*若a=b,则把b赋给max并输出*/,程序运行结果:input a,b=33,55max=55,4.2 if语句,例4.4 输入一个成绩,当成绩60时,输出“Pass!”,否则输出“Fail!”。,#include void main()float score;/*定义整型变量score,用以表示成绩*/printf(input score:);/*输出提

8、示信息*/scanf(%f,/*成绩小于60分,输出Fail!*/,程序运行结果:input score:75Pass!input score:55Fail!,4.2 if语句,4第三种形式(多分支选择结构)前两种形式的if语句一般用于两个分支的情况。当有多个分支选择时,可采用下列多分支选择结构。语句格式:if(表达式1)语句 1;else if(表达式2)语句 2;else if(表达式3)语句 3;else if(表达式n)语句 n;else 语句 n+1;,语句功能:首先计算表达式1的值,若表达式1的值为真(非0),则执行语句1,否则计算表达式2的值,若表达式2的值为真(非0),则执行语

9、句2,否则计算表达式3的值,若表达式3的值为真(非0),则执行语句3,所有的表达式的值都是0时,执行语句n+1。,4.2 if语句,(a)流程图描述,4.2 if语句,图3-6 多分支选择结构的执行过程,(b)N-S图描述,4.2 if语句,例4.5 输入一个成绩,当成绩60时,输出“Fail!”;当成绩在6069之间时,输出“Pass!”;当成绩在7079之间时,输出“Good!”;当成绩80时,输出“Very Good!”。,(a)流程图描述,(b)N-S图描述,4.2 if语句,#include void main()float score;printf(input score:);sc

10、anf(%f,/*成绩大于等于80分,输出Very Good!*/,程序运行结果:input score:55 Fail!input score:65 Pass!input score:95 Very Good!,4.2 if语句,关于if语句的说明和注意事项:表达式一般为关系表达式或逻辑表达式,C语言在进行判断时,只要表达式的值不为0,就认为是真。因此,表达式可以是任意类型的表达式(整型、实型、字符型等)。例如:if(c=getchar()printf(%c,c);输入一个字符,赋给变量c,只要输入的不是0,就输出输入的字符。,4.2 if语句,关于if语句的说明和注意事项:当条件表达式是一

11、个简单变量时,常用如下两种简 化形式。例如:if(x!=0)可简化成 if(x)if(x=0)可简化成 if(!x)if语句中的“语句”从语法上讲只能是一条语句,而不能有多条语句。如果有多条语句的话,就要用花括号括起来组成一个复合语句。,4.2 if语句,例3.6 任意输入2个整数,按代数值从小到大的顺序输出这2个整数。,#include void main()int a,b,t;/*定义整型变量a,b,t*/printf(input a,b=);/*输出提示信息*/scanf(%d,%d,/*输出a,b的值*/,程序运行结果:input a,b=55,3333 55,4.2 if语句,在程序

12、中,如果将 if(ab)t=a;a=b;b=t;写成:if(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没有赋过值,则会出错。,#include void main()int a,b,t;printf(input a,b=);scanf(%d,%d,例4.6 任意输入2个整数,按代数值从小到大的顺序输出这2个整数。,4.2 if语句,在 if 语句中又包含一个或多个if语句,称为 if 语句的嵌套。其一般形式如下:if(表达式1)if(表达式2)语句1;else 语句2;

13、else if(表达式3)语句3;else 语句4;,4.2.2 if 语句的的嵌套,4.2 if语句,4.2 if语句,在嵌套的if语句中规定,else总是与它上面最近的尚未与else配对的if配对。因此,在使用if语句嵌套的时候,应当注意if与else的配对关系。例如,对于下面的形式:if(表达式1)if(表达式2)语句1;else if(表达式2)语句2;else 语句3;,程序设计者希望第三行的else与第一行的if对应,但实际上else总是与它前面最近的未配对的if配对,因此第三行的else是与第二行的if配对,因为它们相距最近。所以内嵌套的if语句也包含else部分,如果if与el

14、se的数目不能一致,为实现程序设计者的意图,可以加花括号来确定配对关系。例如:if(表达式1)if(表达式2)语句1;else 语句2;,4.2 if语句,例4.7 修改例4.4,排除不可能的分数。例 4.4 并不是一个完整的程序,它要求输入的分数应该是 0100 之间,否则不能给出正确结果。例如输入-5 或 101,都将被认为是不正确的。使用嵌套的 if 语句则可以排除不可能的分数。,4.2 if语句,#include void main()float score;/*定义整型变量score,用以表示成绩*/printf(input score:);/*输出提示信息*/scanf(%f,/*

15、提示输入数据有误*/,程序运行结果:input score:75Pass!input score:155Error score!,4.2 if语句,本例是在ifelse形式的if分支中又嵌套了一个ifelse语句。前面介绍的很多程序都未对输入的数据是否符合实际情况进行判断,这其实不是一种好的设计思想。好的程序设计者应该了解所有被处理的数据的范围,如果用户输入的数据不在正确范围内,应该提示用户输入数据有误。,4.2 if语句,例4.8 有一分段函数,编写程序,要求输入一个x值,输出y值。,4.2 if语句,4.2 if语句,(b)N-S图描述,4.2 if语句,4.2 if语句,#include

16、#include void main()float x,y;printf(input x=);scanf(%f,/*输出x,y的值*/,程序运行结果:input x=-3.0 x=-3.000,y=3.000input x=8.0 x=8.000,y=29.000,4.2 if语句,4.3 switch语句,前面介绍的if语句,常用于两种情况的选择结构,要表示两种以上条件的选择结构,则要用if语句的嵌套形式,但如果嵌套的if语句比较多时,程序比较冗长且可读性降低。在C语言中,可直接用switch语句来实现多种情况的选择结构。,在C语言中,可直接用switch语句来实现多种情况的选择结构。其一般

17、形式如下:switch(表达式)case 常量1:语句1;case 常量2:语句2;case 常量3:语句3;case 常量n:语句n;default 语句n+1;/*根据需要可有可无*/,4.3 switch语句,switch语句的执行过程:首先计算表达式的值,并逐个与case后面的常量的值相比较,当表达式的值与某个常量的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后面的语句。如表达式的值与所有case后面的常量的值均不相等时,则执行default后面的语句。,图3-10 switch语句的执行过程,4.3 switch语句,switch(class)case A:

18、printf(GREAT!n);case B:printf(GOOD!n);case C:printf(OK!n);case D:printf(NO!n);default:printf(ERROR!n);若class的值为B,则输出结果是:GOOD!OK!NO!ERROR!若class的值为D,则输出结果是:NO!ERROR!若class的值为F,则输出结果是:ERROR!,从例题可以看到,switch语句的功能是:根据 switch 后面表达式的值找到匹配的入口处,就从此入口处开始执行下去,不再进行判断。,例如:,4.3 switch语句,关于switch语句的说明和注意事项:switch后

19、面圆括号内表达式以及case后面的常量的值必须为整型、字符型或枚举类型,并且每个case后面常量的类型应该与switch后面圆括号内表达式的类型一致。case后面常量的值必须互不相同,否则会出现相互矛盾的现象。,4.3 switch语句,多个case可以共用一组执行语句。例如:switch(ch)case A:case B:case C:printf(=60n);该switch语句表示当ch的值为A、B、C时,都会执行printf(=60n);语句。case和常量之间要有空格。case和default可以出现在任何位置,其先后次序不影响执行 结果,但习惯上将default放在switchcas

20、e结构的底部。,4.3 switch语句,例4.9 从键盘上输入一个大写字母,若字母为A输出GOOD!,字母为B输出OK!,字母为C输出NO!,输入其它字母,输出ERROR!。,#include void main()char ch;printf(input a character:);scanf(%c,程序运行结果:input a character:AGOOD!input a character:GERROR!,4.3 switch语句,也可以将程序中的switch结构改写成如下:#include void main()char ch;printf(input a character:);

21、scanf(%c,不影响执行的效果。但需要注意的是,当case与default的顺序或各case之间的顺序改变后,有关case或default后面的语句可能要做一些修改。例如,在上述修改中,要在原default中的语句后加一个break语句,原case C后面的break语句可以去掉。,4.3 switch语句,程序段的运行结果:x=1,y=0 x=2,switch结构可以嵌套,即在一个switch语句中嵌套另一个switch语句,这时可以用break语句使流程跳出switch结构,但是要注意break只能跳出最内层的switch语句。int x=1,y=0;switch(x)case 1:s

22、witch(y)case 0:printf(x=1,y=0n);break;case 1:printf(y=1n);break;case 2:printf(x=2n);,4.3 switch语句,例 4.10 从键盘上输入一个数字,输出一个有关星期几的英 文单词。,图3-11 例3.10的流程图描述,4.3 switch语句,#include void main()int a;printf(input integer number:);scanf(%d,/*若a匹配不成功,则输出输入有误信息*/,结果:input integer number:5 Friday input integer nu

23、mber:55 input error!,思考:若将程序中的所有break语句去掉,程序的结果会正确吗?如果不正确将会出现什么情况?,4.3 switch语句,4.4 程序举例,4.4 程序举例,例4.11 从键盘上输入一个字符,请判别输入字符的种类,即判别它是数字字符、英文字符、空格或回车,还是其他字符。,(a)流程图描述,(b)N-S图描述,4.4 程序举例,#include void main()char ch;printf(Input a character:);ch=getchar();/*从键盘输入一个字符*/if(ch=|ch=n)/*若字符为空格或回车,则输出为空格或回车*/p

24、rintf(This is a blank or enter.n);else if(ch=0,程序运行结果:Input a haracter:55This is a digit.Input a character:+This is anothercharacter.,4.4 程序举例,例4.12 编写一个程序,求一元二次方程 的根。一元二次方程的求根公式为:,因此,程序必须对系数、的各种可能的情况分别进行处理:(1)当 时,方程无解。(2)当 时,方程的解为。(3)当 时,时,有两个不相等的实根。时,有两个相等的实根。时,有两个共轭复根。,4.4 程序举例,(a)流程图描述,4.4 程序举例,

25、(b)N-S图描述,4.4 程序举例,#include#include void main()float a,b,c,d,r,p;/*定义单精度实型变量a,b,c,d,r,p*/float x1,x2;/*定义单精度实型变量x1,x2*/printf(input a,b,c=);/*输出提示信息*/scanf(%f,%f,%f,/*若a=0,b0,则方程有一个实根*/,4.4 程序举例,else d=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);/*若a

26、0,b2-4ac0则有两个不相等的实根*/else r=-b/(2*a);p=sqrt(-d)/(2*a);/*若a0,b2-4ac0则方程有两个共轭复根*/printf(x1=%f+%finx2=%f-%fin,r,p,r,p);,4.4 程序举例,程序运行结果:input a,b,c=2,6,1x1=-0.177124 x2=-2.822876input a,b,c=1,3,5x1=-1.500000+1.658312ix1=-1.500000-1.658312iinput a,b,c=2,4,2x1=x2=-1.000000input a,b,c=0,0,1No answer!,我们在前

27、面讲过,由于实数在计算和存储时会有一些微小的误差,从而实数一般不能直接进行判断“相等”,而是判断接近或近似。因此,对于判断实数a、b、d是否等于0时,我们采用的办法是判别a、b、d的绝对值fabs(a)、fabs(b)、fabs(d)是否小于一个很小的数(例如10-6)。如果小于此数,就认为a、b、d等于0。,4.4 程序举例,4.4 程序举例,图3-14 例3.13的流程图描述,4.4 程序举例,程序运行结果:input a score(0-100):7575:C,#include void main()int score,grade;printf(input a score(0-100):

28、);scanf(%d,/*显示输入有误信息*/,4.4 程序举例,例4.14 四则运算程序。用户输入两个运算量及一个运算符,输出运算结果。首先输入参加运算的两个数和一个运算符号,然后根据运算符号来做相应的运算,但是在做除法运算时,应判别除数是否为0,如果为0,运算非法,给出错误提示。如果运算符号不是+、-、*、/,则同样是非法的,也给出错误提示。其他情况,输出运算的结果。,4.4 程序举例,图3-15 例3.14的流程图描述,4.4 程序举例,#include void main()float a,b,result;int flag;char ch;flag=0;/*运算合法标志flag,置0

29、为合法,置1为非法*/printf(input expressin:a+(-,*,/)bn);/*输出提示信息*/scanf(%f%c%f,4.4 程序举例,程序运行结果:input expressin:a+(-,*,/)b3+53.000000+5.000000=8.000000input expressin:a+(-,*,/)b9/0divisor is zero!input expressin:a+(-,*,/)b55!66input error!,4.4 程序举例,通过本章的学习,要熟练掌握if语句和 switch 语句的使用。注意正确使用if语句的三种形式以及嵌套的if语句。在使用switch语句时,一定要注意,在没有使用break语句的情况下,case语句的各个语句是逐句执行的,而不是执行一条语句就跳出switch语句。选择结构是结构化程序设计的一个基本结构。它根据输入的数据或中间结果的情况,选择一组语句执行(在不同的情况下,选择不同的语句组执行)。在编程序时,必须将所有的情况都考虑进去,并写出在各种情况下所对应的语句组。,本 章 小 结,

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号