第4章 选择结构 问题的提 出:求一元二次方程的根 ax2+bx+c=0(a≠0) 当△>=0时,为实根 当△<0时,为 虚根考虑两个问题:在C语言中如何表示判断条件? 答案:用任意合法的表达式,一般用关系表达式和逻辑表达式。怎么实现分支结构? 答案:用if语句和switch语句。第4章 选择结构 4.1 关系运算 4.2 逻辑运算 4.3 if语句 4. 4 switch语句 本章小结 巩固练习 本章要点“关系运算”就是“比较运算”。关系运算的结果如果符合或满足给定的条件,则结 果为逻辑值“真”;如果不符合或不满足给定的条件,则结果为逻辑值“假”。例如,x>0 4.1 关系运算 4.1.1 关系运 算符 例如:c>a+b a==bc 关系运算符的优先级低于算术运算符,高于赋值运算符。 4.1.2 关系表 达式 格式: 表达式 关系运算符 表达式其中的〈表达式〉可以是任意合法的表达式,但其类型应相同. 如:a>=b (a=3)>(b=4) a>c==c 关系表达式的值为逻辑值0(假)1(真)【例 4.1】关系运算符示例。 ① 应避免对实数作相等或不等的判断。② 注意从写法和含义上区分赋值运算符“=”与相等关系运算符“==” 。③ 对于形如“10<=x<=20” 的关系表达式,从语法上来说C语言是允许的,但是在程序设计时它并不能正确地表示用户的意图。 应 写为:x>=10 && x<=20 注 意 4.2 逻辑运算 双目:逻辑与 (&&) ; 逻辑 或 (||) 单目:逻辑非 (!)优先级(由高到低): !,算术,关系,&&,||,赋值结合性:从左 到右逻辑运算真值表4.2.1 逻辑运算符C编译系统以“1”代表“真”,“0 ”代表“假”。 判断一个量为“真”还是“假”时,以 数值“0”代表“假”,以“非0”的数值作为“真”。 如:5&&2 !5||0 逻辑真值表4.2.2 逻辑运算的值 格式: 表达式 逻辑运算符 表达式 例如: x>10 && x<20 4&&0||(a=2) ‘c’ &&’d’ 逻辑表达式的值只能是0或1。参与逻辑运算的运算对象可以是任意类型的表达式。当参与运算的表达式是逻辑表达式时 ,形成逻辑表达式的嵌套情形。例如:a&&b&&c 4.2.3 逻辑表达式 【例4.2】逻辑运算示例(1)C语言中没有逻辑型数据类 型。(2)整型、字符型、 逻辑型通用。(3)在求逻辑表达式的值时,右边部分是根据左边部分的值有条件地执行。例如逻辑表达式: a&&b 在求其值时有以下几种情况:当a为真时,才判别b的值;当a为假时,整个表达式已经确定为假,不必判别b。说 明 :举例:已知定义语句:int a=1,b=2,c=3,d=4,m=1,n=1;则表达式(m=a>b)&&(n=c>d)的值和m,n 的值分别是什么? a||b 的情形类似(3)表达式中含有++、--时,注意表达式的值和变量的值的不同 如:a++ && b++ (若a=0,b=1) a++ || b++ (若a=1,b=1或a=0,b=1)练习:判 断某一年是否闰年。(闰年的条件是符合下面两个条件之一):(1)能被4整除,但不能被100整除;(2)能被400整除。( ) ( )( ) ( )(4)表示数学中的0 明:4.3 if语句 其中:if是关键字标识符;表达式可以是任何类型的表达式,两侧的括号不能省略;if的内嵌语句也叫if子句,是 逻辑上的一条语句,所以,应为单条语句或复合语句 语义:4.3.1 if语句的三种形式 1. 基本if语句(单分支结构) 格式: i f(表达式) 语句 if (x>0) printf("%f\n",sqrt(x)); 【例4.3】输入两个整数,输出其中的大数。 思考: 如何求3个整数中的最大数或最小数?#include “stdio.h”main(){ int a,b, max; printf("\n input two numbers: "); scanf("%d,%d",&a,&b); max= a; if (max else 语句2 语义:2. if-else 语句两路分支【例4.3】输入两个整数,输出其中的大数。 3. i f-else if-else语句格式: if(表达式1) 语句1; else if(表达式2) 语句2; else if (表达式3) 语句3; … else if(表达式n-1) 语句n-1; else 语句n; 多分支【例4.6】 已知学生的百分制成绩,编写程序按百分制分数进行分段评定,给出相应的等级。 分数大于等于90,则评定为”A”; 分数在80~89 之间,则评定为”B”; 分数在70~79之间,则评定为”C”; 分数在60~69之间,则评定为”D”; 分数小于60,则评定 为”E”;在if语句的三种形式中,表示判断条件的表达式:必须用括号括起来可以是任意表达式、变量、常量一般是关系表达式或逻辑表达式4 .在使用if语句时应注意的问题例如: if (a=b) printf("%d",a); else p rintf("a=0"); 4.3.2 if语句的嵌套 嵌套结构的一般形式可表示如下: if(表达式1) if( 表达式2 ) 语句1 else 语句2 else if(表达式3) 语句3 else 语句4注意:if与e1se的配对关系。从最内层开始,e 1se总是与它上面最近的(未曾配对的)if 配对。【例4.7】用if语句的嵌套形式完成下列分段函数的计算:思考:使用if-else if-else语句改写该程序。练习1.以下程序执行后输出结果是( )。 main() { int i=1, j=1,k=2; if((j++||k++)&&i++) printf("%d,%d,%d\n",i,j,k); } A.1,1,2 B.2,2,1 C.2,2,2 D.2,2,3 C.2,2,2练习2.下列各语句序列中,能够将变量u、s中的较大值赋值到变量t中的是( )。A. if(u>s)t=u ; t=s; B. t=s ; if(u>s)t=u; C. if(u>s)t=s ; else t=u; D. t=u ; if(u>s)t=s; B. t=s ; if(u>s)t=u; 练习3.以下程序执行后输出结果是( )。#include “stdio.h” main() {int a=5,b=4,c=3,d=2; if(a>b>c) printf("%d\n",d); else if ((c-1>=d)==1) printf("%d\n",d+1); else printf(" %d\n",d+2); } A.2 B.3 C.4 D.编译时有错,无结果 B.3练习4.下 列程序段执行后,变量k、x、y、z值依次为 ( )。 int k,x,y,z; x=y=z=1; k=x++&&y+ +||z++; A. 1、2、2、1 B. 1、2、2、2 C. 0、2、2、1 D. 0、2、2、2 A. 1、2、2、14.3.3 条件运算符和条件表达式 条件运算符:三目运算符(? :)结合性:从右到左优先级:高于赋值运算 符,低于逻辑、算术和关系运算符。条件表达式格式: 表达式1? 表达式2 :表达式3求值规则: 先求表达式1的值,非 0时,条件表达式的值为表达式2的值,否则为表达式3的值 如:x>y ? 1:1.5 例 :求两数中较大者max=a>b ? a:b(1)以下程序的输出结果是______。#include "stdio.h"main() {int a=5,b=4,c=6,d;printf("%d\n",d=a>c?(a>c?a:c):(b));}A)5 B)4 C) 6 D)不确定练习B)4与y=(x>0?1:x<0?-1:0);的功能相同的if语句是( )A) if (x>0) y=1; B) if(x) else if(x<0) y=-1; if(x> 0) y=1; else y=0; else if(x<0)y=-1; else y=0; C) y= -1; D) y=0; if(x) if(x>=0) if(x>0) y=1; if(x>0)y=1 ; else if(x= =0) y=0; else y=-1; else y=- 1;练习A)一般形式为:switch(表达式){ case 常量表达式1: 语句1; case 常量表达式2: 语句2; … case 常量表达式n: 语句n; default : 语句n+1; } 4.4 switch语句 (多分支选 择语句/开关语句 )说明: 1.表达式可是整型、字符型表达式。 2.case和常量表达式间一定要有空格,case后的语句可以没 有,也可以有多个(可以不用“{ }”括起来 )。 3.每个case的常量表达式的值必须互不相同。 4.default子句的位置 随意。功能: 先计算表达式的值,若该值与case后某一常量表达式的值相等,则执行此case后的所有语句,直至switch语句体 结束。 若不等,则执行default后的语句。4.4 switch语句 (多分支选择语句/开关语句 )一般形式为: switch(表达式){ case 常量表达式1: 语句1; case 常量表达式2: 语句2; … case 常量表达式 n: 语句n; default : 语句n+1; } switch ( cj/10){ case 9: printf (" A \n"); case 8 : printf ("B \n"); case 7 : printf ("C\n"); case 6 : printf ("D\n"); default : printf("E\n");}若cj=85,则将输出:BCDE 如: switch ( cj/10) { case 10: case 9: printf (“A \n”); break; case 8 : printf (“B \n”); break ; case 7 : printf (“C\n”); break; case 6 : p rintf (“D\n”); break; default : printf(“E\n”); }关于break语句1.break语句又称间断语句。2.可以用在case语句之后,跳出switch语句体。若cj=85,则将输出 :B【例4.8】编写程序,输入1~10之间的任意一个数字,输出相应的英文单词。 【例4.11】若x为实型量,计算分段函数: 巩固练 习1、若变量c为char类型,能正确判断出c为小写字母的表达式是_______。 A)''a''<=c<=''z'' B)(c >=''a'')‖(c<=''z'') C)(''a''<=C)and(''z''>=C) D)(c>=''a'')&&(c<=''z'')D)(c> =''a'')&&(c<=''z'')巩固练习2、设有如下程序段: int x=6, y=4; printf("%d\n",( x%y,x&&y));则以下叙述中正确的是__________。 A)输出语句中格式说明符的个数少于输出项的个数,不能正确输 出 B)运行时产生出错信息 C)输出值为2 D)输出值为1D)输出值为1巩固练习3、以下程序运行后的输出结果是 _________#include “stdio.h”main() { int i=1, j=2,k=3; if(i++== j&&k--==j) printf("%d,%d,%d",i++,j,k); else printf("%d,%d,%d",+ +i,++j,k--);}A)l,2,3 B)2,2,3 C)2,3,2 D)3, 3,3D)3, 3,3巩固练 习4、以下程序运行后的输出结果是_________。#include "stdio.h"main(){ int a=16,b=2 1,m=0; switch(a%3) { case 0: m++; break; case 1: m++; switch(b%2) { default: m++; case 0: m++; break; } } p rintf("%d\n",m);}A)1 B)2 C)3 D)4C)3巩固练习5、若从键盘输入58,则以下程序的输出结 果是( )。#include “stdio.h”main(){ int a; scanf("%d",& a); if(a>50)printf("%d",a); if(a>40)printf("%d",a); if(a>30)pr intf("%d",a);}585858巩固练习6、以下程序运行后的输出结果是( )。#include ”stdio.h”main(){ int x=10,y=20,t=O; if(x==y)t=x;x=y;y=t; printf("%d,%d\n",x,y);}20,0本章小结逻辑运算的值为逻辑型数据“真”和“假”。C编译系统在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”;判断一个量为“真”还是“假”时,以数值“0”代表“假”,以“非0”的数值作为“真”关系运算和逻辑运算关系表达式和逻辑表达式的值只能是0或1。 条件运算符:条件表达式经常用与替代if-else语句,实现给同一个变量赋值的目的。这样不但使程序简洁,也提高了运行效率。选择结构的实现 (1) 基本if语句主要用于单向选择。 (2) if-else语句主要用于双向选择。 (3) if-else if-else语句、嵌套的if语句和switch语句用于多向选择。本章小结 |
|