下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 05_第05章 选择结构程序设计

05_第05章 选择结构程序设计.ppt

05_第05章 选择结构程序设计

tianxingmeizhou
2010-12-15 0人阅读 举报 0 0 暂无简介

简介:本文档为《05_第05章 选择结构程序设计ppt》,可适用于工程科技领域

第五章选择结构程序设计第五章选择结构程序设计要设计选择结构程序要考虑两个方面的问题:一是在C语言中如何来表示条件二是在C语言中实现选择结构用什么语句。关系运算及其表达式逻辑运算及其表达式if语句switch语句选择结构程序举例关系运算符和关系表达式关系运算实质是比较运算它是将两个值进行比较判断其比较的结果是否符合给定的条件其结果为真()或者为假()。关系运算符及其优先次序C语言提供了种关系运算符:<小于<=小于或等于>大于>=大于或等于==等于!=不等于优先级相同(高)优先级相同(低)说明:)关系运算符的优先级低于算术运算符)关系运算符的优先级高于赋值运算符关系表达式用关系运算符将两个表达式(可以是算术表达式或关系表达式逻辑表达式、赋值表达式、字符表达式)连接起来的式子称为关系表达式。下面为一些合法的关系表达式:ab>bc(a=)>(b=)‘a’>‘b’关系表达式的结果只有两种:真或假在C语言中以数值代表“真”数值代表“假”。例:假设a=,b=,c=则:(a>b)==cd=a>bf=a>b>c结果为:表达式的值为(真)结果为:d的值为,表达式的值为结果为:f的值为,表达式的值为逻辑运算符和逻辑表达式逻辑运算符及其优先次序C语言提供三种逻辑运算符:()逻辑与(与运算符)()||逻辑或(或运算符)()!逻辑非(非运算符)说明:)“”和“||”为双目运算符“!”为单目运算符)逻辑运算的结果只有两种:真或假。逻辑运算的真值表详细情况见书P表。几种运算符的优先次序为:例:!ab||x>yc逻辑表达式给出逻辑运算结果:数值代表“真”数值代表“假”判断一个量是否为“真”:代表“假”非代表“真”例:)若a=则!a=)若a=b=则ab=a||b=!a||b=)>||<!的值为)‘c’’d’的值为说明:对于“”和“||”逻辑运算符在逻辑表达式求解中有时并不需要执行所有的逻辑运算符。例如:abc如果a为假就不必判别b和c的值a||b||c如果a为真也不必判别b和c的值了。所以对于(m=a>b)(n=c>d)如果“a>b”的值为则n将不进行赋值运算而保留原值(Why)一个重要的例子:判断某一年是否为闰年的方法。而为闰年的条件是符合下面两者之一:()能被整除但不能被整除()能被整除又能被整除写出逻辑表达式:首先分析逻辑结构:、条件()和条件()的关系应该是“或”、而每个条件内部应该为“与”关系、条件()内满足被整除的一定满足被整除因此只需一个逻辑表达式即可所以最后的逻辑表达式为:((year==)(year!==))||(year==)根据运算符的优先级关系上式可简化为:year==year!=||year==if语句if语句if语句的三种形式:if(表达式)语句执行过程如左图:if(x>y)printf(“d”,x)表达式语句假()真(非)X>Yprintf(“d”,x)假()真(非)if(表达式)语句else语句例如:if(x>y)printf(“d”,x)elseprintf(“d”,y)if(表达式)语句elseif(表达式)语句elseif(表达式)语句…elseif(表达式m)语句melse语句n例:if(number>)cost=elseif(number>)cost=elseif(number>)cost=elseif(number>)cost=elsecost=number>cost=假真cost=真假cost=cost=真假cost=假真number>number>number>说明:)if语句中在if后面都有表达式一般为逻辑表达式或关系表达式也可以为其它表达式如果表达式的值为,则按“假”处理如果为非则按“真”处理例如:if()printf(“OK”)直接执行打印“OK”if(‘a’)printf(“d”,’a’)打印’a’的ASCII码)注意在if语句每个语句后都有分号if(number>)cost=elseif(number>)cost=elseif(number>)cost=elseif(number>)cost=elsecost=)在if和else后面可以只含一个内嵌的操作语句也可以有多个操作语句此时须用花括号“{}”将几个语句括起来成为一个复合语句。例:if(a>b){m=aprintf(“TheMAXnumberisd”,m)}else{m=bprintf(“TheMAXnumberisd”,m)}例:输入两个实数按代数值由小到大的次序输出这两个数分析:这是一个简单而重要的程序算法的关键在与设置一个中间交换变量用于比较两个实数的大小后进行次序的变换程序:main(){floata,b,tscanf(“f,f”,a,b)if(a>b){t=aa=bb=t}printf(“f,f”,a,b)}例输入个数a、b、c要求按由小到大的顺序输出分析:此题算法比上题稍微复杂一些。上题为两个变量比较大小只需进行一次比较而本题为三个变量则需进行三次比较。其伪代码算法为:ifa>b将a和b对换(对换之后a比b小)ifa>c将a和c对换(对换之后a比c小a为最小)ifb>c将b和c对换(对换之后b比c小b为次小)经过三次比较和变换后:a为最小值b为次小值c为最大值。程序可写为:#include<stdioh>Voidmain(){floata,b,c,tscanf(“f,f,f”,a,b,c)if(a>b){t=aa=bb=t}if(a>c){t=aa=cc=t}if(b>c){t=bb=cc=t}printf(“f,f,f”,a,b,c)}if语句的嵌套if语句的嵌套一般形式:if()if()语句else语句elseif()语句else语句注意:if与else的配对关系。else总是与它上面的最近的if配对。if()if()语句elseif()语句else语句if(){if()语句}elseif()语句else语句此if,else配对此if,else配对它们共同构成第一个If的内嵌语句加上一个花括符限定了内嵌if语句的范围可避免上述错误的出现例有一函数:编一程序输入一个x值输出y值。算法a:若x<y=若x=y=若x>y=输出x算法b:输入x若x<y=否则:若x=y=若x>y=输出y算法之变形算法的完整程序和简要流程图:main(){intx,yscanf(“d”,x)if(x>=)if(x>)y=elsey=elsey=printf(“x=d,y=dn”,x,y)}x>=Yy=x>YNNy=y=错误例之一的程序及流程图片段:y=if(x!=)if(x>)y=elsey=x!=Yy=x>YNNy=y=此程序的错误在于当x=时使y=而产生错误的原因是认为第二行的if和第四行的else配对书P程序也是犯了同样的错误条件运算符条件运算符条件运算符的引入:简化某些简单的if语句。例如:if(a>b)max=aelsemax=b可以写为:max=(a>b)a:b条件表达式的一般形式为:表达式表达式:表达式这是C语言中惟一的三目运算其流程图如左图所示。表达式条件表达式取表达式的值条件表达式取表达式的值真(非)假()说明:)执行顺序:先求解表达式,若为真(非)则求解表达式并把表达式的值作为整个条件表达式的值否则求解表达式把表达式的值作为整个条件表达式的值例:max=(a>b)a:b)条件运算符优先于赋值运算符而低于关系运算符和算术运算符所以:max=(a>b)a:b可以写成:max=a>ba:ba>ba:b相当于a>ba:(b)而不是(a>ba:b))条件运算符的结合方式为“自右向左”。如:a>ba:c>dc:d相当于a>ba:(c>dc:d))条件表达式不能取代一般的if语句只有在if语句中内嵌的语句为赋值语句且两个分支都给同一变量赋值时才能代替if语句。if(a>b)max=aelsemax=b)条件表达式中表达式的类型可以与表达式和表达式的类型不同。表达式和表达式的类型也可以不同而表达式的值取它们之中较高的类型。例:设x为整型变量有x’a’:’b’例:x>y:当x>y时表达式的值转换为例输入一个字符判断它是否为大写字母如果是将它转换为小写字符如果不是不转换。然后输出最后得到的字符。main(){charchscanf(“c”,ch)ch=(ch>=‘A’ch<=‘Z’)(ch):chprintf(“c”,ch)}此程序介绍一个大小写字母转换的方法值得注意和掌握。switch语句switch语句一般形式:switch(表达式){case常量表达式:语句case常量表达式:语句……case常量表达式n:语句ndefault:语句n}流程图如右图所示。表达式=常量表达式表达式=常量表达式表达式=常量表达式n语句语句语句ndefault语句n…………例:要求按照考试成绩的登记打印出百分制分数段。switch(grade){case’A’:printf(“~n”)case’B’:printf(“~n”)case’C’:printf(“~n”)case’D’:printf(“<n”)default:printf(“errorn”)}如果grade的值等于‘A’则将连续输出:~~~<error产生这样结果的原因是:“case常量表达式”只是起语句标号作用并不是在该处进行条件判断。因此根据switch后面表达式的值找到匹配的入口标号就从此开始执行下去不再进行判断。而这种流程控制并不是我们通常所希望的。我们通常情况下希望在执行一个case分支后使流程跳出switch结构终止switch语句的执行。一般我们使用break语句来达到此目的。因此我们通常使用的switch语句的一般形式为:switch(表达式){case常量表达式:语句breakcase常量表达式:语句break……case常量表达式n:语句nbreakdefault:语句n}最后一个分支可以不加break语句。这样switch语句的流程图就改为:表达式=常量表达式表达式=常量表达式表达式=常量表达式n语句语句语句ndefault语句n…………breakbreakbreakbreak……因此上例可以改写为:switch(grade){case’A’:printf(“~n”)breakcase’B’:printf(“~n”)breakcase’C’:printf(“~n”)breakcase’D’:printf(“<n”)breakdefault:printf(“errorn”)break}如果grade的值为‘B’则只输出“~”。说明:()若所有的case中的常量表达式的值都没有与表达式的值匹配执行default后面的语句()每一个case的常量表达式的值必须互不相同否则就会出现互相矛盾的现象()各个case和default的出现次序不影响执行结果程序举例程序举例编写程序的一般步骤:)分析题意)根据题意划出NS流程图)写出伪代码)写出程序代码)调试程序。例写程序判断某一年是否闰年。分析题意可参见例和例。此题中为了程序书写方便我们定义一个整型变量leap作为是否闰年的标志。画出NS流程图。year被整除真假year被整除year被整除真真真假假假leap=leap=leap=leap=leap输出“闰年”输出“非闰年”main(){intyear,leapscanf(“d”,year)if(year==){if(year==){if(year==)leap=elseleap=}elseleap=}elseleap=if(leap)printf(“dis”,year)elseprintf(“disnot”,year)printf(“aleapyearn”)}例运输公司对用户计算费用。路程(s)越远每公里运费越低。标准如下:s<km没有折扣=<s<折扣=<s<折扣=<s<折扣=<s<折扣=<s折扣设每公里每吨货物的基本运费为p货物重量为w距离为s折扣为d则总运费f的计算公式为:f=p*w*s*(d)分析:此类题特别适用于使用switch语句来解决关键之处在于switch语句中的表达式和常量表达式的取法和匹配的问题。在本题中折扣的变化点正好为的倍数因此我们可以定义一整型变量C(注意一定为整型)然后以C作为switch语句中的表达式。以路程与相除的商赋给C(此时得到一整数)switch语句的常量表达式。因此折扣分段为:C=没有折扣C=折扣C=折扣C=折扣C=折扣C=折扣对于s大于km的使其C=。main(){intc,sfloatp,w,d,fscanf(“f,f,d”,p,w,s)if(s>=)c=elsec=sswitch(c){case:d=breakcase:d=breakcase:case:d=breakcase:case:case:case:d=breakcase:case:case:case:d=breakcase:d=break}f=p*w*s*(d)printf(“freight=”,f)}

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/37

05_第05章 选择结构程序设计

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利