版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第4章章 选择结构程序设计选择结构程序设计4.1 if语句语句4.2 switch语句语句4.3 选择结构程序设计举例选择结构程序设计举例本章学习目标本章学习目标熟悉熟悉ifif语句的格式及应用的几种形式语句的格式及应用的几种形式掌握掌握ifif语句嵌套应用的方法语句嵌套应用的方法掌握条件运算符的应用掌握条件运算符的应用掌握掌握switchswitch语句的格式及应用语句的格式及应用掌握选择结构程序的设计方法掌握选择结构程序的设计方法Return4.1 if4.1 if语句语句 if if语句又叫条件语句,它是通过判别条件是语句又叫条件语句,它是通过判别条件是否成立,来决定程序的流程在可能执
2、行的两个否成立,来决定程序的流程在可能执行的两个流程中选择执行其中的一个)。流程中选择执行其中的一个)。1. if1. if语句的一般格式语句的一般格式 if(if(表达式表达式) ) 语句组语句组11 else else 语句组语句组22如:如:if(a=b) printf(“%d”, a);if(a=b) printf(“%d”, a);else printf(“%d”, b);else printf(“%d”, b);2.if2.if语句的三种形式语句的三种形式形式一:(缺省形式一:(缺省elseelse子句时)子句时)格式:格式:ifif表达式)表达式) 语句语句当当“表达式的值不等于
3、表达式的值不等于0 0即判定为即判定为“逻辑真逻辑真”)时,)时,则执行语句,否则直接转向执行下一条。如图则执行语句,否则直接转向执行下一条。如图4-14-1所示。所示。例如:例如:if(xy) printf(max=%d,x);if(xy) printf(max=%d,x);真(非0)表达式语句假(0)图4-1 if语句的流程图形式二:(指定else子句时)格式:if表达式) 语句1 else 语句2当“表达式的值不等于0即判定为“逻辑真”)时,则执行语句组1,然后转向下一条语句;否则,执行语句组2。如图4-2所示。例如:if(xy) printf(max=%d,x);else printf
4、(max=%d,y); 真(非0)表达式语句1假(0)语句2图4-2 ifelse语句的流程图形式三:(形式三:(ifif语句嵌套)语句嵌套)格式:格式:ifif表达式表达式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 1语句语句2 2语句语句3 3语句语句m m语句语句n n真真表达式表达式1 1表达式表达式2 2表达式表达式3 3表达式表
5、达式m m真真真真真真假假假假假假假假图图4-3 if4-3 ifelseelse语句嵌套的流程图语句嵌套的流程图例如:例如:if(number500) const=0.15;if(number500) const=0.15; else if(number300) const=0.10; else if(number300) const=0.10; else if(number100) const=0.075; else if(number100) const=0.075; else if(number50) const=0.05; else if(number50) const=0.05;
6、else const=0; else const=0;说明:说明:(1 1if (if (表达式表达式) )中的中的“表达式一般为逻辑表达式或关系表达式一般为逻辑表达式或关系表达式,如:表达式,如:if(a=b & x=y) printf(a=b,x=y);if(a=b & x=y) printf(a=b,x=y);也允许是其它类型的数据,如整型、实型、字符型等。如:也允许是其它类型的数据,如整型、实型、字符型等。如:if(3) printf(O.K.);if(3) printf(O.K.);if(3.5) printf(%f, 3.5);if(3.5) printf(%f,
7、3.5);if(a) printf(%d, a);if(a) printf(%d, a);(2)“语句组1”和“语句组2”,可以只包含一个简单语句,也可以是复合语句。复合语句须在其第一个语句前用左花括号“”开头,最后一个语句后以右花括号“”结尾,如:if(a+bc & b+ca & c+ab) s=0.5*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c); printf(area=%8.2f,area);else printf (所输入的三边长不能构成三角形); 【例4-1】 输入任意三个整数,求三个数中的最大值。【思路导航】定义三个变量num1、n
8、um2、num3,分别表示从键盘输入的任意三个数,再定义变量max表示三个数中的最大值。 首先取一个数预置为max最大值),然后再用max依次与其余的数逐个比较,如果发现有比max大的,就用它给max重新赋值,比较完所有的数后,max中的数就是最大值。 对从3个或3个以上的数中找最大值的处理,上述方法是非常好用的。程序如下:单击此处 /*exam4_1*/int main(void) int num1,num2,num3,max;printf(Please input three numbers:);scanf(%d,%d,%d,&num1,&num2,&num3);m
9、ax=num1;if(num2max) max=num2; if(num3max) max=num3; printf(The three numbers are:%d,%d,%dn, num1, num2,num3); printf(max=%dn,max); return 0; 演示屏幕显示运行结果为:Please input three numbers:35,100,85Please input three numbers:35,100,85The three numbers are: 35,100,85The three numbers are: 35,100,85max=100max=
10、100【例【例4-24-2】 输入任意三个数输入任意三个数num1num1、num2num2、num3num3,按从小到,按从小到大的顺序排序输出。大的顺序排序输出。【思路导航】编程思路与例【思路导航】编程思路与例4-24-2基本上相同。不同的是:由基本上相同。不同的是:由于本例题要求将所输入的三个数按从小到大的顺序排序输出于本例题要求将所输入的三个数按从小到大的顺序排序输出,故在比较大小时要注意小数排在前,大数排在后,位置不,故在比较大小时要注意小数排在前,大数排在后,位置不符时要交换两数的位置。符时要交换两数的位置。程序如下:程序如下:/ /* *exam4_2exam4_2* */ /i
11、nt main(void)int main(void) int num1,num2,num3,temp;int num1,num2,num3,temp;printf (Please input three numbers:);printf (Please input three numbers:);scanf (%d,%d,%d,&num1,&num2,&num3);scanf (%d,%d,%d,&num1,&num2,&num3);if(num1num2) temp=num1;num1=num2;num2=temp;if(num1num2)
12、temp=num1;num1=num2;num2=temp;if(num2num3) temp=num2;num2=num3;num3=temp;if(num2num3) temp=num2;num2=num3;num3=temp;if(num1num2) temp=num1;num1=num2;num2=temp;if(num1num2) temp=num1;num1=num2;num2=temp;printf(Three numbers after sorted: printf(Three numbers after sorted: %d,%d,%dn, num1,num2,num3);%
13、d,%d,%dn, num1,num2,num3);return 0;return 0; 演示屏幕显示运行结果为:Please input three numbers: 35,100,85Please input three numbers: 35,100,85Three numbers after sorted: 35, 85,100Three numbers after sorted: 35, 85,1003 3ifif语句的嵌套语句的嵌套 ifif语句允许嵌套。语句允许嵌套。(1 1ifif语句的嵌套形式语句的嵌套形式 所谓所谓ifif语句的嵌套是指:语句的嵌套是指:ifif语句中包含另
14、一个语句中包含另一个ifif语句,即:在语句,即:在“语句组语句组1 1或和)或和)“语句组语句组2 2中,中,又包含有又包含有ifif语句的情况。语句的情况。ifif语句的嵌套的一般形式:语句的嵌套的一般形式:if(if(表达式表达式1)1) if( if(表达式表达式2 ) 2 ) 语句组语句组1 /1 /* *内嵌内嵌ifif语句语句* */ / else else 语句组语句组2 2elseelse if( if(表达式表达式3 ) 3 ) 语句组语句组3 /3 /* *内嵌内嵌ifif语句语句* */ / else else 语句组语句组4 4(2 2ifif语句的嵌套与嵌套匹配原则
15、语句的嵌套与嵌套匹配原则 ifif语句嵌套时,从最内层开始,语句嵌套时,从最内层开始,elseelse总是与它上面距它最近总是与它上面距它最近、且尚未匹配的、且尚未匹配的ifif配对。配对。 为明确匹配关系,避免为明确匹配关系,避免ifif与与elseelse配对错位的最佳办法是将内配对错位的最佳办法是将内嵌的嵌的ifif语句,一律用花括号括起来。语句,一律用花括号括起来。 为了便于阅读,使用适当的缩进,此时大括号能保证为了便于阅读,使用适当的缩进,此时大括号能保证ifif和和elseelse不错位配对,而且适当的缩进便于阅读程序。不错位配对,而且适当的缩进便于阅读程序。 例如以下两组循环的嵌
16、套因加入大括号后,所表示的含义不例如以下两组循环的嵌套因加入大括号后,所表示的含义不同。同。 if()if() if () if () if() if() 语句语句1 1 if () if () 语句语句11else else else else 语句语句2 2 语句语句2 2加改变配对关系: 【例【例4-34-3】 有一函数如下,编程实现:输入一个有一函数如下,编程实现:输入一个x x值,即可值,即可输出输出y y值。值。 下面以下面以ifif语句嵌套的不同的方法来编写程序。语句嵌套的不同的方法来编写程序。 方法一:/*exam431*/int main(void) int x,y;scan
17、f(%d,&x);if(x=0)if(x0) y=1;else y=0;else y=-1;printf(x=%d,y=%dn,x,y);return 0; 演示屏幕显示运行结果为:-35-35x=-35,y=-1 x=-35,y=-1 3535x=35,y=-1 x=35,y=-1 00 x=0,y=0 x=0,y=0 方法三:方法三:/ /* *exam433exam433* */ /int main(void)int main(void) int x,y;int x,y;scanf(%d,&x);scanf(%d,&x);y=-1;y=-1;if(x=0)if(x
18、=0)if(x0) y=1;if(x0) y=1;else y=0;else y=0;printf(x=%d,y=%dn,x,y);printf(x=%d,y=%dn,x,y);return 0;return 0; 方法四:方法四: / /* *exam434exam434* */ /int main(void)int main(void) int x,y; int x,y; scanf (%d,&x); scanf (%d,&x); y=0; y=0; if(x!=0) if(x!=0) if(x0) y=1; if(x0) y=1; else y=-1; else y=-1
19、; printf(x=%d,y=%dn,x,y); printf(x=%d,y=%dn,x,y); return 0; return 0; 4.4.条件运算符条件运算符?运算符运算符 在在ifif语句中,当语句中,当“表达式的值为表达式的值为“真和真和“假时假时,都只执行一个赋值语句给同一个变量赋值,例如:,都只执行一个赋值语句给同一个变量赋值,例如:if(ab) max=a;if(ab) max=a;elseelsemax=b;max=b; 则可以用条件运算符构成则可以用条件运算符构成 一个条件表达式来处理一个条件表达式来处理,如下所示:,如下所示:max=(ab)?a:bmax=(ab)?
20、a:b; 其中,其中,“(ab)?a:b(ab)?a:b是一个条件表达式,其含义是一个条件表达式,其含义是:若条件是:若条件abab成立,则条件表达式取值成立,则条件表达式取值a a;否则;否则,取值,取值b b。 (1 1条件表达式的一般格式:条件表达式的一般格式: 表达式表达式1 1?表达式?表达式2 2:表达式:表达式3 3例如例如: : int main(void) int main(void) int x, y;int x, y;x=80;x=80;y=x70?100:0;y=x70?100:0;printf(y=%d,y);printf(y=%d,y);return 0;retur
21、n 0; 注意:条件运算符要求有三个操作对象,称为“三目运算符”(它是C语言中唯一的一个三目运算符)。条件表达式中的“表达式1”、“表达式2”、“表达式3缺一不可,其类型可以各不相同。屏幕显示运行结果为:y=100 y=100 演示(2 2条件表达式的运算规则条件表达式的运算规则 假如假如“表达式表达式1 1的值为非的值为非0(0(即逻辑真即逻辑真) ), 则运算结果等于则运算结果等于“表达式表达式2 2的值;否则,运算结果等于的值;否则,运算结果等于“表达式表达式3 3的值。的值。条件表达式的流程图如图条件表达式的流程图如图4-44-4所示。所示。 真(非0)表达式1条件表达式取表达式2的值
22、假(0)条件表达式取表达式3的值图4-4 条件表达式的流程图条件运算符的结合方向条件运算符的结合方向为“从右到左”(即右结合性)。如:ab? a:cd?c:d 等介于:(ab)?a:(cd?c:d) if语句一般都可以用条件表达式代替。如:if(ab) printf(%d,a);else printf(%d,b);等介于:(ab)?printf(%d,a):printf(%d,b);或: printf(%d,ab?a:b); 条件运算符的优先级高于赋值运算符,但低于算术运算符和关系运算符。如:max=(ab)?a:b; 等介于:max=ab?a:b;ab?a:b+1 等介于:(ab)?a:(b
23、+1)(3 3说明:说明: 演示【例【例4-44-4】 从键盘上输入一个字符,判别它是否为大写字母,如从键盘上输入一个字符,判别它是否为大写字母,如果是,则把它转换成小写字母输出;否则不转换,直接输出。果是,则把它转换成小写字母输出;否则不转换,直接输出。 【思路导航】字符在计算机内是用【思路导航】字符在计算机内是用ASCIIASCII表示,大写字母的表示,大写字母的ASCIIASCII值正好比相应的小写字母小值正好比相应的小写字母小3232,因而,若能判断出所输入的字符,因而,若能判断出所输入的字符为大写字母,则将该字符的为大写字母,则将该字符的ASCIIASCII值加上值加上3232后,即
24、转换为相应的小后,即转换为相应的小写字母。判断字符写字母。判断字符chch是否为大写字母的条件是:是否为大写字母的条件是:ch=A & ch=A & ch=Zch=A& ch=Z) ? (ch+32) : ch;printf(ch=%cn,ch);return 0;演示屏幕显示运行结果为:Input a character: DInput a character: Dch=d ch=d Return4.2 switch4.2 switch语句语句1 1switchswitch语句的一般格式:语句的一般格式:switch(switch(表达式表达式) ) case cas
25、e 常量表达式常量表达式1 1:语句:语句( (组组)1)1;breakbreak; case case 常量表达式常量表达式2 2:语句:语句( (组组)2)2;breakbreak; . case case 常量表达式:语句常量表达式:语句( (组组)n)n;breakbreak; defaultdefault:语句:语句( (组组)n+1)n+1; break break; C语言提供了switch语句直接处理多个分支的选择结构。 例如:switch(ch)case A:printf(85100n);break;case B:printf(7084n);break;case C:prin
26、tf(6069n);break;case D:printf(60n);break;default: printf(errorn);其他其他DDBBAAch输出“85100”输出“7084”输出“6069”switch的下一条语句输出“60”输出“error”CC图图4-5 4-5 2 2switchswitch语句的功能语句的功能包括以下两方面。包括以下两方面。(1 1当当switchswitch后面后面“表达式的值,与某个表达式的值,与某个casecase后面的后面的“常量表达式的值相同时,就执行该常量表达式的值相同时,就执行该casecase后面的语句组);当执行到后面的语句组);当执行到
27、breakbreak语句时,语句时,则跳出则跳出switchswitch语句,转向执行语句,转向执行switchswitch语句的下一语句的下一条。条。(2 2如果没有任何一个如果没有任何一个casecase后面的后面的“常量表达式常量表达式的值与的值与switchswitch后面后面“表达式的值相同,则执表达式的值相同,则执行行default default 后面的语句组)。然后,跳出后面的语句组)。然后,跳出switchswitch语句,执行语句,执行switchswitch语句的下一条。语句的下一条。 3 3说明:说明:(1 1switchswitch后面的后面的“表达式和表达式和cas
28、ecase后面的后面的“常量表达式常量表达式” ” 可以是整型、字符型和枚举型中的任意一种,程序执行可以是整型、字符型和枚举型中的任意一种,程序执行时将自动计算其值。时将自动计算其值。(2 2为了避免程序执行时出现自相矛盾的现象,对为了避免程序执行时出现自相矛盾的现象,对switchswitch后面的后面的“表达式的值只能有一种执行方案,因而,每个表达式的值只能有一种执行方案,因而,每个casecase后面后面“常量表达式的值,必须各不相同。常量表达式的值,必须各不相同。(3 3casecase后的语句中后的语句中breakbreak语句不能缺。语句不能缺。casecase后面的后面的“常量表
29、达式仅起语句标号作用,并不进行常量表达式仅起语句标号作用,并不进行条件判断。系统一旦找到入口标号,就从此标号开始执行条件判断。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以在每个,不再进行标号判断,所以在每个casecase的语句组后面的语句组后面必须加上必须加上breakbreak语句,以便结束语句,以便结束switchswitch语句。语句。 想一想想一想: 若switch后面的“表达式的值为B,则下面这段程序输出的结果是什么?为什么?switch(ch)case A: printf(85100n);case B: printf(7084n);case C: printf
30、(6069n);case D: printf(60n);default: printf(errorn);结果是7084606960n); break;在变量ch的值为A、B、C三种情况下,均执行相同的语句组“printf(60n); break;”。(6用switch语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实现。 【例【例4-54-5】 从键盘上输入一个百分制成绩从键盘上输入一个百分制成绩scorescore,按下列原则输,按下列原则输出其等级:出其等级:score90score90,等级为,等级为A A;80score9080score90,等级为,等级为B B;70s
31、core8070score80,等级为,等级为C C;60score7060score70,等级为,等级为D D;score60score0b2-4ac0时,一元二次方程有两个不等的实根。时,一元二次方程有两个不等的实根。 当当b2-4ac0b2-4ac0时,时, 一元二次方程有两个共轭复根。一元二次方程有两个共轭复根。 为了编程方便,设变量为了编程方便,设变量discdisc表示一元二次方程判别式表示一元二次方程判别式 b2-b2-4ac4ac,由于实数在计算机中运算和存储时,不可避免地有会有一,由于实数在计算机中运算和存储时,不可避免地有会有一些微小误差,因此在判别些微小误差,因此在判别d
32、iscdisc为实数是否为零时,不能直为实数是否为零时,不能直接与零比较,正确的方法是判断其绝对值小于一个很小的常数接与零比较,正确的方法是判断其绝对值小于一个很小的常数,如采用方法:,如采用方法:if (fabs(disc) = 1E-6) if (fabs(disc) = 1E-6) ,而不是:,而不是:if if (disc = = 0.0)(disc = = 0.0)。N-S流程图如图4-7所示: 图4-7 / /* *exam4_6exam4_6* */ /#include math.h#include math.hint main(void)int main(void) float
33、 a,b,c,disc,x1,x2,p,q;float a,b,c,disc,x1,x2,p,q;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); /* *输入一元二次输入一元二次方程系数方程系数* */ /printf(The equation: );printf(The equation: );printf(%fxprintf(%fx* *x+%fx+%
34、f=0 ”,a,b,c);x+%fx+%f=0 ”,a,b,c);if (fabs(a) = 1E-6) /if (fabs(a) = 1E-6) /* *判断系数判断系数a = 0a = 0* */ / printf(“is not quadraticn”); exit(0); printf(“is not quadraticn”); exit(0); / /* *输出不能构成方程的信息后,退出输出不能构成方程的信息后,退出* */ /elseelse程序如下: disc=b*b-4*a*c; /*定义判别式*/ if (fabs(disc)1e-6) /*判断0 */ x1=(-b+sqr
35、t(disc)/(2*a); /*求出两个不相等的实根*/ x2=(-b-sqrt(disc)/(2*a); printf(has distinct real roots: n); printf( x1=%8.2f,x2=%8.2fn, x1, x2); else p=-b/(2*a); /*求出两个共轭复根,其中p表示实部*/ q=sqrt(fabs(disc)/(2*a); /*q表示虚部*/ printf(has complex roots:n); printf(“x1=%7.2f + %7.2f in“, p, q); /*输出两个共轭复根之一:x1*/ printf(”x2=%7.2
36、f - %7.2f in“, p, q); /*输出两个共轭复根之二:x2*/ return 0; 运行情况Please input a,b,c= 1Please input a,b,c= 1,6 6,2 2 The equation: 1.000000 xThe equation: 1.000000 x* *x+6.000000 x+2.000000=0 has distinct real roots: x+6.000000 x+2.000000=0 has distinct real roots: x1= -0.35x1= -0.35,x2= -5.56 x2= -5.56 Please
37、input a,b,c= 1Please input a,b,c= 1,2 2,3 3 The equation: 1.000000 xThe equation: 1.000000 x* *x+2.000000 x+3.000000=0 has complex roots: x+2.000000 x+3.000000=0 has complex roots: x1= -1.00+ 1.41ix1= -1.00+ 1.41ix2= -1.00- 1.41i x2= -1.00- 1.41i 若从键盘上输入方程系数a、b、c分别为:1,6,2,则屏幕显示程序运行情况如下: 若从键盘上输入方程系数a
38、、b、c分别为:1,2,3,则屏幕显示程序运行情况如下: 演示想一想: 如果将系数a、b、c定义成整数,能否直接判断一元二次方程判别式disc是否等于0?【例【例4-74-7】 已知某公司员工的保底薪水已知某公司员工的保底薪水salarysalary为为500500,某月所,某月所接工程的利润接工程的利润profitprofit整数与利润提成的关系如下计量单整数与利润提成的关系如下计量单位:元):位:元):profit1000profit1000 没有提成;没有提成;10001000profit2000profit2000提成提成10%10%;20002000profit5000profit5000提成提成15%15%;50005000profit10000profit10000提成提成20%20%;1000010000profit profit
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026统计学国企面试题及答案
- 2026文化自信面试题目及答案
- 厨师薪酬合同范本
- 个人旅行意外伤害处理供旅行者预案
- 申请2026年扩展代理服务确认函7篇范本
- 利用高铝粉煤灰制备100万吨硅铝合金源网荷储一体化项目可行性研究报告模板申批拿地用
- 2026年双鸭山市尖山区网格员招聘笔试参考题库及答案详解
- 客服中心在线客服话术培训工作手册
- 2026年陕西省商洛市事业编单位人员招聘考试参考题库及答案详解
- 2026年桂林市秀峰区社区工作者招聘笔试模拟试题及答案详解
- 石油化工工程建设设计概算编制办法
- 数据库应用技术-第三次形考作业(第10章~第11章)-国开-参考资料
- 低温甲醇洗脱硫脱碳技术
- 国家开放大学理工英语1(12套)
- 外墙三明治板施工方案
- 国家开放大学《工作分析实务》形考任务1-4参考答案
- 新课标-人教版四年级数学上册第三单元《角的度量》教材分析
- 护理会诊制度及查房制度课件
- GB/T 42598-2023机械安全使用说明书起草通则
- 大学英语六级词汇表(全)含音标
- 农业银行境外汇款申请书样板
评论
0/150
提交评论