《第四章选择结构程序设计.ppt》由会员分享,可在线阅读,更多相关《第四章选择结构程序设计.ppt(55页珍藏版)》请在课桌文档上搜索。
1、第四章 选择结构程序设计,2023年3月30日7时3分,选择结构程序概述,选择结构程序,又称为分支结构程序。它是三大基本结构之一。在这种结构程序中,一定会包含条件语句。计算机根据所指定条件是否满足,决定从给定的两组或多组操作中选择执行。,2023年3月30日7时3分,条件选择控制语句,if语句(else 语句)switch语句goto语句,2023年3月30日7时3分,条件表达式,关系与逻辑运算操作符,关系运算符=!=,逻辑运算符!&|,2023年3月30日7时3分,条件选择控制语句,1、if 语句(单分支语句),if(条件表达式)语句;,if(条件表达式)语句块,或,2023年3月30日7时
2、3分,例如:如果x0,输出x。if(x0)printf(x=%f,x);(2)如果a等于b,输出a=b。if(a=b)printf(%s,a=b);,2023年3月30日7时3分,例如:如果x0,求x的平方根。(1)将结果放入变量y 中;(2)输出x的平方根y。,不管选择体多么复杂,包含多少条语句,if语句逻辑上是一条语句,后面的双分支if语句、多分支if语句、switch语句、循环语句均是逻辑上的一条语句。,if(x0)y=sqrt(x);printf(平方根=%f,y);,2023年3月30日7时3分,计算y,(提示:x等于1时,函数无定义。),#includevoid main()flo
3、at x,y;printf(请输入x:);scanf(%f,例1:,请输入x:1.2 运行结果为:x=1.20,y=11.00,2023年3月30日7时3分,2、if-else 语句(Two-way selection statement),例:#include void main()int x;scanf(“%d”,if(条件表达式)语句1;(语句块1)else 语句2;(语句块2),2023年3月30日7时3分,例:求两个数x、y的最大值max。,用条件表达式表示为:(xy)?(max=x):(max=y);,用条件表达式表示为:(i%2=0)?Printf(“偶数n”):printf(“
4、奇数n”);,if(xy)max=x;else max=y;,例:判断整数i 的奇偶性。,if(i%2=0)printf(偶数n);else printf(奇数n);,2023年3月30日7时3分,说明:(1)双分支if语句形式上相当于单分支if语句扩展else分支而来,else分支称为else子句,else子句不能单独存在。(2)在其它高级语言中特别强调else子句前不能有分号,C语言中else子句前必有分号。(3)选择体如为多条语句同样必须采用复合语句。,2023年3月30日7时3分,例2:,#includevoid main()float x,y;printf(请输入x:);scanf(
5、%f,计算y的值:,2023年3月30日7时3分,从键盘接收两个数,求两个数中的最大值、最小值。,数据分析:输入量:两个数x、y,float型 输出量:最大值max、最小值min,float型算法分析:输入两个数x、y 比较两个数x、y 大小 如果xy,max=x,min=y 如果xy,max=y,min=x 输出最大值max、最小值min,例3:,2023年3月30日7时3分,#includevoid main()float x,y;float max,min;printf(请输入两个数x,y:);scanf(%f,%f,请输入两个数x,y:1.2,2.54运行结果:max=2.54,min
6、=1.20,2023年3月30日7时3分,#includevoid main()float x,y;printf(请输入两个数x,y:);scanf(%f,%f,请输入两个数x,y:1.2,2.54 运行结果:max=2.54,min=1.20,2023年3月30日7时3分,If语句的嵌套,格式:,在if语句中又包含一个或多个if语句称为if语句的嵌套。,if()if()语句1 else 语句2 else 语句3,if()语句1else if()语句2 else 语句3,if()if()语句1 else 语句2 else if()语句3 else 语句4,2023年3月30日7时3分,注意:i
7、f与else的配对关系,if()if()语句1 else if()语句2 else 语句3,这种表达与原意不符:else总是与上边最近的if配对,因此,把“if()语句1”加上“”才能实现原意,即 if()语句1。,2023年3月30日7时3分,程序段1:int x=20;if(x=0)if(x=0 且 x=0 且 x=50*/,分析下面两个程序段的输出结果,程序段2:int x=20;if(x=0)if(x 50)/*该 if 不可见*/printf(“x is okn”);else printf(“x is not okn”);,2023年3月30日7时3分,#includevoid ma
8、in()float x;float y;printf(请输入x:);scanf(%f,例4:,计算y的值:,2023年3月30日7时3分,例5 将百分制成绩转成五级记分(A、B、C、D、E)。,if(cj=90)ch=A;else if(cj=80)ch=B;else if(cj=70)ch=C;else if(cj=60)ch=D;else ch=E;,2023年3月30日7时3分,多分支if语句可用多条单分支、双分支if 语句等价实现。,例如:例 4 用单分支if语句处理:if(x0)y=1;例 5 用单分支if语句处理:if(cj=90)ch=A;if(cj=80,2023年3月30日7
9、时3分,3.多分支选择switch语句,语句格式:switch(表达式)case 常量表达式1:语句组1;case 常量表达式2:语句组2;case 常量表达式n:语句组n;default:语句组n+1;,2023年3月30日7时3分,(1)case后可以是常量表达式,常量表达式的值必须互不相同,否则会出现二义性。(2)常量表达式可以是任何类型,一般为整型、字符型等。(3)每个case 和default的出现次序不影响执行结果。(4)case 只起语句标号作用,不进行条件的判断。执行完一个case后面的语句,接着执行下一个case。(5)一种情况处理完后,一般应使程序的执行流程跳出switch
10、结构,终止switch语句的执行,这可借助break语句完成。,说明:,2023年3月30日7时3分,(6)最后一种情况处理中可以不加break语句。(7)当多个常量代表一种情况时,出现在前面case中的情况处理无语 句,这实际上也是多个case共用一组执行语句。(8)可以没有default子句。,2023年3月30日7时3分,Break语句的使用,break语句形式为:break;,一般使用了break语句的switch语句形式为:,switch(选择表达式)case 常量1:语句体1 break;case 常量2:语句体2 break;case 常量n:语句体n break;default
11、:语句体n+1,2023年3月30日7时3分,90100分 A 8089分 B 7079分 C 6069分 D 59分以下 E,switch语句描述的是多分支选择的一种特殊情况,可用if语句等价实现。如例5:将百分制成绩转成五级记分(A、B、C、D、E)。,注意选择表达式的构造:,int grade;scanf(“%d”,2023年3月30日7时3分,#include void main()char grade;int score;printf(“please input a score:”);scanf(“%d”,例6:根据分数给出考试成绩的等级,2023年3月30日7时3分,例7:根据考试
12、成绩的等级输出百分制分数段。,#includevoid main()char grade;scanf(“%c”,/最后可省略break,2023年3月30日7时3分,t-Turbo C b-Borland C m-Microsoft C v-Visual C,例 8 根据输入的字符,输出相应的字符串。,#includevoid main()char ch;scanf(%c,2023年3月30日7时3分,本节作业,1、从键盘输入三个整数,求其中最大值和最小值。2、从键盘输入一个正整数,判断该数是偶数还是奇数。3、从键盘输入三个正整数,按从大到小的顺序输出。,2023年3月30日7时3分,#inc
13、ludevoid main()char c1;scanf(“c1=%c”,程序设计:输入一个字符,如果是大写字母,将其转换为小写字母,如果是小写字母,将其原样输出。,2023年3月30日7时3分,goto语句,格式:goto 语句标号;功能:将程序的执行流程无条件转移至语句标号所标识的位置处执行。,说明:C语言的语句标号用标识符表示,它仅仅表示goto语句转移的目标地址。带有标号的语句称为标号语句,标号与语句之间用冒号分隔。标号语句仅对goto语句有意义。goto语句往往与if 语句配套使用构成一种远距离的转移。,2023年3月30日7时3分,(4)if语句加goto语句还可构成循环。例如:x
14、=0;flag:if(x10)x+;goto flag;(5)不允许使用goto语句把程序控制转移到其它函数内部,不允许使用goto语句把程序控制转向数据说明语句。(6)尽量少使用goto语句,即使使用,一般也不要将程序执行流程向后转移。,2023年3月30日7时3分,程序设计举例,例 9 求出三个数中的最大值。,数据分析:输入量:三个数x、y、z,float 输出量:max,float 算法分析:算法一:直接求最大值。算法二:先假定第一个数是最大值,将其它数依次与最大值 比较,如比最大值还大,这个数是新的最大值。,2023年3月30日7时3分,#includevoid main()float
15、 x,y,z;float max;clrscr();printf(请输入三个数x,y,z:);scanf(%f,%f,%f,算法一:,2023年3月30日7时3分,先假定第一个数是最大值。范例:输入两个整数,输出其中较大的数。,算法二引入:,#include main()int a,b,max;scanf(“%d,%d”,2023年3月30日7时3分,#includevoid main()float x,y,z;float max;clrscr();printf(请输入三个数x,y,z:);scanf(%f%f%f,算法二:,输入数据:12.34,2.18,10.68运行结果:x=12.34,
16、y=2.18,z=10.68,max=12.34,2023年3月30日7时3分,输入四个整数,输出最大的数(用条件运算符解),#includevoid main()int a,b,c,d,max;scanf(“%d,%d,%d,%d”,2023年3月30日7时3分,程序设计:,#includevoid main()int a,b,c,t;scanf(“%d%d%d”,从键盘输入三个(正)整数,按着由大到小的顺序输出来。,2023年3月30日7时3分,例 10 由三边求三角形面积和周长。,#includevoid main()float a,b,c,hl,s,l;int flag;/*为1,三边
17、能构成三角形*/printf(请输入三角形的三边:);scanf(%f,%f,%f,2023年3月30日7时3分,例 11 求方程ax2+bx+c=0的实根。,2023年3月30日7时3分,#includevoid main()float a,b,c,d,x,x1,x2;clrscr();printf(请输入方程系数a、b、c:);scanf(%f,%f,%f,2023年3月30日7时3分,Else d=b*b-4*a*c;if(d=0)x1=(-b+sqrt(d)/(2*a);x2=(-b-sqrt(d)/(2*a);printf(第一个根=%6.2f,第二个根=%6.2f n,x1,x2)
18、;else printf(方程无实根!n);,接上页,2023年3月30日7时3分,例:从键盘输入一个年份,判断是否为闰年。,闰年的条件是:1、年份能被4整除但不能被100整除,或者2、年份能被100整除同时也能被400整除。满足其中任何一个条件时这个年份就是闰年。,#includevoid main()int year;scanf(“%d”,2023年3月30日7时3分,数据分析:输入量:年号year,月号month,int 中间量:闰年标志leap,int 输出量:无,直接输出 算法提示:闰年:(year%400=0)(year%4=0&year%100!=0)每月天数的输出通过开关语句(
19、switch)处理。,例 12:输入年号,判断是否为闰年;输入月号,输出每月天数。,2023年3月30日7时3分,#includevoid main()int year,month,leap;printf(输入年号:);scanf(%d,2023年3月30日7时3分,例 13 两个数的+、-、*、/简易计算器程序。,数据分析:输入量:两个数x、y,float 运算符op,char 输出量:计算结果j,float 算法提示:运算选择通过开关语句处理。除法运算时要考虑被除数为0的情况。,2023年3月30日7时3分,#includevoid main()float x,y,j;char op;pr
20、intf(输入两个数:);scanf(%f,%f,运行结果:输入两个数:3,6 输入运算符:*结果=18.0000,2023年3月30日7时3分,作业1:输入一个整型数,判断其被3,5整除情况。,一个数被某个数整除的情况,应该有两种情况:能被整除 不能被整除 那么输入一个数判断其被3和5整除的情况,也应该遵循上面的原则,但要考虑3和5同时整除的情况。,#includevoid main()int x;scanf(“%d”,2023年3月30日7时3分,某商场销售商品,实行按比例优惠,优惠率 如下,货款在某200元以下不优惠,200元以上优惠7。5%,300元以上优惠10%,400元以上优惠15
21、%,500元以上优惠20%。求应付货款。,#includevoid main()float num,cost;scanf(“%f”,作业2:,2023年3月30日7时3分,征税问题:价格高于10000元的税为5%,高于5000元税为3%,高于1000元税为2%,低于1000元不征税。请输入货物价格,输出税金。,提示:各段采用不同税率进行征收。如:贷款为53000元,其中43000元以上按5%征收,s剩下的10000元 中,5000元按3%征收。然后剩下的5000中高于1000元按2%,1000元以下不征税,作业3:,2023年3月30日7时3分,#include main()float pri
22、ce,tax=0;printf(“input price:n”);scanf(“%f”,2023年3月30日7时3分,作业4 通讯录管理主控程序。,通讯录管理程序Add-追加数据 Modify-修改数据Delete-删除数据 Print-打印数据Quit-退出程序请选择(A/M/D/P/Q):,要求:先在屏幕上输出主控界面,然后接收来自用户的响 应,并在屏幕上输出该用户所选功能的字样。例如:用户输入“P”字符,则程序能够在屏幕上输出“打印数据”字样。,/*主控界面*/,2023年3月30日7时3分,main()char ch;/*选择变量*/clrscr();printf(%sn,通讯录管理程序);printf(%sn,Add-追加数据 Modify-修改数据);printf(%sn,Delete-删除数据 Print-打印数据);printf(%sn,Quit-退出程序);printf(请选择(A/M/D/P/Q):);scanf(%c,2023年3月30日7时3分,谢 谢 大 家!,