第5章 选择结构程序设计教材_第1页
第5章 选择结构程序设计教材_第2页
第5章 选择结构程序设计教材_第3页
第5章 选择结构程序设计教材_第4页
第5章 选择结构程序设计教材_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、5.1if语句语句5.2switch语句语句5.3程序举例程序举例第第5 5章章 选择结构程序设计选择结构程序设计选择结构的应用场合选择结构的应用场合 当我们不知向何处走时,会抬头当我们不知向何处走时,会抬头看看路牌,当某个方向满足了我们的看看路牌,当某个方向满足了我们的要求,则会走去。在程序设计中当某要求,则会走去。在程序设计中当某条件成立,执行某段程序;不成立,条件成立,执行某段程序;不成立,执行另一段程序。此时,即为选择结执行另一段程序。此时,即为选择结构,可使用构,可使用 if if 或或 switch switch 语句完成语句完成该功能。例如:该功能。例如:【引例【引例】计算函数值

2、:计算函数值: ySin(x)/x x 0 1 x=0需要考虑:需要考虑: 1. 输入输入x 2. 判断判断x值值 3. 根据根据x值,计算值,计算y值值 4. 输出输出y值值显然显然2、3顺序程序不能够实现上述式子的编程,需顺序程序不能够实现上述式子的编程,需引入选择结构程序。引入选择结构程序。选择结构选择结构是是三种基本结构三种基本结构之一,特点是:之一,特点是: 根据指定条件根据指定条件 :成立时执行一组操作,不成:成立时执行一组操作,不成立时执行另一组操作。立时执行另一组操作。输入输入xx为为0?y=1假假真真y=sin(x)/x输出输出y【程序【程序】#include #includ

3、e main( ) float x,y; printf(“Enter x:”);scanf(“%f”,&x); if (x!=0.0) y=sin(x)/x; else y=1 ; printf (“x=%5.2fty=%7.4fn”, x, y); 选择结构选择结构运行结果:运行结果: Enter x: 2 x= 2.00 y= 0.4546关系运算关系运算注意:注意:例例 注意区分注意区分“=”与与“=”分析下列程序分析下列程序#main() int x=9,y=8,z=7; int a,b,c; a=xyz; b=-x-y=z; c=x=y; printf(“x=%d y=%d z=%d

4、n”,x,y,z); printf(“a=%d b=%d c=%dn”,a,b,c); 选择结构中使用的一种语句。选择结构中使用的一种语句。 根据给定的条件判别根据给定的条件判别是否满足,以决定执行哪种操作是否满足,以决定执行哪种操作。5.1.1 5.1.1 if if 语句的三种形式语句的三种形式 1.1.第一种形式的条件语句第一种形式的条件语句 if ( (表达式)语句表达式)语句 表达式表达式可以是常量、变量、表达式。可以是常量、变量、表达式。类型可以是类型可以是整、实、字符整、实、字符型型表达式表达式语句语句假假(0)真真(非非0)5.1 if 5.1 if 语句语句例例: main(

5、 ) int x=0; float y=-5.6; if(x) printf (“x=%dn”,x); if(y) printf (“y=%fn”, y); if(0) printf(“ 0=%dn”, 0); if(xy) printf (“x-y=%fn”, x-y); if(y -100) x+;y+; printf(“x=%d, y=%fn”, x, y); 运行结果:运行结果:y= -5.600000 0=48 x- y=5.600000 x=1, y=-4.6000002. 2. 第二种形式的条件语句第二种形式的条件语句( (双分支形式双分支形式) ) if(表达式)(表达式) 语

6、句语句1 else 语句语句2执行过程见图执行过程见图注:注:只执行两个语句中的一个语句只执行两个语句中的一个语句表达式表达式语句语句1语句语句2真真假假3. 3. 第三种形式的条件语句第三种形式的条件语句( (多分支选择形式多分支选择形式) ) 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(表达式表达式m) m) 语句语句m m else else 语句语句 n n 所示框图所示框图表达式表达式1假假真真表达式表

7、达式2表达式表达式3表达式表达式4语句语句5语句语句4语句语句3语句语句2语句语句1真真真真真真假假假假假假返回返回例例 输入成绩输入成绩g,按以下分数段打印:按以下分数段打印:if (g 60) printf(E ) ; else if(g70) printf(D );else if(g80) printf(C );else if(g90) printf(B );else printf(A );若入口语句的条件为:若入口语句的条件为:g90则块(无分支)则块(无分支)否则块(有分支)否则块(有分支)60090100(人口语句条件人口语句条件)g 608070Ag90B80 g 90D60 g

8、 70Eg 60C70 g 0 ) printf( %f , x ) ;elseprintf( %f , -x ) ;不要认为是两条语句不要认为是两条语句else、else if 子句子句不能单独存在不能单独存在,必须与,必须与if 语句语句配对配对。else if 子句子句可以没有,可以没有,也也可以有多个可以有多个。else 子句子句可以没有,可以没有,若有,则若有,则只能有一个只能有一个。例例 求求x的绝对值。的绝对值。内嵌语句需要的分号内嵌语句需要的分号main( )float a,b,t;scanf( %f%f, &a,&b );if(ab) t=a; a=b; b=t; print

9、f( %f,%fn, a, b ) ; 演示演示4-1返回返回3) 关于关于if、else、 else if 后面的内嵌操作语句。后面的内嵌操作语句。例例 输入两个实数,按由小到大的次序输出。输入两个实数,按由小到大的次序输出。此处不需另加分号此处不需另加分号此处换成:此处换成:t=a, a=b, b=t; ?返回返回2. if 语句的嵌套语句的嵌套( P99)当当if 语句中又包含一个或多个语句中又包含一个或多个if 语句时,称为语句时,称为if 语句的嵌套。语句的嵌套。60090100(人口语句条件人口语句条件)g 80则块(有分支)则块(有分支)否则块(有分支)否则块(有分支)80if

10、( )else内嵌内嵌if内嵌内嵌ifTFTTFF语句语句1g 80g 60g 90语句语句2语句语句3语句语句4if ( ) 语句语句1else 语句语句2if ( ) 语句语句3else 语句语句4g60g90g80分层缩进书写分层缩进书写建议用建议用“ ”if (ab)if(cd) x=1;elseif(ac)if(bb ) a=b; if( bc ) b=c;else c=b; c=a;if( ac ) ; b=a; a=c; c=b;返回返回1. 当当a=3, b=2, c=1时,执行以下语句后时,执行以下语句后 a = b =c = 。二、填空题二、填空题133内嵌语句为内嵌语句为

11、“空语句空语句”2. 当当a=3, b=2, c=1时,执行以下语句后时,执行以下语句后 a = b =c = 。212if ( ac ) ;b=a;a=c; c=b;if ( ac ) a=b;if ( byz xyx3. 以下程序实现:输入以下程序实现:输入三个整数三个整数,按,按从大到小从大到小的顺序进行输出。的顺序进行输出。输入输入 x, y, z输出输出 x, y, zTFxyxyTFxzxzTFyzyz(1)(1)关于表达式及其值,一般为逻辑表达式或关系表达式关于表达式及其值,一般为逻辑表达式或关系表达式或混合式,其值为或混合式,其值为0 0按按“假假”处理,非处理,非0 0按按“

12、真真”处理。处理。例如例如,ifif(a=b&x=ya=b&x=y) printfprintf(”a=b,x=y”a=b,x=y”);); ifif(3 3)printf(“ok.”);if(3)printf(“ok.”);if(3)是合法的是合法的, ,结果输出结果输出okok if if(aa)printfprintf(”d”,ad”,a); if(a); if(a)是是合法的合法的 由此可见,表达式的类型不限于逻辑表达式,可以是由此可见,表达式的类型不限于逻辑表达式,可以是任意的数值类型(包括整型、实型、字符型、指针型数任意的数值类型(包括整型、实型、字符型、指针型数据)。据)。 (2)

13、(2)对对 ifif(表达式(表达式) 语句语句1;1; else else 语句语句2;2;不要误认为上面是两个语句(不要误认为上面是两个语句(ifif语句和语句和elseelse语句),语句),它们都属于同一个它们都属于同一个ifif语句的两个子语句;语句的两个子语句;elseelse子句不子句不能作为语句单独使用,它必须与能作为语句单独使用,它必须与ifif配对使用;配对使用;注意注意语句语句后面有后面有“;”. .(3) (3) 在在ifif和和elseelse后面也可以有多个操作语句,此时应用后面也可以有多个操作语句,此时应用“ ” ”将几个语句括起来,成为一个复合语句。将几个语句括

14、起来,成为一个复合语句。【例例5.15.1】输入两个实数,按代数值由小到大输出。输入两个实数,按代数值由小到大输出。 void main( ) void main( ) float a, b, t; float a, b, t; scanf(“%f scanf(“%f, %f”, &a, &b); , %f”, &a, &b); if(ab) if(ab) t=a; a=b; b=t; t=a; a=b; b=t; printf printf (“%5.2f, %5.2fn”,a,b); (“%5.2f, %5.2fn”,a,b); 注意在注意在 外面不需要再加分号。外面不需要再加分号。输入:

15、输入: 输出:输出:3.6,-3.2 -3.20, 3.60 2.5,8.9 2.50, 8.90 5.1.2 5.1.2 if if 语句的语句的嵌套嵌套嵌套嵌套(nested)(nested):在:在ifif语句中,又包含语句中,又包含1 1到多个到多个if if 语句语句 一般形式:一般形式: if(if(表达式表达式1)1) if(if(表达式表达式2) 2) 语句语句1 1 else else 语句语句2 2 else else if(if(表达式表达式3) 3) 语句语句3 3 else else 语句语句4 4 条件成立时的内嵌语句条件成立时的内嵌语句条件不成立时的内嵌语句条件不

16、成立时的内嵌语句使用内嵌的使用内嵌的ifif语句时,应区分语句时,应区分表面形式表面形式与与实际作用实际作用 如:如: if( ) if( ) if if( ) ( ) 语句语句1 1 else else ifif( ) ( ) 语句语句2 2 elseelse 语句语句3 3 编程者希望把中间的编程者希望把中间的elseelse与第一行的与第一行的 ifif 匹配匹配,虽然书写时排得很整齐,但编译后程序的执行效,虽然书写时排得很整齐,但编译后程序的执行效果如何呢?果如何呢?在在C C语言中语言中,if,if与与else else 的配对原则是:的配对原则是: 从最内层开始,从最内层开始,el

17、seelse总是与它上面总是与它上面最近最近的,未曾配对的的,未曾配对的ifif配对配对。因此,上述问题在编译时的真正效果是:因此,上述问题在编译时的真正效果是: if( ) if( ) 等价于下述表示:等价于下述表示: 当条件成立时执行下面虚框当条件成立时执行下面虚框中的内容中的内容 if( ) if ( ) 语句语句1 else if( ) 语句语句2 else 语句语句3 是中间是中间else的子句的子句为了使程序清晰,不至出错为了使程序清晰,不至出错,采取的方法是:,采取的方法是: (1 1)使)使内嵌的内嵌的ifif也包含也包含elseelse, ,如上面的问题可进行如下描述:如上面

18、的问题可进行如下描述: if( ) if( ) else else if( ) else . (2) 若若ifif和和elseelse数目不等数目不等, ,为实现设计者的企图为实现设计者的企图, ,可用可用 实实现,如上述问题可进行如下描述:现,如上述问题可进行如下描述: if( ) if( ) 语句语句1 else if( ) 语句语句2 else 语句语句3 比较:比较: if(x) if(x) if(y) printf(“1”); if(y) printf(“1”); else printf(“2”); else printf(“2”); 由此看出,通过加由此看出,通过加“ ” ”可以改

19、变可以改变“else”else”的层位,的层位,从而改变程序的流程。从而改变程序的流程。void main( ) int x, y; scanf(“%d”,&x); if(x0) y= -1; else if(x=0) y=0; else y=1; printf(“x=%d, y=%dn”,x,y); -1 (x0)用不同方法编程,判正确与否用不同方法编程,判正确与否输入:输入: -12 0 7 输出:输出:x= -12, y= -1 x=0, y=0 x=7, y=1【例例5.35.3】有一符号函数有一符号函数程序程序1 1: 例例:程序程序2 2: void main( ) int x,

20、y; scanf(“%d”,&x); if(x=0) if(x0) y=1; else y=0; else y=-1; printf(“x=%d, y=%dn”,x, y); 输入:输入:12 -24 0 输出:输出:x=12, y=1 x= -24, y= -1 x= 0, y =0 例例:程序程序3 3: void main( ) int x, y; scanf(%d”,&x); y= -1; if(x !=0) if(x 0 ) y=1; else y=0; / *此此else 和谁匹配和谁匹配 ?*/ printf(“x=%d, y=%dn”,x, y); 输入:输入: 输出:输出:-

21、5 x= -5, y=0 0 x=0, y= -1 8 x=8, y=1只有程序只有程序1 1和和2 2是正确的。一般把内嵌的是正确的。一般把内嵌的ifif语句放在外层的语句放在外层的elseelse子句中(如程序子句中(如程序1 1那样)那样), ,这样由于有外层的这样由于有外层的elseelse相隔,相隔,内嵌的内嵌的elseelse不会和外层的不会和外层的ifif配对,而只能与内嵌的配对,而只能与内嵌的ifif配对,配对,从而不致搞混,如像程序从而不致搞混,如像程序3 3那样就容易混淆。那样就容易混淆。5.3.3 5.3.3 条件运算符条件运算符 ( ( ? :) ) v 功能功能 若若

22、ifif语句中,在表达式为语句中,在表达式为“真真”和和“假假”时,时,且都只执行一个赋值语句给同一个变量赋值时,可且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理。以用简单的条件运算符来处理。v 条件表达式的一般形式:条件表达式的一般形式: 表达式表达式1 1 ? 表达式表达式2 2 : 表达式表达式3 3 ( (其中:其中: ? : 是条件运算符号是条件运算符号) ) 在在ifif语句中,给同一变量赋值时,可用语句:语句中,给同一变量赋值时,可用语句: if(a b) if(a b) maxmax=a; =a; else else maxmax=b;=b; 在在C C

23、语言中提供了条件运算符及相应的条件表达式,上语言中提供了条件运算符及相应的条件表达式,上述问题用条件运算符实现如下:述问题用条件运算符实现如下: max= a b ? a : bmax= a b ? a : b; 它的执行过程见图。它的执行过程见图。表达表达式式1表达式表达式2表达式表达式3T (1)F(0)说明说明: 1.1.条件运算符条件运算符的优先级为的优先级为1313级级 max=(a b) ? a : b ; max= a b ? a : b ; (=为为14级级) max=a b ? a : (b+1) ; max=ab ? a: b+1 ;(+为为4级级) (为为6级级) 真:表

24、达式真:表达式2 2是整个表达式的值是整个表达式的值 计算表达式计算表达式1 1 假:表达式假:表达式3 3是整个表达式的值是整个表达式的值条件表达式的执行过程是:条件表达式的执行过程是: 2.2.条件运算符的结合方向:从右向左条件运算符的结合方向:从右向左 如有表达式:如有表达式: a b ? a : c d ? c : d a,b,c,d的取值如下:的取值如下: 表达式值如下表达式值如下 : a b c d 1 2 3 4 4 5 8 6 2 6 3 2 20 30 33. 3. 若若ifif语句内嵌的是赋值语句,且两分支给同一变量赋语句内嵌的是赋值语句,且两分支给同一变量赋值时,才可用条

25、件表达式代替值时,才可用条件表达式代替 又如:又如:if(ab) c=a; else x=b;ab ? a :b;c= x=如:如:if(ab) c=a; else c=b;c=ab ? a :b;条件表达式的结果究竞是给变量条件表达式的结果究竞是给变量c c还是还是x x,是无法确定的,是无法确定的,所以这种条件语句不能用条件表达式代替。所以这种条件语句不能用条件表达式代替。例例: :读程序,写出程序完成的结果。读程序,写出程序完成的结果。 void main( ) int a,b,imax; printf(“input data to a and b:”); scanf(“%d%d”,&a

26、,&b); imax=ab ? a:b; printf(“max=%dn”,imax); ab ? printf(“max=%dn”,a) : printf(“max=%dn”,b);输入:输入:3 5 输出:输出:max=5printf(“max=%dn”,imax=ab?a:b);printf(“max=%dn”, ab?a:b);4. 4. 表达式表达式1,2,31,2,3类型可以相同,也可不同,不同时,低类类型可以相同,也可不同,不同时,低类型向高类型转换型向高类型转换 例例void main( ) int x=-1, y=5, z=6; printf (“%cn” , x ? a :

27、 b ); printf (“%f n”, yz ? 1 : 1. 5); 输出:输出:a 1.500000 【例例5.45.4】 输入一个字符,判别它是否大写字母,如果输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。最后得到的字符。main( ) char ch; scanf (“%c”, &ch); ch=(ch= A & ch = Z ) ? (ch +32) : ch ; printf (“%c n”,ch); A的的ASCII码值是码值是65 Z的的ASCII码值是码值是90输入

28、:输入: A 输出:输出:a a a 1 1输入其它字符输入其它字符输出的是什么输出的是什么?6590 5.4 switch5.4 switch语句语句 功能:功能:一种多分支选择结构,可用于统计各种量一种多分支选择结构,可用于统计各种量. . 一般形式:一般形式: switch(switch(表达式)表达式) case case 常量表达式常量表达式1 1: 语句语句1 1; case case 常量表达式常量表达式2 2: 语句语句2 2; case case 常量表达式常量表达式n n: 语句语句n n; default : default : 语句语句n+1; n+1; 说明:说明:

29、(1)(1)Switch(Switch(表达式表达式) ): :表达式表达式的值可以是的值可以是字符、整型数。字符、整型数。(ANSIANSI新标准规定允许使用实型数据新标准规定允许使用实型数据, , 若是若是实型实型数据,数据,则将其则将其转换为整型转换为整型数据。数据。) )(2)(2)常量表达式常量表达式必须是必须是整型整型或或字符型字符型数据数据( (包括包括表达式常表达式常量量) )。(3)(3)执行过程执行过程: : 先计算表达式的值先计算表达式的值, , 依次与依次与casecase后的常量表达式比较后的常量表达式比较: : 若有若有相等相等的值的值, , 从这点从这点开始执行开

30、始执行; ; 若无相等若无相等的值的值, ,则则执行执行defaultdefault后面的语句后面的语句, ,若无若无default, default, 则无任何操作。则无任何操作。 每个常量每个常量表达式的值表达式的值不能相等不能相等; casecase出现的顺序无关;出现的顺序无关;casecase中若有中若有breakbreak语句,则使语句,则使控制流程跳出控制流程跳出switchswitch; ; 若若无无breakbreak, ,则则顺序执行下一个顺序执行下一个casecase; ; casecase后可有多个语句,不必加后可有多个语句,不必加 ,系统,系统顺序执行顺序执行; 多个

31、多个casecase可用一组执行语句可用一组执行语句 如:如: case a : case a : case b : case b : case c : printf case c : printf (ok); (ok);例例: : 从键盘输入不同等级,打印相应的分数段从键盘输入不同等级,打印相应的分数段 void main( ) char n; scanf(“%c”, &n); switch(n) case a:printf (“85100n” );break; case b:printf (“7084n” ); break; case c:printf (“6069n” ); break;

32、 case d:printf (“60n” ); break; default: printf (“input error!n” ); 问题的提出:问题的提出:(1 1)若无)若无breakbreak语句,情况将如何;语句,情况将如何; (2 2)case case 顺序颠倒是否可以?顺序颠倒是否可以? (3 3)case case 后有多句,不加后有多句,不加 是否行?是否行?输入输入:a c e 输出:输出:85100 6069 input error !case a:printf (“85100n” ); case b:printf (“7084n” ); case c:printf (

33、“6069n” ); case d:printf (“60n” ); 输入输入:a 输出:输出: 8585100100 70 708484 60 606969 60 0,4ac0,有两个不等实根。有两个不等实根。 b b2 2一一4ac04ac0,有两个共轭复根。,有两个共轭复根。 画出画出N-sN-s流程图表示算法流程图表示算法(图(图5.14 page 1085.14 page 108)。 程序如下:程序如下:#inlude “math.h”void main( ) float a, b, c, disc, x1, x2, realpart, imagpart; scanf(“%f, %f

34、, %f”,&a,&b,&c); printf (“The equation ”); if (fabs(a) =1e-6) printf (“is not quadratic”); else disc = b*b-4*a*c; if(fabs(disk) 1e-6) x1=(-b+sqrt(disk)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(“Distinct real roots:%8.4f and %8.4f n”,x1,x2); else realpart=-b/(2*a); imagpart=sqrt(- disk)/(2*a); printf(“

35、has complex roots: n”); printf(“%8.4f + %8.4fi n”, realpart, imagpart); printf(“%8.4f - %8.4fi n”, realpart, imagpart); 输入输入: 0, 2, 1 1, 2, 1 2, 6, 1 1, 2, 2 输出输出: The equation is not quadratic The equation has two equal roots: - 1.0000 The equation has distinct real roots: - 0.1771 and - 2 .8229The

36、 equation has complex roots:- 1. 0000 + 1 . 0000 i - 1 . 0000 - 1 . 0000 i 程序中用程序中用discdisc代表代表b b2 2一一4ac4ac,先计算,先计算discdisc的值,以减少的值,以减少以后的重复计算。对于判断以后的重复计算。对于判断b b2 2一一4ac4ac是否等于是否等于0 0时,要注意时,要注意一个问题:由于一个问题:由于discdisc(即(即b b2 2一一4ac4ac)是实数,而实数在计算)是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判和存储时会有一些微小的误差,因此不

37、能直接进行如下判断:断:if if (disc=0disc=0)。因为这样可能会出现本来是零的量,由于上述误差而因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于零而导致结果错误。所以采取的办法是判被判别为不等于零而导致结果错误。所以采取的办法是判别别discdisc的绝对值(的绝对值(fabsfabs(discdisc)是否小于一个很小的数)是否小于一个很小的数(例如(例如1010-6-6),如果小于此数,就认为),如果小于此数,就认为disc=0disc=0。程序中以。程序中以rere代表实部代表实部p p,以,以imim代表虚部代表虚部q q,以增加可读性。,以增加可读性。【程

38、序程序】题目:利用条件运算符的嵌套来完成此题:题目:利用条件运算符的嵌套来完成此题:学习成绩学习成绩=90=90分的同学用分的同学用A A表示,表示,60-8960-89分之间的用分之间的用B B表示,表示,6060分以下的用分以下的用C C表示。表示。1.1.程序分析:程序分析:(ab)?a:b(ab)?a:b这是条件运算符的基本例子。这是条件运算符的基本例子。2.2.程序源代码:程序源代码:void main()void main() intint score; score;char grade;char grade;printf(pleaseprintf(please input a scoren); input a scoren);scanf(%d,&

温馨提示

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

评论

0/150

提交评论