if语句switch语句选择结构程序举例.ppt
教学内容if语句switch语句选择结构程序举例 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望例如,某一单位要给职工增加工资,它的规定是:工例如,某一单位要给职工增加工资,它的规定是:工资低于资低于1000元的职工,每人增加工资元的职工,每人增加工资100元,超过元,超过1000元元的职工暂不增加工资。的职工暂不增加工资。选择条件:选择条件:工资低于工资低于1000元吗元吗数据处理:数据处理:是是 增加工资增加工资100元,元,否则不增加工资否则不增加工资如果,增加工资的规定是:工资低于如果,增加工资的规定是:工资低于1000元的职工,元的职工,每人增加工资每人增加工资200元,超过元,超过1000元的职工增加工资元的职工增加工资100元。元。选择条件:工资低于选择条件:工资低于1000元吗元吗数据处理:数据处理:是是 增加工资增加工资200元元 否则否则 增加工资增加工资100元元 在在C语言中,当需要根据语言中,当需要根据选择条件来确定选择条件来确定所要做所要做(执行)哪一项(执行)哪一项数据处理数据处理的情况,这样的程序结构,被的情况,这样的程序结构,被称为称为选择(分支)结构。选择(分支)结构。在在C语言中表示选择条件,一般用:语言中表示选择条件,一般用:关系表达式关系表达式、逻辑表达式逻辑表达式 二二、实现选择结构用什么语句、实现选择结构用什么语句:C语言中实现选择结构所用语句:语言中实现选择结构所用语句:if 语句语句 switch 语句语句 在在C语言中,设计选择(分支)结构程序要解决语言中,设计选择(分支)结构程序要解决的问题:的问题:一一、如何表示选择条件:、如何表示选择条件:1.1.第一种形式第一种形式 (1 1)语句格式:语句格式:if(if(表达式表达式)语句语句 语句中的表达式必须用单括号语句中的表达式必须用单括号 “(”和和 “)”括起括起来。表达式后面来。表达式后面语句也可使用复合语句。语句也可使用复合语句。(2 2)语句功能:如果表达式的值为真语句功能:如果表达式的值为真(T)(T),则执行其,则执行其后的语句,后的语句,否则不执行该语句。否则不执行该语句。在在C C语言中,没有逻辑型数据类型。当表达式的值为语言中,没有逻辑型数据类型。当表达式的值为任何非零值,表示表达式的条件成立;当表达式的值为任何非零值,表示表达式的条件成立;当表达式的值为零值,表示表达式的条件不成立。零值,表示表达式的条件不成立。6.16.1 if if 语语 句句 2.2.第二种形式第二种形式 (1)(1)语句格式:语句格式:if(if(表达式表达式)语句语句1 1;else else 语句语句2 2;说明:说明:elseelse子句(可选)是子句(可选)是 if if 语句的一部分,必语句的一部分,必须与须与 if if 配对使用,不能单独使用配对使用,不能单独使用 (2)(2)语句功能:如果表达式的值为真语句功能:如果表达式的值为真(T)(T),则执行,则执行语句语句1 1,否则执行语句,否则执行语句2 2。例例6.1 6.1 输入两个整数,输出其中的大数。输入两个整数,输出其中的大数。void main()int a,b,max;printf(n input two numbers:);scanf(%d%d,&a,&b);max=a;if(bmax)max=b;printf(max=%d,max);例例6.2 6.2 输入两个整数,输出其中的大数。输入两个整数,输出其中的大数。main()int a,b;printf(input two numbers:);scanf(%d%d,&a,&b);if(ab)printf(max=%dn,a);else printf(max=%dn,b);例例6.3从键盘输入两个数,按升序输出两个数从键盘输入两个数,按升序输出两个数#include main()float a,b,t;scanf(%f,%f,&a,&b);if(ab)t=a;a=b;b=t;printf(%5.2f,%5.2fn,a,b);例例6.4 输入任意三个数,按从小到大的顺序排序输出。输入任意三个数,按从小到大的顺序排序输出。main()int a,b,c,temp;printf(Please input three numbers:);scanf(%d,%d,%d,&a,&b,&c);if(ab)temp=a;a=b;b=temp;if(bc)temp=b;b=c;c=temp;if(ab)temp=a;a=b;c=temp;printf(Three nbers after sorted:);printf(%d,%d,%dn,a,b,c);3条并列单条并列单 分支语句分支语句 3.3.第三种形式第三种形式 (1)语句格式语句格式 if (表达式表达式1)语句组语句组1 else if (表达式表达式2)语句组语句组2 else if (表达式表达式3)语句组语句组3 else if(表达式表达式4)语句组语句组4 else 语句组语句组5 若若 语句组语句组5 又是一条又是一条 if 语句,整个语句最少语句,整个语句最少是一个是一个6个分支的多分支个分支的多分支 if 语句。语句。(2 2)多分支多分支 if if 语句的执行过程语句的执行过程 当当“表表达达式式1”的的值值不不等等于于0时时,则则执执行行语语句句组组1 1,然后转向下一条语句;,然后转向下一条语句;否否则则,当当“表表达达式式2”的的值值不不等等于于0时时,执执行行语句组语句组2,转向下一条语句;,转向下一条语句;再再否否则则,当当“表表达达式式3”的的值值不不等等于于0时时,执执行语句组行语句组3,转向下一条语句;,转向下一条语句;再再否否则则,当当“表表达达式式4”的的值值不不等等于于0时时,执执行语句组行语句组4,转向下一条语句;,转向下一条语句;再否则,执行语句组再否则,执行语句组5,转向下一条语句;,转向下一条语句;4.if4.if语句说明语句说明 (1)(1)在三种形式的在三种形式的ifif语句中,条件表达式通常是语句中,条件表达式通常是逻辑表达式或关系表达式,逻辑表达式或关系表达式,但也可以是其它表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。如赋值表达式等,甚至也可以是一个变量。(2)(2)在在ifif语句的三种形式中,所有的语句应为单语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组个语句,如果要想在满足条件时执行一组(多个多个)语语句,则必须把这一组语句用句,则必须把这一组语句用 括起来组成一个复括起来组成一个复合语句。但要注意的是在合语句。但要注意的是在 之后不能再加分号。之后不能再加分号。例例 6.5 输入输入+*-/,输出对应的单词。输出对应的单词。#include main()char ch;ch=getchar();if(ch=+)printf(plusn);else if(ch=-)printf(minusn);else if(ch=*)printf(multiplyn);else if(ch=/)printf(dividen);else printf(errorn);例例6.6 输入任意三个整数,求三个数中的最大值。输入任意三个整数,求三个数中的最大值。main()int n1,n2,n3,max;scanf(%d,%d,%d,&n1,&n2,&n3);if(n1n2)max=n1;else max=n2;if (n3max)max=n3;printf(The three numbers are:”);printf(“%d,%d,%dn,n1,n2,n3);printf(max=%dn,max);max=n1;if(n2max)max=n2;程序运行情况如下:程序运行情况如下:Please input three nbers:11,22,18 The three nbers are:11,22,18 max=22本例中的第本例中的第1个个if语句,可优化为如下不带语句,可优化为如下不带else子句的子句的形式:形式:max=n1;if(n2max)max=n2;优化的基本思想是:优化的基本思想是:首先取一个数预置为首先取一个数预置为max(最大值),然后再用(最大值),然后再用max依依次与其余的数逐个比较,如果发现有比次与其余的数逐个比较,如果发现有比max大的,就用它大的,就用它给给max重新赋值,比较完所有的数后,重新赋值,比较完所有的数后,max中的数就是最大中的数就是最大值。值。5.if 语句与条件运算符语句与条件运算符 如果在条件如果在条件语句中,只句中,只执行行单个的个的赋值语句句时,常可使用常可使用条件表达式来条件表达式来实现。不但使程序。不但使程序简洁,也提高了运行效率。,也提高了运行效率。例例 6.7 输入任意三个整数,求三个数中的最大值。输入任意三个整数,求三个数中的最大值。main()int n1,n2,n3,max;scanf(%d,%d,%d,&n1,&n2,&n3);max=n1n2?n1:n2;max=(n3max)?n3:max;printf(max=%dn,max);max=(n1n2)?(n1n3)?n1:n3):(n2n3)?n2:n3);6 6ifif语句的嵌套与嵌套匹配原则语句的嵌套与嵌套匹配原则 (1)if(1)if 语句嵌套,是指,在语句嵌套,是指,在“语句语句1”或(和)或(和)“语语句句2”中,又包含有中,又包含有 if 语句的情况。语句的情况。ifif 语句嵌套时,语句嵌套时,elseelse子句与在它上面、距它最近、子句与在它上面、距它最近、且尚未匹配的且尚未匹配的 if if 配对。配对。例如:例如:if(ab)s=s+t;else if(a=b)t=5;/*语句语句2是是 if 语句语句*/else t=2*s;例例 6.8 输入任意三个整数,求三个数中的最大值。输入任意三个整数,求三个数中的最大值。main()int n1,n2,n3;scanf(%d,%d,%d,&n1,&n2,&n3);if(n1n2)if(n1n3)printf(max=%dn,n1);else printf(max=%dn,n3);else if (n2 n3)printf(max=%dn,n2);else printf(max=%dn,n3);例例6.9 if 语句的嵌套使用语句的嵌套使用 main()int a,b,c,d,x;a=b=c=0;d=20;if(a)d=d-10;else if(d+2)if(!c)x=15;else x=25;printf(“d=%d,x=%dn”,d,x)说说明明(1)if后后面面的的“表表达达式式”,除除常常见见的的关关系系表表达达式式或或逻逻辑辑表表达达式式外外,也也允允许许是是其其它它类类型型的的表表达达式式,其其数数值值可可以以是是整整型型、实型、字符型。实型、字符型。1 1switch语句的一般形式语句的一般形式 switch (表达式表达式)case 常量表达式常量表达式1 1:语句组语句组1 1 case 常量表达式常量表达式2 2:语句组语句组2 2 .case 常量表达式:常量表达式:语句组语句组n n default:语句组:语句组n+1 n+1 “表表达达式式”可可以以是是intint、charchar和和枚枚举举型型中中的的一一种种,每每个个casecase后后面面“常常量量表表达达式式”的的值值,必必须须各各不不相相同同,多多个个casecase子句,可共用同一语句(组)。子句,可共用同一语句(组)。6.2 switch 6.2 switch 语句语句 2执行过程执行过程(1)当当switchswitch后后面面“表表达达式式”的的值值,与与某某个个casecase后后面面的的“常常量量表表达达式式”的的值值相相同同时时,就就执执行行该该casecase后面的语句组;后面的语句组;(2)如如果果没没有有任任何何一一个个casecase后后面面的的“常常量量表表达达式式”的的值值,与与“表表达达式式”的的值值匹匹配配,则则执执行行default default 后面的语句后面的语句,然后,再执行然后,再执行switchswitch语句的下一条。语句的下一条。casecase后后面面的的常常量量表表达达式式仅仅起起语语句句标标号号作作用用,并并不不进进行行条条件件判判断断。系系统统一一旦旦找找到到入入口口标标号号,就就从从此此标标号开始执行,不再进行标号判断号开始执行,不再进行标号判断;3.switch 3.switch 语句使用说明语句使用说明 (1 1)在在casecase后后的的各各常常量量表表达达式式的的值值不不能能相相同同,否则会出现错误。否则会出现错误。(2 2)在在casecase后后,允允许许有有多多个个语语句句,可可以以不不用用 括起来。括起来。(3 3)各各casecase和和defaultdefault子子句句的的先先后后顺顺序序可可以以变变动,而不会影响程序执行结果。动,而不会影响程序执行结果。(4 4)defaultdefault子句可以省略不用。子句可以省略不用。(5 5)多个多个casecase子句,可共用同一语句(组)。子句,可共用同一语句(组)。例例6.10 输出变量输出变量a的值的值main()int a=0,i=1;switch(i)case 0:case 1:a+=2;case 2:case 3:a+=3;default:a+=7;printf(“%dn”,a);2 2个个case子句,子句,共用同一语句共用同一语句(组)(组)执行顺序:执行顺序:a+=2;a+=3;a+=7;4switch语句中语句中break语句使用语句使用 switch (表达式表达式)case 常量表达式常量表达式1:语句组:语句组1;break;case 常量表达式常量表达式2:语句组:语句组2;break;.case 常量表达式常量表达式:语句组:语句组n;break;default:语句组:语句组n+1;执行过程执行过程 当当switchswitch后后面面“表表达达式式”的的值值,与与某某个个casecase后后面面的的“常常量量表表达达式式”的的值值相相同同时时,就就执执行行该该casecase后后面面的的语语句句(组组);当当执执行行到到breakbreak语语句句时时,跳跳出出switchswitch语语句句,转转向向执行执行switchswitch语句的下一条。语句的下一条。例例6.11 从键盘上输入一个百分制成绩从键盘上输入一个百分制成绩score,按下,按下列原则输出其等级:列原则输出其等级:score90score90,等级为等级为A A;80score90 80score90,等级为等级为B B;70score80 70score80,等级为等级为C C;60score70 60score70,等级为等级为D D;score60 score0)case 1:switch(b0)case 0:printf(“”);break;case 1:printf(“!”);break;case 0:switch(c=5)case 0:printf(“*”);break;case 1:printf(“#”);break;default:printf(“$”);break;default:printf(“&”);例例 6.13 6.13 计算阶跃函数计算阶跃函数 y y 的值的值#include main()float x,y;printf(input x:“);scanf(%f,&x);if(x=0)if(x0)y=1;/*语句组语句组1是是if语句语句*/else y=0;else y=-1;printf(y=%4.0fn,y);当当 X0 y=1 X=0 y=0 X0 y=-1 6.3 6.3 选择结构程序举例选择结构程序举例例例6.14 求一元二次方程求一元二次方程ax2+bx+c=0的解(的解(a0)。)。#include math.hmain()float a,b,c,disc,x1,x2,p,q;scanf(“%f,%f,%f”,&a,&b,&c);disc=b*b-4*a*c;if(fabs(disc)1e-6)x1=(-b+sqrt(disc)/(2*a);/*两个不相等实根两个不相等实根*/x2=(-b-sqrt(disc)/(2*a);printf(x1=%7.2f,x2=%7.2fn,x1,x2);else p=-b/(2*a);/*求出两个共轭复根求出两个共轭复根*/q=sqrt(fabs(disc)/(2*a);/*输出两个共轭复根输出两个共轭复根*/printf(“x1=%7.2f+%7.2f in“,p,q);printf(”x2=%7.2f-%7.2f in“,p,q);本案例判断本案例判断discdisc是否为是否为0 0的方法是:判断的方法是:判断discdisc的绝对的绝对值是否小于一个很小的数:值是否小于一个很小的数:1e-61e-6#include main()float a,b,c,s,x1,x2;double t;scanf(%f%f%f,&a,&b,&c);if(a=0.0)if(b!=0.0)printf(the root is:%fn,-c/b);else if(c=0.0)printf(x is inexactiven);else printf(no root!n);else s=b*b-4*a*c;if (s=0.0)if (s0.0)t=sqrt(s);x1=-0.5*(b+t)/a;x2=-0.5*(b-t)/a;printf(There are two different roots:%f and%fn,x1,x2);else printf(There are two equal roots:%fn,-0.5*b/a);else t=sqrt(-s);x1=-0.5*b/a;x2=abs(0.5*t/a);printf(There are two virtual roots:);printf(%f+i%ftt%f-i%fn,x1,x2,x1,x2);例例6.15 已已知知某某公公司司员员工工的的保保底底薪薪水水为为500,某某月月所所接接工工程程的的利利润润profit(整数)与利润提成的关系如下(计量单位:元):(整数)与利润提成的关系如下(计量单位:元):profit1000没有提成没有提成;1000profit2000 提成提成 10%;2000profit5000 提成提成 15%;5000profit10000提成提成 20%;10000profit提成提成 25%。算法设计要点算法设计要点:提提成成的的变变化化点点都都是是1000的的整整数数倍倍(1000、2000、5000、),如果将利润如果将利润profit整除整除1000,则当:,则当:profit1000 对应对应 0、11000profit2000 对应对应 1、22000profit5000 对应对应 2、3、4、55000profit10000 对应对应 5、6、7、8、9、1010000profit 对应对应 10、11、12、为为解解决决相相邻邻两两个个区区间间的的重重叠叠问问题题,最最简简单单的的方方法法就就是是:利润利润profitprofit先减先减1 1(最小增量),然后再整除(最小增量),然后再整除10001000即可即可:profit1000对应对应0 1000profit2000对应对应1 2000profit5000对应对应2、3、4 5000profit10000 对应对应5、6、7、8、9 10000profit对应对应10、11、12、main()long profit;int grade;float salary=500;printf(Input profit:);scanf(%ld,&profit);grade=(profit 1)/1000;switch(grade)case 0:break;/*profit1000*/case 1:salary+=profit*0.1;break;case 2:case 3:case 4:salary+=profit*0.15;break;case 5:case 6:case 7:case 8:case 9:salary+=profit*0.2;break;default:salary+=profit*0.25;printf(salary=%.2fn,salary);例例6.16 运输费用的计算运输费用的计算#include#include main()int c,s;float p,w,d,f;printf(please input p,w,s:);scanf(%f,%f,%d,&p,&w,&s);if (s=3000)c=12;else c=s/250;switch(c)case 0:d=0;break;case 1:d=2;break;case 2:case 3:d=5;break;s:路程路程 w:货物重量货物重量 p:运价运价 d:折扣率折扣率 f:总运费总运费case 4:case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;f=p*w*s*(1-d/100)printf(Total freight is:%10.2fn,f);同同 学学 们们 再再 见见 程程 序序 设设 计计 基基 础础