《C语言程序设计谭浩强.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计谭浩强.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C C语言程序设计谭浩强选择结构程序设计选择结构程序设计第五章第五章第五章第五章第五章第五章选择结构程序设计选择结构程序设计选择结构程序设计选择结构程序设计5.1if-else分支语句分支语句5.2 if分支语句分支语句5.3条件分支的嵌套条件分支的嵌套5.4if-elseif分支语句分支语句5.5switch开关分支语句开关分支语句5.6习题习题 分支结构程序设计分支结构程序设计在在C语言程序中,条件分支结构是通过语言程序中,条件分支结构是通过if语句和语句和switch语句实现的。语句实现的。if语句有语句有if、if-else和和if-elseif三三种形式。种形式。分支结构是程序的基本
2、结构。所谓分支结构,就分支结构是程序的基本结构。所谓分支结构,就是根据不同的条件,选择不同的程序块(分程序)进是根据不同的条件,选择不同的程序块(分程序)进行处理。行处理。if-elseifelse嵌套嵌套ifif-elseifif(表达式)表达式)语句语句;if(表达式)表达式)语句语句;else语句语句;if(表达式)表达式)语句语句;if(表达式)表达式)语句语句;else语句语句;else语句语句;if(表达式)表达式)语句语句;elseif(表达式)表达式)语句语句;elseif(表达式)表达式)语句语句;else语句语句;switchswitch(表达式)表达式)case常量常量1
3、:语句:语句1;case常量常量2:语句:语句2;case常量常量n:语句语句n;default:语句语句n+1;格式格式:功能功能:S1、S2是一个语句或分程序(程序块),也可以是空语句。是一个语句或分程序(程序块),也可以是空语句。e的结果为真的结果为真(非非0),则执行则执行S1。e的结果为假的结果为假(0),则执行则执行S2。5.1ifelse分支语句分支语句真真式式e语句语句S1语句语句S2假假if(表达式表达式e)语句语句S1;else语句语句S2;没有表达没有表达式式关系或逻辑关系或逻辑表达式等表达式等#include“stdio.h”main()int a,b;printf(“
4、n Please input a and b:”);scanf(“%d,%d”,&a,&b);if(a y);(2)if(xy)a=10elsea=100;(3)if(x=y)a=10;printf(“%d”,a);elsea=100;(4)if(5)a=10;(2)(3)5.3条件分支的嵌套条件分支的嵌套if(e1)if(e2)S3;elseS4;elseif(e3)S5;elseS6;入口入口入口入口出出口口出出口口出出口口出出口口出出口口出出口口分支嵌套应注意:分支嵌套应注意:if和和else的配对关系。的配对关系。程序的走向,即程序的入口和出口、执行部分和非执行程序的走向,即程序的入口
5、和出口、执行部分和非执行(跳出跳出)部分。部分。if(e1)S1;elseS2;条件分支嵌套就是在一个分支中包含(嵌套)另一个分支条件分支嵌套就是在一个分支中包含(嵌套)另一个分支。s4假假真真e2e3s3s5s6假假假假真真真真e1main()int x,y,z,min;printf(“n Please input x,y,z:”);scanf(“%d%d%d”,&x,&y,&z);if(x y)if(xz)min=x;else min=z;else if(yz)min=y;else min=z;printf(“n min=%d”,min);Please input x,y,z:100 5
6、29CRmin=5运行程序运行程序例例5-25-2:任意输入三个整数,求其中最小的数。任意输入三个整数,求其中最小的数。if(e1)if(e2)S1;elseif(e3)S2;elseS3;elseS4;入口入口真e 3e 1e 2S1S2S3真真假假假出出口口出出口口出出口口出出口口if与与else配对关系:一个配对关系:一个else总是与其上面距它最近的,并且没有其总是与其上面距它最近的,并且没有其它它else与其配对的与其配对的if相配对。相配对。程序的走向,即程序的入口和出口、执行部分和非执行程序的走向,即程序的入口和出口、执行部分和非执行(跳出跳出)部分。部分。每个每个if-else
7、有一个入口,两个出口。有一个入口,两个出口。if与与else配对关系与程序的走向:配对关系与程序的走向:S4if(e1)if(e2)s1;elseif(e3)s2;elses3;入口入口出出口口出口出口出口出口出口出口if与与else配对关系:配对关系:假e 3e 1e 2S1S2S3真真真假假例如:例:假定例:假定a=b=c=0,x=35,下列程序段执行后,下列程序段执行后,x的值是:的值是:if(!a)x-;elseif(b);if(c)x=3;elsex=4;A)34B)4C)35D)3答案:答案:B假假真真假假真真真真真真.假假假假e1e2e3enS1Sn+1S2S3Sn5.4if-e
8、lseif分支语句分支语句if(e1)S1;elseif(e2)S2;elseif(e3)S3;.elseif(en)Sn;elseSn+1;if-elseif 结构是条件分支嵌套常用的一种形式。结构是条件分支嵌套常用的一种形式。其一般形式为:其一般形式为:例例5-3:计算并输出:计算并输出y的值的值3x-1x06x2+9x-50=x10y=10=x=25#include“stdio.h”#include“math.h”main()floatx,y;scanf(“%f”,&x);if(x0)y=3*x-1;elseif(x10)y=6*x*x+9*x-5;elseif(x=90,A.(90-1
9、00)。=80,B.(80-89)。=70,C.(70-79)。=60,D.(60-69)。=0,E.(0-59)。main()float score;printf(“n Enter a score(0-100):”);scanf(“%f”,&score);if(score=90)printf(“A n”);else if(score=80)printf(“B n”);else if(score=70)printf(“C n”);else if(score=60)printf(“D n”);else printf(“E n”);例例5-4:学生成绩分学生成绩分A、B、C、D、E五等。五等。任给
10、一个成绩,判断它属于哪一等,用任给一个成绩,判断它属于哪一等,用if-elseif分支语句编程。分支语句编程。5.5switch开关分支开关分支在计算机程序设计中,实际问题常常需要用在计算机程序设计中,实际问题常常需要用到多分支的选择。到多分支的选择。if语句只能有两个分支可供选择,不能满足语句只能有两个分支可供选择,不能满足多分支的需要。多分支的需要。if-elseif嵌套形式可以满足要求。但也可选嵌套形式可以满足要求。但也可选用用switch语句,语句,switch是多分支选择语句。是多分支选择语句。其中其中,e是表达式。是表达式。c1、是常量表达式。是常量表达式。S1、S2Sn、Sn+1
11、是一个语句或程序块。是一个语句或程序块。开关分支是分支结构的另一种形式,该语句执行时它根据条件开关分支是分支结构的另一种形式,该语句执行时它根据条件的取值来选择程序中的一个分支。的取值来选择程序中的一个分支。switch分支语句形式如下:分支语句形式如下:switch(e)case判断值判断值c1:S1;break;case判断值判断值c2:S2;break;case判断值判断值cn:Sn;break;default:Sn+1;break;eSn+1S1S2Sne=c1.e=c2e=cne=其它其它(default)有有break语句的执行情况语句的执行情况main()char a;print
12、f(“Please input the salary level n”);printf(“Between 1 to 5,which is char type.n”);scanf(“%c”,&a);switch(a)case 1:printf(“taxis=60%n”);break;case 2:printf(“taxis=40%n”);break;case 3:printf(“taxis=20%n”);break;case 4:printf(“taxis=8%n”);break;case 5:printf(“taxis=0%n”);break;default:printf(“Error”);例
13、例5-5:输出不同工资水平的税率。输出不同工资水平的税率。switch(e)casec1:S1;break;casec2:S2;break;casecn:Sn;break;default:Sn+1;break;例:例:main()chara;switch(5+6/3).switch(a).常量表达式常量表达式字符型变量字符型变量(1)switch后面的后面的e表达式表达式(2)可以是整型常量或变量、字符型常量或变量、枚可以是整型常量或变量、字符型常量或变量、枚举类型表达式。其结果值必须是举类型表达式。其结果值必须是整型数据或字符型数据整型数据或字符型数据。使用使用 switch-case 分支
14、语句时,应注意以下几点:分支语句时,应注意以下几点:switch(e)case c1:S1;break;case c2:S2;break;case cn:Sn;break;default:Sn+1;break;整型、字符型常量整型、字符型常量数据或枚举常量。数据或枚举常量。例:例:case1:casea:case120:(2)case后面的后面的ci为为常量常量表达式,表达式,可以是一个整型、字符型常量数据或枚举常量。可以是一个整型、字符型常量数据或枚举常量。switch(e)case c1:S1;break;case cn:Sn;break;default:Sn+1;break;case c
15、2:S2;break;(3)各个各个case及及default(default之后有之后有break语句时语句时)的次的次序是任意的,但各序是任意的,但各case后的常量(判断)值必须不同。后的常量(判断)值必须不同。次序任意次序任意switch(e)case c1:S1;break;case c2:S2;break;case cn:Sn;break;没有没有defaulte与任何与任何ci均不相等时,均不相等时,则不执行则不执行switch结构中的任何部分。结构中的任何部分。建议使用它。增加建议使用它。增加 default 会给会给 switch 分支的逻辑检查带来方便。分支的逻辑检查带来方
16、便。(4)在在switch开关分支语句结构中开关分支语句结构中,default部分不是必须的部分不是必须的,如果如果没有没有default部分部分,则当则当e表达式的值与各表达式的值与各case后的后的ci常量表达式的常量表达式的值都不一致时值都不一致时,则程序不执行该结构中的任何部分。则程序不执行该结构中的任何部分。例:例:switch(c)case A:uppernum+;case a:lowernum+;default:sum+;没有没有break;1.若若c的取值是的取值是A,则三个分支即则三个分支即uppernum+、lowernum+、sum+都被执行都被执行2.若若c的取值是的取
17、值是a,则最后两个分支即则最后两个分支即lowernum+、sum+被执行被执行3.若若c的取值即不是的取值即不是A也不是也不是a,则只执行则只执行sum+(5)各分支语句中的各分支语句中的break语句作用是控制程序退出语句作用是控制程序退出switch结构。若程序没有结构。若程序没有break语句,则程序将继续执行下面一个语句,则程序将继续执行下面一个case中的程序块。中的程序块。(6)在开关分支语句中,最后的在开关分支语句中,最后的break语句也可以省语句也可以省略(其作用也就消失),略(其作用也就消失),一般情况应使用它一般情况应使用它。switch(e)case c1:S1;br
18、eak;case c2:S2;break;case cn:Sn;break;default:Sn+1;break;最后的最后的break语句可语句可省略,但建议使用它省略,但建议使用它例:例:switch(c)case 1:case 2:case 3:printf(“taxis=30%n”);break;case 4:printf(“taxis=8%n”);break;default:printf(“taxis=0%n”);break;程序中程序中case 1、case 2 和和 case 3共用共用case 3语句。语句。(7)在在switch开关分支语句结构中开关分支语句结构中,如果几种情
19、况(多个表达如果几种情况(多个表达式取值)都执行相同的程序块时式取值)都执行相同的程序块时,则对应的多个则对应的多个case可共同可共同使用同一个程序块。使用同一个程序块。(8)switch语句用来实现多分支结构,条件判断如果有两语句用来实现多分支结构,条件判断如果有两个以上基于同一个数据类型变量的条件表达式时,选用个以上基于同一个数据类型变量的条件表达式时,选用switch语句比选用语句比选用if-else if语句的嵌套形式更方便。语句的嵌套形式更方便。main()int c,grade;printf(input grade(0-100):);scanf(%d,&grade);if(gra
20、de100|grade 0)printf(wrong graden);else c=grade/10;switch(c)case 6:printf(grade Dn);break;case 7:printf(grade Cn);break;case 8:printf(grade Bn”);break;case 9:case 10:printf(grade An);break;default:printf(“grade En”);break:input grade(0-100):89 grade B运行程序运行程序例例:5-6根据百分成绩根据百分成绩,输出等级成绩输出等级成绩ABCDE。用用sw
21、itch分支语句编程。分支语句编程。main()int grade;printf(input grade(0-100):);scanf(“%d”,&grade);if(grade100|grade=90)printf(grade An);else if(grade=80)printf(grade Bn);else if(grade=70)printf(grade Cn);else if(grade=60)printf(grade Dn);else printf(failedn);例例5-7:用用if-elseif根据百分成绩根据百分成绩,输出等级输出等级ABCD。100或者或者0:出错,出错,
22、90-100:A,80-89:B,70-79:C,60-69:D,0)case 1:switch(b0)case 0:printf(“!”);break;case 1:printf(“”);break;default:printf(“+”);break;break;case 0:switch(c=5)case 0:printf(“*”);break;case 1:printf(“#”);break;default:printf(“$”);break;break;default:printf(“&”);break;printf(“n”);例例:5 5-8 读下面的程序,写出程序的输出结果。读下面
23、的程序,写出程序的输出结果。如果没有如果没有break结果?结果?如果这里也没如果这里也没有有break结果结果?!!#!#include#includemain()floata,b,c,rpart,ipart,x1,x2,p;scanf(%f,%f,%f,&a,&b,&c);if(a=0)if(b=0)printf(“a、b、careillegal.”);elsex1=(-c)/b;printf(“Thereisoneroot:x=%f”,x1);elsep=b*b-4*a*c;if(p=0)if(p=0)x1=(-b)/(2*a);printf(“Therearetworoot:x1=
24、x2=%f”,x1);elsex1=(-b)/(2*a)+sqrt(p)/(2*a);x2=(-b)/(2*a)-sqrt(p)/(2*a);printf(“Therearetworootx1=%fx2=%f”,x1,x2);ax2+bx+c=0P=b2-4acP0Py)if(xz)max=x;else max=z;else if(yz)max=y;else max=z;printf(“n max=%d”,max);例如:例如:在分支程序中,用在分支程序中,用缩排的书写方法,可清缩排的书写方法,可清楚的看出程序的条件为楚的看出程序的条件为真、条件为假时,程序真、条件为假时,程序的分支情况。的分
25、支情况。习题5.1 什么是算术运算?什么是关系运算?什么是逻辑运算?5.2 C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?5.3 写出下面各逻辑表达式的值。设a=3,b=4,c=5。(1)abc&b=c (2)a|bc&b-c (3)!(ab)&!c|1 (4)!(x=a)&(y=b)&0 (5)!(ab)c-1&bc25.4 有3个整数a、b、c,由键盘输入,输出其中最大的数。5.5 有一函数:x (x1)y=2x-1 (1x10)3x-11(x10)写一程序,输入x,输出y值。5.6 给一个不多于5位的正整数,要求:求出它是几位数;分别打印出每一位数字;按逆序打印出各
26、位数字,例如原数为321,应输出123。图5.165.7 企业发放的奖金根据利润提成。利润I低于或等于10万元的,奖金可提10;利润高于10万元,低于20万元(100000I200000)时,低于10万元的部分按10提成,高于100000元的部分,可提成75;200000I400000时,低于20万的部分仍按上述办法提成(下同)。高于20万元的部职?提成;400000I600000时,高于40万元的部分按3提成;600000I1000000时,高于60万的部分按15提成;I1000000时,超过100万元的部分按1提成。从键盘输入当月利润I,求应发奖金总数。要求:(1)用if语句编程序;(2)用Switch语句编程序。5.8 有4个圆塔,圆心分别为(2,2),(-2,2),(-2,-2),(2,-2),圆半径为1。见图5.16。这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。