资源描述
C语言程序设计,单击此处编辑母版标题样式,第四章 选择结构程序设计,本章重点,选择结构的含义,If,语句的使用方法,Switch,语句的使用方法,所谓选择结构,是指根据不同的情况做出不同的选择,执行不同的操作。此时就需要对某个条件做出判断,根据这个条件的具体取值情况,决定应该执行何种操作。在解决实际问题中,许多时候需要根据给定的条件进行选择处理:条件满足时做什么,条件不满足时做什么。解决这类问题需要采用选择结构程序来实现。在,C,语言中,用,if,语句或,switch,语句来实现选择结构的程序设计。,4.1 if,语句,3-x x0,2/x x,0,y=,求解该问题的流程如下:,(,1,)输入,x;,(,2,)如果,x0,则,y=3-x,,否则,y=2/x,;,(,3,)输出,y,的值。,在此例中,要先判断,x,的值满足什么条件,然后根据判定的结果执行两种操作中的一种。,单分支选择,if,语句的形式为:,if,(表达式)语句,其执行过程是:首先求解表达式的值,若表达式的值为真(即为一个非,0,值),则执行表达式后面的语句;否则不执行任何操作,4.1.1,单分支,if,语句,单分支,if,语句流程图,表达式,语句,假(,0,),真(非,0,),例:输入两个数,比较其大小,将较大的数输出。,分析:,(,1,)输入两个数据,a,b,;,(,2,)进行判断,如果,ab,则输出,a;,否则,输出,b,#include,stdafx.h,#include,void main(),float,a,b,;,printf,(,请输入两个数:,);,scanf(%f,%f,&a,&b,);,if(a,b),printf(%f,a,);,图,4-2,例,4-1,流程图,N,Y,结束,开始,ab,输入,a,输入,b,输出,a,双分支选择语句为,if-else,,语句的结构形式为:,if,(表达式)语句,1,else,语句,2,其执行过程是:首先求解表达式的值,若表达式的值为真(即为一个非,0,值),则执行语句,1,;当表达式的值为假(为,0,),则执行语句,2,4.1.2,双分支,if,语句,双分支,if,语句流程图,表达式,语句,1,语句,2,真(非,0,),假(,0,),例:设计一个猜数游戏,由计算机产生一个随机数,再从键盘输入一个数,若输入的数等于随机数,则输出“,you are right”,,否则输出“,you are wrong”,。,分析:,(,1,),c,语言的库函数,rand(),用以产生随机数,它的取值范围是,032767,之间的一个正整数,;,(,2,)定义一个整型变量,magic,获取调用,rand(),函数时产生的随机数,(,3,)定义一个整型变量,guess,接收键盘输入的数,(,4,)比较,magic,和,guess,的值是否相等,(,5,)输出结果。,多分支选择语句的结构形式为:,if,(表达式,1,)语句,1,else if,(表达式,2,)语句,2,else if,(表达式,n,)语句,n,;,else,语句,n+1,;,其执行过程是:首先判断表达式,1,的值,若表达式,1,的值不等于,0,,则执行语句,1,,后面的语句再不执行;否则执行相应的,else,后面的语句,判断表达式,2,的值,若表达式,2,的值不等于,0,,则执行语句,2,,后面的语句再不执行,否则执行后面的,else,语句依此类推。,4.1.3,多分支,if,语句,表达式,1,语 句,1,真(非,0,),假(,0,),语 句,n,表达式,2,语 句,2,表达式,n,语 句,n+1,假(,0,),假(,0,),真(非,0,),真(非,0,),图,4-4,(,a,)多分支选择的流程图,多分支控制流程图,【,例,4-3】,要求判别键盘输入字符的类别。可根据输入字符的,ASCII,码来判别类型。在,0,和,9,之间的为数字,在,A,和,Z,之间为大写字母,在,a,和,z,之间为小写字母,其余则为其它字符。,分析:,定义一个字符变量接收键盘输入的值;,#include,stdafx.h,#include,stdio.h,main(),char c;,printf(input,a character:);,c=,getchar,();,if(c,=0&c=,A&c,=,a&c,b),printf(“max,=%,dn”,a,);,else,各有一个分号,printf(“max,=%,dn”,b,);,这是因为是,if,语句中的内嵌语句所要求的,若无此分号,就,会出现语法错误。但注意:,else,子句是,if,语句的一部分,它们,同属于一个,if,语句。,Else,不能作为语句单独使用,必须与,if,配,对使用,。,在,if,和,else,后面只含有一个内嵌的操作语句,当内嵌的操作有,多条时,必须用花括号“,”,括起来。组成一条复合语句且,使用时“”外不再加“;”。,例如:已知三角形的三条边,要求该三角形的面积。,部分程序段为:,if(,a+b,c&,b+c,a&,c+b,a),s=(a+b+c)/2.0;,area=,sqrt(s,*(s-a)*(,s-b,)*(,s-c,);,这里是一条复合语句,printf(“area,=%6.2f”,area);,else,printf(“it,is not trilateral“);,4.1.5 if,语句的嵌套,在,if,语句的内嵌语句(格式中的语句,1,或语句,2,)中,又出现,了,if,语句,称为,if,语句的嵌套,主要用于多分支的选择结构。,一般形式如下:,if(,表达式,1),if,(表达式,2,)语句,1,内嵌,if,语句,1,else,语句,2,else,if,(表达式,3,)语句,3,内嵌,if,语句,2,else,语句,4,必须注意,if,与,else,的配对关系。,else,总是与它上面的最近的,if,配对。如:,if(,表达式,1),if,(表达式,2,)语句,1,else,if,(表达式,3,)语句,2,编程者希望的内嵌,if,(将,else,与第一个,if,配对),else,语句,3,实际上,系统执行的是,else,与第二个,else,配对,if(,表达式,1),if,(表达式,2,)语句,1,else,if,(表达式,3,)语句,2,系统执行的内嵌,if,(将,else,与第二个,if,配对),else,语句,3,因此,使用,if,嵌套时,为达到程序设计者的企图,可以加花括号来确定配,对关系,如,if(,表达式,1),if,(表达式,2,)语句,1,使用复合语句达到,else,与第一个,if,配对,else,if,(表达式,3,)语句,2,else,语句,3,If,嵌套执行流程图,if,语句实现了两种分支的选择控制,但如果分支较多时,嵌套的,if,层数多,不仅程序冗长而且可读性降低。,C,语句提供的,switch,语句是用来直接处理多分支选择结构的语句,实际上是,if-else,语句的变型。其特点是根据一个表达式的多种值,选择多个分支,4.2 switch,语句,switch,语句的一般形式如下:,switch(,表达式,),case,常量,C1,:语句,1,case,常量,C2,:语句,2,case,常量,Cn,:语句,n,default,:语句,n+1,其执行过程是:计算表达式的值,并逐个与其,后的常量表达式值比较,当表达式的值与某个常量,表达式的值相等时,即执行其后的语句,直到遇到,break,语句为止。如表达式的值与所有,case,后的常量,表达式均不相同时,则执行,default,后的语句。,Switch,语句流程图,Switch,语句的说明,(,1,),Switch,后面括号内的表达式,允许为,c,语句中的任何类型,若表达式的值不是整数则自动取整。,(,2,),C1,C2,Cn,是常量表达式,它们必须与,Switch,后面括号内的表达式同一类型并且其值要互不相同。,(,3,)若希望执行完一组操作语句后退出,Switch,结构,可以用,break,语句终止,Switch,的继续执行。,Break,的作用中断正在执行的语句。在,switch,语句中的作用是:执行某个语句组后,将退出该,switch,语句。如果省略了,break,语句,则执行完某个语句组后,将继续执行其后的所有语句组。,(,4,),Case,和,default,后可面得操作语句可以是简单语句,也可以是复合语句,且这里的复合语句不必加,(,5,),switch,可以嵌套,(,6,)多个,case,可共用一组执行语句,如:,case A:,case B:,case ,C:printf(“score,60n”);,break;,例:编写一个程序,输出给定的某年某月的天数。,根据历法,第,1,、,3,、,5,、,7,、,8,、,10,、,12,月的每月为,31,天,第,4,、,6,、,9,、,11,月的每月为,30,天,,2,月份闰年为,29,天,平年为,28,天。判断闰年的规则是:如果此年号可以被,4,整除,但不能被,100,整除,则是闰年;或者该年份可以被,400,整除,则是闰年;否则不是闰年。,分析:,(,1,)如果,x,能被,y,整除,则余数为,0,,即如果,x%y,=0,,则表示,x,能被,y,整除;,(,2,)首先设置一个标志,leap,当,year,能被,400,整除,,leap,值设为,1,,表示该年为闰年,否则,leap,值设为,0,表示该年不是闰年;,(,3,)然后根据,leap,的值确定二月份的天数,#include,stdafx.h,#include,main(),int,year,mon,days,leap,;,printf,(,年,月:,);,scanf(%4d,%2d,switch(mon,),case 1:case 3:case 5:case 7:case 8:case 10:,case 12:days=31;break;,case 4:case 6:case 9:,case 11:days=30;break;,case 2:if(year%4=0&year%100!=0|year%400=0),leap=1;,else,leap=0;,if(leap,),days=29;,else days=28;,printf(%d,年,%d,月的天数为,%d,天,n,year,mon,days,);,【,例,4-5】,编写一个程序,用来进行十进制和十六进制,十进制和八进制之间的相互转换。,分析:,对于十进制和十六进制,十进制和八进制之间的相互转换看,起来比较复杂,但可以通过数值输出时的格式描述来实现。,%d,格式符输出十进制数;,%o,格式符输出八进制数;,%x,格式符输出十六,进制数;所以,当输入一个数值时,按需要的转换数的数制输出就达到,目的了。,对于设计要求来说,各种数制间的转换要求是任意的,可以通过设置选,择开关变量,choice,,由用户输入,14,之间的某一个数字,实现进行十,-,十六、十六,-,十、十,-,八、八,-,十之间的转换,当然还可以设置更,多的选择达到如八,-,十六等转换。,开关变量,choice,与,switch,语句联合使用就达到程序设计的要求了。,结束,开始,输入,choice,Choice=,?,输入十进制的,num,;,输出十六进制的,num,;,break,;,输入十六进制的,num,;,输出十进制的,num,;,break,;,输入十进制的,num,;,输出八进制的,num,;,break,;,输入八进制的,num,;,输出十进制的,num,;,break,;,选,择,出,错,图,4-7,例,4-5,算法流程图,/*decimal:,十进制,,hexadecimal,:十六进制,,octal:,八进制*,/,#include,main(),int,choice,,,num,;,printf(n,*conversion*),;,printf(n*1.decimal to hexadecimal*),;,printf(n*2.hexadecimal to decimal*),;,printf(n,*3.decimal to octal*),;,printf(n,*4.octal to decimal*),;,printf(n,*),;,printf(nenter,your choice(14):),;,scanf(%d,,,&choice),;,switch(choice,),case 1:,printf(nenter,decimal number:),;,scanf(%d,,,&num),;,printf(%d,in hexadecimal is:%x,,,num,,,num),;,break,;,case 2:,printf(nenter,hexadecimal number:),;,scanf(%x,,,&num),;,printf(%x,in decimal is:%d,,,num,,,num),;,break,;,case 3:,printf(nenter,decimal number:),;,scanf(%d,,,&num),;,printf(%d,in octal is:%o,,,num,,,num),;,break,;,case 4:,printf(nenter,octal number:),;,scanf(%o,,,&num),;,printf(%o in decimal is%d,,,num,,,num),;,break,;,default:,printf(n,your choice is error!),;,【,例,4-6】,编写一个程序,计算购货款。,设某商店售货,按购买货物的款数多少分别给予不同的优惠,折扣:,购货不足,250,元的,没有折扣;,购货满,250,元,不足,500,元,折扣,5%,;,购货满,500,元,不足,1000,元,折扣,7.5%,;,购货满,1000,元,不足,2000,元,折扣,10%,;,购货满,2000,元,折扣,15%,。,分析:,首先要定义一个变量用来存放购买货物的款数;,然后根据款数满足的条件决定使用哪个优惠折扣;,最后计算出折扣后的款数并输出。,F,F,F,T,T,T,T,d=0,d=5,d=7.5,d=10,开始,输入购买货物的款数,m,m250,m500,m1000,m2000,d=15,输出折后款数,amount,结束,图,4-8,例,4-6,算法流程图,F,#include,stdafx.h,#include,main(),float,m,d,amount,;,printf(nEnter,your money for buying:);,scanf(%f,&m,);,if(m250)d=0;,else if(m500)d=5;,else if(m1000)d=7.5;,else if(m2000)d=10;,else d=15;,amount=m*(1-d/100);,printf(namount,=%6.2f,amount);,【,例,4-7】,编一程序将以英寸为单位表示的长度转换为以厘米为单位表示的长度;或者反之,从厘米转换为英寸。,已知:,1,英寸,=2.54,厘米,分析:,实现英寸和厘米之间的相互转换,根据以上的单位转换规律,可以实现;,用,c,语言实现这一转换,,if,结构和,switch,结构都可以实现控制,语句的分支;,根据设计要求,设置一个开关变量,select,用来选择实现的转换,种类;,select=1,表示将英寸转换为厘米,,select=2,表示将厘米,转换成英寸。,最后根据换算公式求解,并输出结果。,开始,输入开关变量,select,select=1,select=2,输出,leng,inch=,leng,*r cm,输出,leng,cm=,leng/r,inch,T,T,F,结 束,图,4-9,例,4-7if,语句实现算法流程图,#include,stdafx.h,#include,main(),int,select;,float,leng,r,=2.54;,printf(nPlease,choose(1:inch to cm,2:cm to inch):);,scanf(%d,&select,);,printf(Enter,the length:);,scanf(%f,&leng,);,if(select=1)printf(n%6.2f inch=%6.2f cm,leng,leng,*r);,else if(select=2)printf(n%6.2f cm=%6.2f inch,leng,leng/r,);,输出,leng,inch=,leng,*r cm,开始,输入开关变量,select,select=,?,输出,leng,cm=,leng/r,inch,2,结 束,图,4-10,例,4-7 switch,语句实现算法流程图,1,#include,stdafx.h,#include,main(),int,select;,float,leng,r,=2.54;,printf(nPlease,choose(1:inch to cm,2:cm to inch):);,scanf(%d,&select,);,printf(Enter,the length:);,scanf(%f,&leng,);,switch(select),case 1:printf(n%6.2f inch=%6.2f cm,leng,leng,*,r);break,;,case 2:printf(n%6.2f cm=%6.2f inch,leng,leng/r);break,;,default:printf(Enter,error!)n);,
展开阅读全文