版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章
选择结构实现语句——分支结构程序设计4.1选择结构与条件判断4.2实现两分支选择的if语句4.3实现多重选择的if嵌套4.4实现多分支选择的switch语句4.5选择结构程序设计实训任务七
熟悉逻辑表达式和选择结构语句实训任务八
学习选择结构程序设计的方法 4.1选择结构与条件判断
在C程序中如何表达分支判断条件?
选择结构(或称分支结构)就是依据一定的条件作出逻辑判断,有选择地处理问题。选择结构的一般结构形式如图4.1所示。
图4.1选择结构图4.1(a)是根据条件成立与否在两个分支中选择一个分支处理,即处理分支1或处理分支2;图(b)是根据条件成立与否选择是否要处理分支1,即处理分支1或不处理。选择结构中,判断条件是实现选择的关键。C语言中的判断条件是用表达式来表示的。这种表达式的值只有两种,即“真”和“假”,称为逻辑值。条件成立是逻辑“真”,条件不成立是逻辑“假”。在C语言编译系统中,以数值“1”代表逻辑“真”,以“0”代表逻辑“假”。把一个数值作为逻辑量判断时,以“非0”代表逻辑“真”,以“0”代表逻辑“假”,即将一个非0的数值作为逻辑“真”。表示选择结构中的判断条件的表达式有关系表达式、逻辑表达式和条件表达式等。4.1.1关系运算符和关系表达式
关系表达式是用关系运算符连接运算对象的式子。C语言中的关系运算符如表4.1所示。
从表4.1可以看出,C语言中的关系运算符所表示的运算关系及其优先级顺序与数学中的关系运算符一致,但有些表示符号是不同的。这一点要在使用中引起注意,不能混淆,否则编写的程序将在编译时出错。
关系运算符的结合性是自左至右的,同优先级的运算符按从左到右的顺序运算,不同优先级的运算符按先高后低的顺序运算。使用括号可改变运算符的运算顺序,即先括号内、后括号外。
表4.1关系运算符4.1.2逻辑运算符和逻辑表达式
逻辑表达式是用逻辑运算符将逻辑运算对象连接起来的式子。C语言中的逻辑运算符如表4.2所示。
表4.2逻辑运算符逻辑运算符的优先级顺序为!(非)→&&(与)→||(或),即“!”优先级最高。
逻辑表达式中可以将算术表达式、关系表达式作为逻辑运算对象,即逻辑表达式可以是算术运算符、关系运算符、逻辑运算符和其他运算符组成的混合运算表达式。运算时要依据优先级顺序来进行。至此,所学过的运算符的优先级顺序为:
!(非)→算术运算符→关系运算符→&&(与)→|| (或)→赋值运算符→逗号运算符
表4.3表达式求解顺序逻辑表达式用来表示由简单条件组成的复合条件。例如,闰年的判定条件是满足如下两个条件之一:
(1)能被4整除,但不能被100整除,如2008;
(2)能被400整除,如2000。
闰年的判定条件可用如下的逻辑表达式表示(年份用变量year表示):
(year%4==0&&year%100!=0)||year%400==0
如果表达式的值为1(真),year表示的年份为闰年,否则为非闰年。
可以用否定命题来判断非闰年。其逻辑表达式为
!((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。分析:输入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就结束,称为单分支选择型。
下面通过例子来说明if语句的使用。
例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所示。
#include<stdio.h>
#include<math.h>
图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语句执行流程下面通过例子来说明witch语句的应用。
例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图分析:两种方法编写的程序都能正确判定闰年。程序(1)用综合逻辑表达式作判断条件,采用一个简单if语句即可实现,程序简洁;程序(2)按简单条件逐个判断,用if嵌套实现,程序比较长,可读性没有程序(1)好,但也是分支程序的一种设计方法。在复杂条件时不便用综合逻辑表达式的情况下,可用简单条件逐个判断的方法来设计程序。读者可按图4.6(b)表示的算法自行设计程序。
例4.7
编程实现运输公司对用户运输费用的计算。运输费用根据路程长短每吨•千米运费采取不同的折扣标准。计费标准如下(s表示路程):
s<250 无折扣
250≤s<500 2%折扣
500≤s<1000 5%折扣
1000≤s<2000 8%折扣
2000≤s<3000 10%折扣
3000≤s 15%折扣
编程思路:设每吨每千米的基本运费为p,货物重量为w,路程为s,折扣为d,总运费为f,则运费计算公式为
f = p × w × s × (1-d)
该问题属于多分支选择,应用switch语句来实现。但switch语句要求的是常量表达式,而且要能方便与case常量比较匹配,而问题中的每个条件是一个复合关系表达式。这是求解问题的关键。经分析可以发现,折扣率的变化点250、500、1000、2000、3000,都是250的倍数,因此设计一个表达式c=s/250,对计算结果取整,则可将折扣条件转换为
s<250 c<1 无折扣
250≤s<500 1≤c<2 2%折扣
500≤s<1000 2≤c<4 5%折扣
1000≤s<2000 4≤c<8 8%折扣
2000≤s<3000 8≤c<12 10%折扣
3000≤s 12≤c 15%折扣
可以将折扣率分13种情况,分别用0~12之间的整数来表示每一种情况,即情况0(无折扣),情况1(折扣率2%),情况2、3(折扣率5%),情况
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年铜仁幼儿师范高等专科学校单招职业适应性测试模拟试题及答案解析
- 医疗质量评估与绩效考核
- 2026年江西农业工程职业学院单招职业适应性测试模拟试题及答案解析
- 2026年长江职业学院单招职业适应性考试模拟试题及答案解析
- 手术室护理培训要点
- 胶质母细胞瘤护理
- 2026年教师资格证(小学-音乐)自测试题及答案
- 2025安徽马鞍山市住房公积金管理中心编外聘用人员招聘3人模拟笔试试题及答案解析
- 2026安徽阜阳市界首市征兵模拟笔试试题及答案解析
- 2025中国葛洲坝集团第一工程有限公司招聘22人备考笔试题库及答案解析
- 陕西延长石油笔试题库2025
- 华为战略管理全景从DSTE体系到执行的艺术
- 【《快递分拣六轴机械臂结构及控制系统设计》13000字(论文)】
- 宋志平三精管理课件
- 机械工程建设项目职业安全卫生设计规范
- 兵团经营地回收管理办法
- 2025年辐射安全与防护-科研生产与其他试题库
- 2024年广东第二次高中学业水平合格考物理试卷真题(含答案详解)
- 中医适宜技术课件下载
- 2025届河南省郑州市高三下学期第二次质量预测英语试题(原卷版+解析版)
- 生产车间质量管理提升计划
评论
0/150
提交评论