选择控制结构_第1页
选择控制结构_第2页
选择控制结构_第3页
选择控制结构_第4页
选择控制结构_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章选择结构程序设计

关系运算符和关系表达式逻辑运算符和逻辑表达式

if语句

switch语句程序举例§5.1关系运算符和关系表达式

关系运算是逻辑运算中比较简单的一种。所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。例如,a>3

是一个关系表达式,“大于”号是一个关系运算符,若a

的值为5,则满足给定的“a>3”条件,因此关系表达的值为“真”;若a的值为2,不满足“a>3”条件,则称关系表达式的值为“假”。§5.1.1关系运算符及其优先次序①<(小于)②<=(小于或等于)优先级别相同(高)③>(大于)④>=(大于或等于)⑤==(等于)优先级别相同(低)⑥!=(不等于)

C语言提供的6种关系运算符有关关系运算符和其它运算符的优先次序(1)前四种关系运算符的优先级别相同,后两种相同(2)关系运算符的优先级别低于算术运算符。(3)关系运算符的优先级别高于赋值运算符。算术运算符(高)关系运算符赋值运算符逗号运算符(低)§5.1.2

关系表达式

什么叫关系表达式:用关系运算符将两个表达式(可以是算术表达式或关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,就叫做关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。例如:“5==2”的值为“假”,“6>=0”的值为“真”。C语言没有逻辑型数据,以“1”代表“真”,以“0”代表“假”。例如,a=3,b=2,c=1

关系表达式“a>b”的值为“1”。关系表达式“(a>b)==c”的值为“1”。因为“a>b”的值为“1”,等于c的值,所以结果为“1”。5.2逻辑运算符和逻辑表达式

用逻辑运算符将关系表达式和逻辑量连接起来的式子就叫做逻辑表达式。在这一节中将主要介绍如下两部分:

逻辑运算符及其优先次序逻辑表达式

§5.2.1逻辑运算符及其优先次序

C语言提供了如下三种逻辑运算符:⑴&&逻辑与(相当于其他语言中的AND)⑵||逻辑或(相当于其他语言中的OR)⑶!逻辑非(相当于其他语言中的NOT)

“&&”和“||”是“双目运算符”,它要求有两个运算量(操作数)。例(a>b)&&(x>y),(a>b)||(x>y)

“!”是“单目运算符”,只有一个运算量,例如!(a>b)

a&&b

若a、b为真,则a&&b为真。

a||b

若a、b之一为真,则a||b为真。

!a

若a为真,则!a为假。

若在一个逻辑表达式中包含多个逻辑运算符时,如:!a&&b||x>&&c

按如下的优先次序:⑴(高)!→&&→||(低)⑵逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符。(a>b)&&(x>y)

可写为a>b&&x>y(a==b)||(x==y)可写为a==b||x==y(!a)||(a>b)

可写为!a||a>b!(非)(高)

算术运算符关系运算符

&&和||

赋值运算符逗号运算符(低)5.2.2逻辑表达式

如前所述,逻辑表达式的值应该是一个逻辑量“真”或“假”。C语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。即将一个非零的数值认作为“真”。具体说明如下:⑴若a=4,则!a的值为0。⑵若a=4,b=5,则a&&b的值为1。⑶a、b的值同上,a||b的值为1。⑷a、b的值同上,!a||b的值为1。⑸4&&0||2的值为1。通过上述几个例子可看出,由系统给出的逻辑运算结果不是0就是1

,不可能是其他数值。而在逻辑表达式中作为参加运算的运算对象可以是0“假”或任何非0数值。如果在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运算对象,哪些作为逻辑运算对象。

实际上,逻辑运算符两侧的运算对象不但可以是0和1,或是0和非0的整数,也可以是任何类型的数据。可以是字符型、实型或指针型等。系统最终以0和非0来判定它们属于“真”或“假”。例如:

‘c’&&’b’

该表达式的值为1。(为什么?)

在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。请看下面的解释:

a&&b&&c

只有a为真(非0)时,才需要判别b的值,只有a和b都为真的情况下才需要判别c的值。只要a为假,就不必判别b和c(此时整个表达式已确定为假)。如果a为真,b为假,不用判别c

。见右图。abc

1真0(假)非0(真)0(假)非0(真)0(假)非0(真)0(假)abc

1真非0(真)0假非0(真)0假非0(真)0假0假⑵

a||b||c

只要a为真(非0),就不必判断b和c;只有a为假,才判别b;a和b都为假才判别c。见右图所示

也就是说,对&&运算符来说,只有a≠0,才继续进行右面的运算。对运算符||来说,只有a=0,才能继续进行其右面的运算。如果有下面的逻辑表达式:当a=1,b=2,c=3,d=4,m和n的原值为1时,

(m=a>b)&&(n=c>d)

求表达式计算完毕后,n=?

由于“a>b”的值为0,因此m=0,而“n=c>d”不被执行,因此,n的值不是0而仍保持原值1。§5.3if语句

if

语句是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。§5.3.1if语句的三种形式

C语言提供了三种形式的if语句,将在下面作详细介绍。由于if语句在编程中使用的频率很高,所以要求同学们认真学习、熟练掌握。1.if(表达式)

语句例如:if(x>y){ printf(“%d”,x);}这种if语句的执行过程见右图。

假(0)

表达式真(非0)语句此语句亦称为:简单if语句2.if(表达式)语句1else语句2例如:

if(x>y){ printf(“%d”,x);}else

{ printf(“%d”,y);}

真表达式假语句1语句2

一般把这种语句称为:if~else语句见右图

3.if(表达式1)语句1

elseif(表达式2)语句2

elseif(表达式3)语句3

elseif(表达式m)语句m

else语句n表达式2

表达式1

表达式3表达式4语句1语句2语句3语句4语句5假假假假真真真真有关if语句的说明三种形式的if语句中在if后面都有“表达式”,一般为逻辑表达式或关系表达式。在执行if语句时先对表达式求解,若表达式的值为0,按“假”处理,若表达式的值为非0,按“真”处理,执行指定的语句。假如有如下if语句:

if(3)printf(“ok!”);

该语句是合法的,执行结果输出“ok!”,因为表达式的值为3,按“真”处理。由此可见,表达式的类型不限于逻辑表达式,可以是任意的数值类型。第二、第三种形式的if语句中,在每个else前有一个分号,整个语句结束处有一分号。例如:if(x>0){ printf(“%f”,x);}else{ printf(“%f”,-x);

}这是由于分号是C语言中不可缺少的部分,这个分号是if语句中的内嵌语句所要求的。如果无此分号则出现语法错误。但应注意,不要误认为上面是两个语句(if语句和else语句)。它们都属于同一个if语句。else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。各有一个分号在if和else后可只含一个内嵌的操作语句,也可有多个操作语句,若有多个操作语句时需要有花括号“{}”将几个语句括起来成为一个复合语句。例:注意花括号“}”

外面不需要再加分号。因为{}内是一个完整的复合语句,不需要另附加分号。if(a+b>c&&b+c>a&&c+a>b){ s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c));printf(“area=%6.2f”,area);}else

{ printf(“这三条边不能组成一个三角形。”);}5.3.2if语句的嵌套

在if语句中又含一个或多个if语句叫嵌套。

if()

if()语句1

else语句2

else

if()语句3else语句4内嵌if(else块)内嵌if(if块)

应当注意if和else的配对关系。else总是和它上面最近的if配对。如下写法是错误的:

编程者的原意是想把else写在与第一个if(外层if)同一列上,希望else与第一个if对应,但实际上else是和第二个if配对,因为它们俩相距最近。不能只考虑自己的主观意愿,而不顾if嵌套的规则。if()

if()语句1else

if()语句2

else

语句3主观上想作为if块主观上想作为else块

要求if的数目和else数目相同,从内层到外层一一对应,不致出错。若if和else的数目不一样,为实现程序设计者的目的,可加花括号来确定配对关系。例如:

if(){if()语句1}(内嵌if)

else语句2

这样{}就限定了内嵌if语句的范围。此时else和第一个if配对。(注:上例中包含了两种if语句的形式)。5.3.3条件运算符

若if语句中,在表达式为“真”和“假”时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理。例如:

if(a>b)max=a;elsemax=b;

这时可以用下面的条件运算符来处理:

max=(a>b)?a:b;

下面对条件运算作详细介绍。

其中“(a>b)?a:b”是一个“条件表达式”。它的执行过程是:若(a>b)条件为真,则条件表达式的值取a,否则取b。条件运算符要求有3个操作对象,称三目运算符。其表达式的一般形式为:

表达式1?表达式2:表达式3

真假表达式1条件表达式取表达式2的值条件表达式取表达式3的值说明条件运算符的执行顺序:先求解表达式1,若为非0则求解表达式2,此时表达式2的值就是整个条件表达式的值。若表达式1的值为0,则求解表达式3,表达式3的值就是整修条件表达式的值。

max=(a>b)?a:b

执行结果就是将条件表达式的值赋给max。也就是将a和b二者中大者赋给max。

条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将其值赋给max。

条件运算符的优先级别比关系运算符和算术运算符都低。因此有:

max=(a>b)?a:b

可写成max=a>b?a:b

那么当有:a>b?a:b+1

分析下面哪一个表达式和上式效果一样?

a>b?a:(b+1)

和(a>b?a:b)+1

条件运算符的结合方向“自右向左”。如果有以下条件表达式:

a>b?a:c>d?c:d

相当于:a>b?a:(c>d?c:d)若a=1,b=2,c=3,d=4,则条件表达式的值等于4条件表达式不能取代一般的if语句,只有在if语句中内嵌的语句为赋值语句(且两个分支都给同一个变量赋值)时才能代替if语句。像下面的if语句就无法用一个条件表达式代替。

if(a>b)printf(“%d”,a);elseprintf(“%d”,b);但可以用下面语句代替:

printf(“%d”,a>b?a:b);即将条件表达的值输出。

条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。如:

x?’a’:’b’

x是整型变量,若x=0,则条件表达式的值为’b’。表达式2和表达式3的类型也可以不同此时条件表达式的值的类型为二者中较高的类型。如:x>y?1:1.5

若x≤y,则条件表达式的值为1.5,若x>y,值应为1,由于1.5是实型,比整型高,因此,将1转换成实型值1.0。5.4switch语句例如,学生成绩分类:90分以上为“优”,80~89分为“良”,70~79分为“中”,60~69分为“及格”

。某同一产品,不同规格的分类。例某电视机:34吋代码为“11”,31吋代码为“12”,29吋代码为“13”,25吋代码为“14”,21吋代码为“15”,18吋代码为“16”switch语句是多分支选择语句。用来实现多分支选择结构。if语句只有两个分支可供选择,而实际工作中常常需要用到多分支的选择。

上述那些问题都可以用if语句来解决,但若分支较多,则嵌套的if语句层数多,使得程序冗长且可读性降低。C语言提供switch语句直接处理多分支选择。它的一般形式如下:

switch(表达式){

case

常量表达式1:语句1

case

常量表达式2:语句2 ┇

case

常量表达式n:语句n

default:语句n+1}例如,要求按考试成绩的等级打印出百分制分数段,可用swith语句来实现:switch(cj)

/*cj表示成绩是一个变量名*/{

case

‘A’:printf(“90~100\n”); case

‘B’:printf(“80~89\n”); case

‘C’:printf(“70~79\n”); case

‘D’:printf(“60~69\n”); case

‘E’:printf(“<60\n”); default

:printf(“inputerror!”);}有关switch语句的说明switch后面括号内的“表达式”,可以是任何类型。(2)当表达式的值与某一个case中的常量表达式的值相等时,就执行此case后的语句,若所有的case中的常量表达式都没有与表达式的值匹配的,就执行defaule后的语句。(3)每一个case的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象(对表达式的同一个值,有两种或多种执行方案)。(4)各个case和default的出现次序不影响执行结果,例如,可以先写“default:…”,再写“case‘及格’:…”(5)执行完一个case后的语句后,流程控制转移到下的个case继续执行。“case常量表达式”只是起语句标号的作用,并不是在该处进行条件判断。在执行switch语句时,根据switch后面的表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。那么,上例中或“成绩”的值等于‘B’时,程序将连续输出:

80~8970~7960~69<60

输入错误!而这不是我们想得到的结果。

因此,应该在执行一个case分支后,要使流程跳出switch结构,也就是要终止switch语句的执行。可以用一个break语句来达到此目的。应将上面的switch结构改写为:switch(cj){

case

‘A’:printf(“90~100\n”);break case

‘B’:printf(“80~89\n”);break case

‘C’:printf(“70~79\n”);break case

‘D’:printf(“60~69\n”);break case‘E’:printf(“<60\n”);break default:printf(“inputerror!”);}

最后一个分支(default)可不加break语句。经过上述的修改,当“成绩”的值为‘B’时,则只输出“80~89”。cj

输出输出输出输出输出“85~100”“70~84”“60~69”“<60~”“error”

(6)多个case语句可共用一组执行语句,如:

case‘A’

case‘B’

case‘C’

:printf(“70~100\n”);┇

“成绩”的值为‘A’、‘B’、‘

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论