




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
选择结构实现语句
——分支 结构程序设计4.1选择结构与条件判断4.2实现两分支选择的if语句4.3实现多重选择的if嵌套4.4实现多分支选择的switch语句4.5选择结构程序设计实操训练课外练习
4.1选择结构与条件判断
在C程序中如何表达分支判断条件?选择结构(或称分支结构)就是依据一定的条件作出逻辑判断,有选择地处理问题。选择结构的一般结构形式如图4.1所示。图4.1选择结构
4.1.1关系运算符和关系表达式
关系表达式是用关系运算符连接运算对象的式子。C语言中的关系运算符如表4.1所示。
从表4.1可以看出,C语言中的关系运算符所表示的运算关系及其优先级顺序与数学中的关系运算符一致,但有些表示符号是不同的。这一点要在使用中加以注意,不能混淆,否则编写的程序将在编译时出错。
关系运算符的结合性是自左至右,同优先级的运算符按从左到右的顺序运算,不同优先级的运算符按先高后低的顺序运算。使用括号可改变运算符的运算顺序,即先括号内、后括号外。
4.1.2逻辑运算符和逻辑表达式
逻辑表达式是用逻辑运算符将逻辑运算对象连接起来的式子。C语言中的逻辑运算符如表4.2所示。
逻辑运算符的优先级顺序为!(非)→&&(与)→||(或),即“!”优先级最高。
逻辑表达式中可以将算术表达式、关系表达式作为逻辑运算对象,即逻辑表达式可以是算术运算符、关系运算符、逻辑运算符和其他运算符组成的混合运算表达式。运算时要依据优先级顺序来进行。至此,所学过的运算符的优先级顺序如下:
逻辑表达式用来表示由简单条件组成的复合条件。例如,闰年的判定条件是满足如下两个条件之一:
(1)能被4整除,但不能被100整除,如2008;
(2)能被400整除,如2000。
闰年的判定条件可用如下的逻辑表达式表示(年份用变量year表示):
(year%4==0&&year%100!=0)||year%400==0
可以用否定命题来判断非闰年。其逻辑表达式为
!((year%4==0&&year%100!=0)||year%400==0)
此表达式的值为1(真),则year表示的年份为非闰年,否则为闰年。
还可以用下面的逻辑表达式来判断非闰年:
(year%4!=0)||(year%100==0&&year%400!=0)
综上可知,构造一个符合条件的逻辑表达式不是唯一的,分析清楚逻辑关系,可从不同命题角度来构造逻辑表达式,但最终要分析逻辑表达式的值是否符合命题要求。
4.1.3逻辑型变量
C99标准中新增加了逻辑类型数据,可以定义逻辑型变量,将关系运算和逻辑运算的结果存放到一个逻辑型变量中,以便于分析和运算。逻辑类型的关键字是“_Bool”。例如,对学生的考试成绩分级,定义逻辑变量以存放判定结果,可使程序简单明晰:
在头文件stdbool.h中,若定义bool为_Bool的替代标识符,同时定义两个符号常量true和false,分别表示逻辑真(1)和逻辑假(0),则上面的程序可写为
逻辑类型bool及true和false是C++中使用的,C语言新标准中吸收进来,以增加程序的可读性。但是目前使用的有些C编译系统还未实现此功能。如果使用,需了解所使用的编译系统是否支持。
4.1.4条件运算符和条件表达式
“?”是条件运算符,可以连接运算对象形成条件表达式。条件表达式的一般形式为
表达式1?表达式2:表达式3
其中,表达式可以是算术表达式、关系表达式和逻辑表达式。表达式的求值顺序是:先求表达式1的值,若表达式1的值为逻辑真,则求表达式2的值,并把表达式2的值作为条件表达式的值;若表达式1的值为逻辑假,则求表达式3的值,并把表达式3的值作为条件表达式的值。
“?”运算符的优先级高于“=”和“,”运算符,低于其他所有运算符,见附录C。
例4.1利用条件表达式求两数中的大数。
分析:输入3和9,a的值是3,b的值是9,a小于b,所以b的值作为条件表达式的值赋给max,因此输出结果是9。
条件表达式和前面介绍的分支结构的逻辑关系一致,但与后面的选择语句有本质的区别。条件表达式只是语句的成分,编译时不生成语句代码,而选择语句编译时要生成语句代码。
4.2实现两分支选择的if语句
怎样实现简单逻辑判断与选择?实现图4.1所示的两分支的选择结构用if语句。if语句的基本形式为形式一:if(表达式)语句1;else语句2;形式二:if(表达式)语句1;
其中,if和else是语句的关键字。表达式表示分支选择条件,可以是关系表达式、逻辑表达式或其他表达式。如果使用算术表达式等其他类型的表达式,则表达式的值按逻辑值处理,即计算结果为非0,表示逻辑“真”;计算结果为0,表示逻辑“假”。
因为if语句是结构型语句,所以语句1和语句2必须是符合C语言规定的语句形式,但不一定是一个基本语句。如果有多个基本语句,则要用花括号括起来,构成复合语句。
第一种形式的if语句对应图4.1(a)所示的分支结构。执行流程是:先计算表达式的值,如果表达式的值为真,执行语句1;如果表达式的值为假,执行语句2。也就是说,根据表达式值的真假,在两个分支语句中选择一个执行,称为双分支选择型。在这种形式中,if和else必须配对使用。
第二种形式的if语句对应图4.1(b)所示的分支结构。执行流程是:先计算表达式的值,如果表达式的值为真,执行语句1,否则不执行语句1就结束,称为单分支选择型。
例4.2编程输入两个实数,按由大到小的顺序输出。
编程解题思路:输入两个实数,存放在两个变量a、b中,比较a和b的值,如果a<b,则交换a和b的值,否则不交换。注意交换两变量的值时不能直接交换,因为变量代表存储单元,一个数存入后将覆盖原来的数,所以必须设置一个暂存变量t。交换的方法是,先将a的值送t中暂存,再将b的值送a中,最后将暂存到t中的a值送给b。
分析:执行scanf函数,输入13和29,将13赋给a,29赋给b。因为a小于b,所以,执行if中的复合语句,进行交换。输出的是交换后的结果。程序中的if语句是单分支选择型的。
例4.3编程求解一元二次方程ax2+bx+c=0的根。
编程思路:求解一元二次方程的根需输入3个系数值,求判别式的值,当值小于0时无实数根,当值大于等于0时才能求出实数根,其流程图如图4.2所示。图4.2一元二次方程求解流程图
分析:
(1)为了提高精度,将所有变量定义为双精度浮点型。
(2)程序中使用了双分支选择型if语句。输入3、5、2,计算disc的值(5×5-4×3×2=1),大于0,执行else后的分支2复合语句,即求出实根并输出。如果输入使判别式小于0的系数(如6、4、2),则执行if后的分支1语句,输出无实根的提示信息。请读者自行验证。
4.3实现多重选择的if嵌套
怎样实现比较复杂的逻辑判断与选择?因两种基本if语句形式中的分支1和分支2可以是C语言中的任何语句,所以也可以是if语句本身,这就形成了if语句中套if语句的形式,称为if嵌套。当然,在嵌套的if语句中还可以再嵌套if语句,就形成了多重嵌套。
两种if语句形式可以形成多种嵌套形式,以下是嵌套形式之一:
if(表达式1)
if(表达式2)语句2;
else
if(表达式3)语句3;
else语句4;
显然,在if语句的两分支中都嵌套了if语句。分支1嵌套了单分支选择型if语句,分支2嵌套了双分支选择型if语句。
利用if嵌套可以实现多重分支选择。上面嵌套形式的if语句的执行可用图4.3所示的流程图说明。
图4.3if嵌套流程图
在if嵌套语句中,往往不容易识别if和else的配对关系,为了程序表述清晰、可读性好,提倡养成缩进对齐的书写习惯,即内层嵌套的if语句缩进,一个语句中的if与else对齐。在阅读if嵌套结构程序时,可从一个if嵌套结构的最后开始,找到一个else,先与在它前面最近的没有配对的if配对,依次向前面逐个找else配对,一直配对到最前面的一个if。
例4.4编程求解如下分段函数的值。
编程思路:输入x值,先判断是否小于0。如果小于0,则函数值为-1;如果不小于0,还需判断是等于0还是大于0。显然,属于三分支选择,应该用if的两层嵌套来实现。
分析:输入x的值10,if第1层条件判断为假,执行else分支的if语句;进行第2层条件判断,为假,则执行第2层的else分支语句,给y赋值1。结束if语句后,输出x、y的值。分别输入小于0、等于0的数,读者可自行验证程序。
4.4实现多分支选择的switch语句
怎样实现多路逻辑判断与选择?基本if语句只能实现两分支的选择。实际中常会遇到多分支选择的问题,如学生成绩的分级(90分以上为A级,80~89分为B级,70~79分为C级,60~69分为D级,60分以下为E级),人口统计中老、中、青、少、儿童的分类等。这类问题可以用if嵌套来处理,但分支越多,嵌套层数也越多,程序冗长且可读性降低。C语言提供的多分支选择语句可解决此类问题。
其中:
(1)switch、case、default是语句的关键词,而且要严格地按照以上结构的顺序关系
书写。
(2)表达式要求是整数类型的表达式,可包括字符型表达式。
(3)每一个case后必须有一个常量或常量表达式,不能出现变量或包含变量的表达式。
(4)常量后的语句可以是C语言允许的任何语句形式。
(5) default行可以缺省。
switch语句的执行流程是:先计算表达式的值,然后依次与花括号中case后的常量进行匹配,如果不匹配(不相等),则接着与下一个case常量匹配,直到与某一个常量匹配上就从该case后的语句开始,顺序执行其后所有的case语句。如果n个常量都匹配不上,则执行default后的第n+1个语句。如果缺省default,且n个常量都匹配不上则自动结束switch语句。case可理解为情况,常量表达式与case常量的匹配,可理解为情况符合检查,如果符合某一情况,就从该情况开始,处理后面各种情况。switch语句的执行流程图如图4.4所示。图4.4switch语句的执行流程图
从流程图可以看出,比较匹配是找一个符合情况的执行点,相当于寻找一条道路的入口,不同入口到终点的路程是不同的。有些问题有多个分支,各个分支的处理方式各不相同,要求根据情况选择一个分支执行。switch语句的执行流程不符合这类问题的要求。C语言提供了一个提前结束switch语句的break语句。使用break语句可实现多分支选一,其形式为
在case语句后加上“break;”,其作用是:当与case常量匹配上,执行完该case语句后就立即结束switch语句,即不执行其后的语句。在每一个case语句后加上break语句,则执行流程变为图4.5所示的情况。图4.5加入break语句后的switch语句执行流程图
例4.5输入一学生成绩,按分数段分级,输出该学生等级和所在的分数段。等级划分为:90分以上为A级,80~89分为B级,70~79分为C级,60~69分为D级,60分以下为E级。
编程思路:学生成绩分为5段(5级),适合用switch结构语句。
分析:为了使switch语句常量表达式的值与case常量按序列顺序匹配,将输入的成绩按分段要求转换到0~4的整数级上,使用了表达式(int)(score/10-5),又用了两个if语句,使得分数在60分以下时转换成整数0,赋给grade;分数在60~69分范围时转换成整数1,赋给grade;分数在70~79分范围时转换成整数2,赋给grade;分数在80~89分范围时转换成整数3,赋给grade;分数在90~100分范围时转换成整数4,赋给grade。这样,case常量分别是0、1、2、3、4。这是使用switch语句求解问题的一个重要方法。输入76.5,经运算,grade的值为2,与case常量2匹配,按指定的格式输出分数段70~79及等级C。
4.5选择结构程序设计
选择结构程序设计应考虑哪些问题?如何准确地构造分支选择条件?选择结构程序设计要分析问题的分支数和选择条件,根据分支数恰当选择实现语句。分支数较少时,选择if语句;分支数较多时,最好选择switch语句,尽量避免if的多层嵌套,因为if嵌套程序的可读性较差。根据选择条件设计表达式,是分支结构程序设计的关键。
分析条件时,先从简单条件入手,用关系表达式表示,再分析简单条件之间的逻辑关系,用逻辑表达式表示。设计出条件表达式后,应进行取值分析,检查取值是否完全符合问题要求。复杂问题要设计算法描述图。下面通过几个实例来说明分支程序设计的方法。
例4.6编写程序,判定某一个年份是否是闰年。
编程思路:前面已经分析过,判定闰年的条件是复合条件。根据逻辑关系构造逻辑表达式(year%4==0&&year%100!=0)||year%400==0,可用综合的逻辑表达式来表示条件,采用一个简单的if语句来实现;也可以把简单条件的逻辑关系表现在程序的执行过程中,即根据逻辑关系,按简单条件逐个判断,这样实现的N-S图如图4.6(a)所示,还可从否定逻辑表达式(year%4!=0)||(year%100==0&&year%400!=0)按简单条件逐个判断,这样实现的N-S图如图4.6(b)所示。图4.6闰年判定程序N-S图
在N-S图中,leap为一标志变量,若是闰年则设置为1,若不是闰年则设置为0。
(2)按图4.6(a)编写程序:
分析:两种方法编写的程序都能正确判定闰年。程序(1)用综合逻辑表达式作判断条件,采用一个简单if语句即可实现,程序简洁;程序(2)按简单条件逐个判断,用if嵌套实现,程序比较长,可读性没有程序(1)好,但也是分支程序的一种设计方法。在条件复杂而不便于用综合逻辑表达式的情况下,可用简单条件逐个判断的方法来设计程序。读者可按图4.6(b)表示的算法自行设计程序。
例4.7编程实现运输公司对用户运输费用的计算。运输费用根据路程长短采取不同的折扣标准,计费标准如下(s表示路程):
编程思路:设每吨每千米的基本运费为p,货物重量为w,路程为s,折扣为d,总运费为f,则运费计算公式为
f = p × w × s × (1 - d)
该问题属于多分支选择,应用switch语句来实现。但switch语句要求的是常量表达式,而且要能方便与case常量比较匹配,而问题中的每个条件是一个复合关系表达式。这是求解问题的关键。经分析可以发现,折扣率的变化点250、500、1000、2000、3000都是250的倍数,因此设计一个表达式c=s/250,对计算结果取整,则可将折扣条件转换为
可以将折扣率分13种情况,分别用0~12之间的整数来表示每一种情况,即情况0(无折扣),情况1(折扣率2%),情况2、3(折扣率5%),情况4、5、6、7(折扣率8%),情况8、9、10、11(折扣率10%),情况12(折扣率15%)。这样就可以使用switch语句了。
分析:使用if语句,在路程为3000及以上时,给c赋值12,其他距离值按c=s/250计算并得到整数,使c取值为1~12中的整数。相同折扣的情况下,只有最后一个case有折扣率赋值语句,前面的case后没有折扣率赋值语句,即使匹配上,因没有语句,故继续向下执行,直到最后一个case,将赋折扣值,执行break语句,结束switch语句。这样就保证了折扣的条件范围。从本例可以看出,多分支问题中使用switch语句的关键是转换条件为常量表达式,并使常量表达式的取值为一个序列,方便与case常量匹配。
实操训练
实训任务四学习选择结构程序设计的方法实训项目设计程序,实现运算器功能。输入/输出界面可参照图4.7所示。图4.7实训项目界面式样
实训指导
1.设计程序
(1)定义变量。
(2)调用格式输出函数,显示屏幕菜单及相关提示信息。
(3)调用格式输入函数,输入菜单选择。
(4)如果菜单选择为0,则返回(return0;);如果菜单选择为(1~4),则输入运算数。
(6)使用switch语句,根据菜单选择,输出运算式。
2.调试运行程序
选择菜单中的每一个功能,测试程序是否达到要求。
课外练习
1.分析下列逻辑表达式的值。(1) a+b>c&&b==c;(2) a||b+c&&b-c;(3) !(a>b)&&!c||1;(4) !(x=a)&&(y=b)&&0;(5) !(a+b)+c-1&&b+c/2。
2.分析以下问题,从每小题的4个备选项中选择一个正确项。
(1)下面程序的输出结果是()。
(2)若执行下面程序时,从键盘上输入9,则输出结果是()。
A.11 B.10
C.9 D.8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国广电来宾市2025秋招笔试行测题库及答案市场与服务类
- 保山市中石油2025秋招心理测评常考题型与答题技巧
- 莆田市中石化2025秋招面试半结构化模拟题及答案炼油工艺技术岗
- 国家能源齐齐哈尔市2025秋招笔试题库含答案
- 2025年电厂安装考试题及答案
- 中国广电黄石市2025秋招市场与服务类专业追问清单及参考回答
- 亳州市中石化2025秋招面试半结构化模拟题及答案数智化与信息工程岗
- 达州市中石油2025秋招笔试模拟题含答案炼油设备技术岗
- 教育学章节测试题及答案
- 国家能源太原市2025秋招笔试言语理解与表达题专练及答案
- 2025四川省水电投资经营集团有限公司所属电力公司员工招聘6人考试参考试题及答案解析
- 新疆劳动就业白皮书课件
- 视觉障碍老人护理指南
- 手术室无菌技术操作讲课
- 宠物医院建设方案(3篇)
- 2025年中学生法治素养竞赛题库及答案
- 《“高效办成一件事”2025年度第二批重点事项清单》知识解读
- 2025年飞行器设计与工程师考试试卷及答案
- 2025年三级律师试题题库及答案
- 布控球使用管理办法
- 智能化系统施工方案及技术措施
评论
0/150
提交评论