1、第4章 分支结构,【内容提要】,怎样用自然语言或传统流程图描述程序的分支逻辑,以此加深对程序的灵魂算法的理解,为学习后续章节打下基础;其次,较复杂条件的C语言表述;第三,C语言实现分支程序逻辑的三种方法:条件运算符、if语句、switch语句,【学习重点】,用传统流程图描述分支程序的的处理过程;多条件时f/else的嵌套用法if与switch的混合应用。,第4章 分支结构,第四节 分支结构实现:if语句,第一节 分支程序逻辑,第二节 条件表述,第三节 分支结构实现:条件运算符,第五节 分支结构实现:switch语句,第一节 分支程序逻辑,【例4-1】从键盘输入3个数,如果这3个数能构成一个三角
2、形,则输出该三角形的形状信息(等边、等腰、任意三种情况)。,【简要分析】当实际问题中涉及的条件较多时,如何科学组织条件和表述条件是正确编制程序的关键。,请先看三个实例。,由数学知识可知,结论“a、b、c能构成三角形”包含的前提条件:,a、b、c必须同时为正数。(a0,b0,c0),a、b、c任意两数之和必须大于第三数。(a+bc,b+ca,a+cb),方法1:用自然语言描述程序逻辑。,.设置相关环境。 .定义实型变量a、b、c。(分别表示三角形三边) .输入a、b、c的值。 .a、b、c能构成三角形否?若能转,否则输出“不能构成三角形!”字样转。 .a、b、c能构成等边三角形否?若能则输出“等
3、边三角形!”字样转,否则转。 .a、b、c能构成等腰三角形否?若能则输出“等腰三角形!”字样转结束,否则输出“任意三角形!”字样转。 .结束。,第一节 分支程序逻辑,第一节 分支程序逻辑,方法2:用传统流程图描述的程序逻辑,第一节 分支程序逻辑,【例4-2】输入三个数,找出其中最大数。,方法1:用自然语言描述的程序逻辑。,第一节 分支程序逻辑,方法2:用传统流程图描述的程序逻辑,换一个角度思考:先找出x、y中较大数赋给max,然后再从max和z中找最大数赋给max,则要容易得多。 用自然语言描述该逻辑:,第一节 分支程序逻辑,【融会贯通】输入三个数,找出其中最小数。试描述算法。,【例4-3】
4、键盘输入某人身高(cm)和性别,判别其体重(kg)是否属正常范围,并输出相应信息。男性的标准体重为:身高105;女性的标准体重为:身高110。设与标准体重上、下偏差kg均属正常范围。,第一节 分支程序逻辑,【简要分析】 “性别是男是女?”、“体重是否正常?”,本题涉及的两个条件有一定的逻辑关系。因为性别决定正常体重的计算公式,所以应先判断性别再判断体重是否正常。,第一节 分支程序逻辑,方法1:用自然语言描述程序逻辑。,第一节 分支程序逻辑,方法2:用传统流程图描述程序逻辑,第一节 分支程序逻辑,课堂练习4.1,请分别用自然语言、流程图描述算法,2.笛卡尔直角坐标系由四象限、原点、四根坐标轴组成
5、。任意输入一对坐标(x,y),输出其对应点的位置信息。,.有位青年到外地旅游,汽车票单价元张,团体票(至少一次性购票20张)每张打8折。问怎样购票才最合算呢?,C语言提供了如下运算符:,关系运算符:=、!=、=、=,第二节 条件表述,逻辑运算符:|、&、!,1表述单个条件用关系运算符。,关系运算符中,=、!=(等于、不等于)优先级相同;,、=、=(大于、小于、大于等于、小于等于)优先级相同;,=、!=的优先级低于、=、=。,例如:数学式子a x b,可描述为:x = a & x = b,2表述多个条件用逻辑运算符。,第二节 条件表述,逻辑运算符|、&、!(或、与、非)的优先级依次递增。,短路规
6、则:计算机从左向右依次计算关系表达式的值,如果计算到某一个关系表达式时已能得出整个条件表达式的值,则不再计算其后边的关系表达式。,第二节 条件表述,逻辑运算符运算规则:,!运算:改变操作数的逻辑值。(真假互换),&运算:当两边均为真时,值为假,否则为假。,|运算:当两边均为假时,值为假,否则为真。,例如:设a = 1, b = 2,分析下面式子。 ( a = 1 ) | ( b = b + 5 ) | ( b = b + 3) 整个条件表达式值为1,执行后a=1,b=2。 (b = b + 5) & ( a = 0 ) & ( b = b + 3 ) 整个条件表达式值为0,执行后a=1,b=7
7、。,第二节 条件表述,3条件表达式的值,C语言不提供布尔类型,条件表达式的值用整数0或1表示, 0表示条件不成立(假),1表示条件成立(真)。,为为假,非为真,第二节 条件表述,【例4-4】 采用多种方式,描述下列条件。,通过本例请理解如何把一个复杂的条件简单化。,课堂练习4.2,三位自然数x是完全平方数,并且它是2、3、5的倍数,但不是7的倍数。试表述该条件。,2. 四位自然数各位数字中有且仅有两位数字相同。,第二节 条件表述,第三节 分支结构实现:条件运算符,条件表达式的语句形式之一:,条件成立 ? 表达式1 : 表达式2 ;,例如,两数a、b同号求和异号求差,放结果于变量c中。 a *
8、b 0 ? ( = a + b) : ( c = a b );,当条件成立时,条件表达式的值取表达式1的值,否则取表达式2的值。,条件表达式的功能:,第三节 分支结构实现:条件运算符,条件表达式的值赋给一个变量,即条件表达式语句的另一种形式:,变量名 = 条件成立 ? 表达式1 : 表达式2 ;,如前例可写成: c = a * b 0 ? ( a + b) : ( a b );,条件运算符是唯一的一个3目运算符,其优先级排名倒数第3,高于赋值运算符,低于算术运算符和关系运算符。条件运算符的的结合方向是从右向左,第三节 分支结构实现:条件运算符,【例4-5】计算分段函数的值。,参考源代码1:用条
9、件运算符实现判断。 /* 例 4-5,4-5_1.c */ #include void main() float x, y;printf(“nPlease input x: ”);scanf(“%f”, ,第三节 分支结构实现:条件运算符,课堂练习4.3,请用条件运算符实现分支结构,试写源程序,1.找出三个数中的最小数,2.求分段函数之值。,第四节 分支结构实现:if语句,if语句有两种格式,即不带else形式和带else形式。,一、不带else的if语句,if ( 条件成立 ) 语句块; ,如果if括号内的条件成立,则执行语句块,否则跳过该if语句,直接执行下一条语句。,第四节 分支结构实现
10、:if语句,提示:,这里所谓的if语句是指if(条件)及花括号内的语句块全部;,if的条件必须放于紧靠其后的圆括号内,且右圆括号外不要有分号;,当语句块只有一条语句时,花括号可省略不写;,语句块内可以含任意合法的C语句,包括if语句本身;,if语句书写格式灵活,可写于一行,也可写于多行(此时,最好保持钜齿形式)。,第四节 分支结构实现:if语句,对【例4-5】,也可用if语句构造分支。,/* 例 4-5,4-5_2.c */ #include void main() float x, y;printf(“nPlease input x: ”);scanf(“%f”, ,if语句可以改写成单行形
11、式,如:if ( x = 0 ) y = sqrt(x); /* 或 if ( x = 0) y = sqrt(x); */,第四节 分支结构实现:if语句,如果if括号内的条件成立,则执行语句块1,否则执行语句块2。,二、带else的if语句,if ( 条件成立 ) 语句块1; else 语句块2; ,第四节 分支结构实现:if语句,if/else语句可以改写成单行形式,如: if (x=0) y=sqrt(x); else y=fabs(x);,【例4-5】的另一种写法。,源代码,第四节 分支结构实现:if语句,对【例4-1】,用if/else构造分支。,源代码,【思考验证】 请用不带el
12、se的if语句写出本例代码。,提示:,当连续使用if/else格式时,else总是否定与它靠得最近的那一个尚未被否定的if条件。,第四节 分支结构实现:if语句,用if/else分支结构书写【例4-3】的程序。,源代码,【融会贯通】 键盘输入三个数,输出这三个数之间的关系(三数相同,有两个数相同,三数全不同)。试描述算法,并写代码。,第四节 分支结构实现:if语句,课堂练习4.4,请用传统流程图描述算法,if/else实现分支结构,试写源程序。,1.保险公司根据月签单金额将业务员划分为5级别。规则是: 月签单10万元以上为“金牌”保险员,月签单8万元以上为“银牌”保险员,月签单6万元以上为“铜
13、牌”保险员,月签单4万元以上为“铁牌”保险员,否则“红牌”警示。请编写程序,输入业务员月签单金额,即输出该业务员对应级别。,2.先输入三个战士的身高,然后把他们降序排列,最后输出。,第五节 分支结构实现:switch语句,switch语句的一般格式是:,switch ( 条件表达式 ) case 常量1: 语句块1; break; case 常量2: 语句块2; break; case 常量n: 语句块n; break; default: 语句块n+1; ,第五节 分支结构实现:switch语句,switch语句:将switch后条件表达式的值与case后的各常量比较,转到值相等的那个case
14、标号后的语句块执行,执行过程中一旦遇到break语句则跳出switch语句;如果无一值相等,则执行default后的语句块n+1;如果既无一值相等又没有default,则不执行switch中任何语句。,由此可见,switch语句中的条件表达式就象开关一样接通某一个匹配的case语句,故switch语句又称开关语句。,第五节 分支结构实现:switch语句,提示:,break语句的作用是终止switch语句,执行switch结构外的语句。如果没有break语句,程序将继续执行下一个case语句,直到遇到break或switch结构结束为止。条件表达式的类型应与case后常量类型(一般是int或c
15、har型)保持一致,并且各常量值应不重复。,第五节 分支结构实现:switch语句,【例4-6】 分析程序,当输入a值分别为a、 b、 c、 d时,b值等于多少。,源代码,主要看break出现的位置,遇break则跳出switch结构。 a=a时,执行、行的case语句:b=20; a=b时,执行、行的case语句:b=20; a=c时,执行行的case语句:b=20; a=d时,执行、行的case语句:b=50。,第五节 分支结构实现:switch,【例4-7】 键盘输入任意一个数字05,输出它对应的的英文单词。,源代码,本题如果用if语句实现,多达6个条件判断。使用switch/case实
16、现分支结构的关键是准确构造switch后的条件表达式。,第五节 分支结构实现:switch,【例4-8】 一年四季,按农历一般规定13月为春季,46月为夏季, 79月为秋季,1012月为冬季。编写程序,实现当输入农历月份(112)时,输出对应的季节。,设两个整型变量month、season分别表示月份和季节:,第五节 分支结构实现:switch,分支表达式为:season = ( month 1 ) / 3 + 1,用传统流程图描述的程序逻辑,源代码,第五节 分支结构实现:switch,课堂练习4.5,.某篮球专卖店篮球单价145元/个。批发规则为:一次购买10个以内不打折;一次购买20个以内打9折;一次购买40个以内打8折;一次购买50个以内打7折;一次购买超过50个(含50个)一律按65元/个计算。写程序实现当输入窗户购买篮球的个数时,立即输出其付款金额。请然语言描述算法,并用switch实现分支结构,试写源程序。,本章结束,