选择结构

文档属性

名称 选择结构
格式 zip
文件大小 71.3KB
资源类型 教案
版本资源 通用版
科目 信息技术(信息科技)
更新时间 2010-09-16 19:31:00

图片预览

文档简介

(共44张PPT)
第3章 选择结构
本章要点:
3.1 关系运算和逻辑运算
3.2 if语句
3.3 条件运算符和条件表达式
3.4 switch语句
3.5 语句标号和goto语句
3.1 关系运算和逻辑运算
一、C语言中的逻辑值
C语言中的逻辑值有两个:“真(true)”和“假(false)”。
C语言编译系统在给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”。
二、关系运算符
关系运算实际上就是“比较运算”,将两个数进行比较,判断比较的结果是否符合指定的条件。
表3.1 C语言中的关系运算符
运算符 名称 优先次序
< 小于 优先级相同(高)
<= 小于或等于
> 大于
>= 大于或等于
==(连续两个=) 等于 优先级相同(低)
!= 不等于
关于关系运算符的说明:
(1)表3-1中前4种运算符(<、<=、>、>=)的优先级别相同,后两种也相同。前4种优先级别高于后两种。如,“>”优先级别高于“!=”。
(2)关系运算符与算术运算符、赋值运算符的优先级关系如下:
算术运算符(高)→关系运算符(中)→赋值运算符(低)
(3)关系运算符的结合方向是“自左向右”。
三、关系表达式及关系表达式的值
用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式等)连接起来的式子,称关系表达式。例如,a>=b,a>= =c等。
在C语言中,关系表达式的结果值为1或0。当关系表达式成立时,其结果值为1,否则,其值为0。若a=10,b=6,表达式a>=b为“真“,其值为1。
当关系运算符两边的值类型不一致时,系统将自动进行转换。转换规则与双目运算中的类型转换规则相同。
关系运算示例:试求x=5>3>1的值。
分析:x=5>3>1相当于:
 x=(5>3)>1
 =1>1
 =0 故x的值为0。
关系表达式主要用于选择结构中的条件判断。
※重点提示:表示“等于”关系的运算符“= =”和“不等于”关系的运算符“!=”与数学中的表示方法不同。在使用它们时请予以注意,以免写错关系运算符而导致错误的结果。
例如,欲判断x是否等于0,如果写成:x=0就不是判断x是否等于0的含义了,而成了把0赋值给变量x。正确的写法应为:x= =0。
四、逻辑运算符和逻辑表达式
1.C语言中的逻辑运算符
关系表达式只适于描述单一的条件,对于较复杂的复合条件就需要将若干个关系表达式连接起来才能描述。
例如,描述“x大于0且不等于2”,就需要将两个关系表达式x>0和x!=2连接起来:x>0&&x!=2。其中“&&”是C语言中的逻辑运算符。
C语言提供了三种逻辑运算符,如表3.2所示。
表3.2 C语言中的逻辑运算符
运算符 名称 示例 示例说明 说明 优先次序
! 逻辑非 !a a非 单目运算符 高

&& 逻辑与 a&&b a与b 双目运算符
|| 逻辑或 a||b a或b 双目运算符
关于逻辑运算符的说明:
(1)逻辑运算符的优先次序如下:
!(高)→&&(中)→||(低)
(2)逻辑运算符具有自左向右的结合性
(3)逻辑运算符与赋值运算符、关系运算符、算术运算符的优先次序如下:
!(逻辑非)→算术运算→关系运算→&&(逻辑与)→||(逻辑或)→赋值运算
例如:
a>=b) && (x>y) 可以写为:a>=b&&x>y
(a= =b)||(x= =y) 可以写为:a= =b||x= =y
(!a)||(a>=b) 可以写为:!a||a>=b
五、逻辑表达式和逻辑表达式的值
用逻辑运算符将关系表达式或逻辑值连接起来的式子称逻辑表达式。
一个逻辑表达式中可以包含多个逻辑运算符,如x>y&&a<=b-!c
参与逻辑运算的量为非零值或整数零,非零值和整数零分别表示运算量为“真”或“假”。
逻辑运算的结果值,即逻辑表达式的值应该是一个逻辑值“真”或“假”,即为“1”或“0”。
表3.3为逻辑运算的运算规则表。用它表示当a和b的值为不同组合时,各种逻辑运算所得到的值。
a b !a !b a && b a || b
非0 非0 0 0 1 1
非0 0 0 1 0 1
0 非0 1 0 0 1
0 0 1 1 0 0
以下是关于逻辑运算的几点说明:
(1)参与逻辑运算的量不但可以是0和1,或者是0和非零的整数,也可以是任何类型的数据。
如字符型、实型或指针型等。但最终以0和非0来判定它们属于“真”或“假”。
(2)在逻辑表达式求解中,并不是所有逻辑运算符都需要执行,有时只需执行一部分运算符就可得出逻辑表达式的最后结果。
例如x&&y&&z,只有x为真时才需要判断y的真假,若x为假,则立即得出整个表达式为假。
(3)在处理一个复杂表达式时,对于表达式中不同位置上出现的数值,应区分哪些是作为数值运算或关系运算的对象,哪些作为逻辑运算的对象。
例如求下列表达式的值:
  8>=5&&2||6<5-!0
 计算步骤如下:
  ① 表达式自左至右扫描求解。因为关系符优先于&&,所以首先处理8>=5,在关系运算符>=两侧的8和5作为数值参加关系运算,8>=5的值为1。
  ② 再进行1&&2||6<5-!0运算。自左至右扫描求解,&&两侧的1和2作为逻辑运算对象,因为参加运算的皆为非0,故结果为1。
  ③ 接下来进行1||6<5-!0运算。6的左侧为||运算符,右侧为<运算符,根据优先级别,应先进行<的运算。即先进行6<5-!0运算。现在5的左侧为<运算符,右侧为-运算符,而-优先于<,因此,应先进行5-!0的运算。又由于!的优先级别最高,故先进行!0的运算,得结果1。
④ 然后进行5-1运算。得结果为4。
⑤ 下面再进行6<4运算。得结果为0。
⑥ 最后进行1||0运算。得到1。
故表达式的值为1。
※重点提示:若“&&”的左边的运算对象的值为0,则不再对右边的运算对象进行运算,直接得出整个表达式的值为0;若“||”的左边的运算对象为1,则不再对右边的运算对象进行运算,直接得出整个表达式的值为1。
第二节 if语句
一、if语句结构
if语句是选择结构的一种形式,又称为条件分支语句。
它的流程控制方式是:根据给定的条件进行判定,由判定的结果(真或假)决定执行给出的两种操作之一。
C语言中提供了三种形式的if语句:不含else的if语句、if~else语句和if~else~if语句。
(1)语句形式如下:
if(表达式) 语句
圆括号中的表达式一般是关系表达式或逻辑表达式,用于描述选择结构的条件。
但也可以是其他任意的数值类型表达式,包括整型、实型、字符型等。如果在if子句中需要多个语句,则应该使用大括号“{}”把一组语句组成复合语句。
(2)执行过程
 首先计算if后面圆括号中的表达式的值,若为非0值,则执行语句1,然后脱离本选择结构,继续执行if语句的下一个语句;否则不执行语句1,直接转去执行if语句的下一个语句。
图3-1 if语句程序流程图
2.if-else语句
(1)语法形式如下:
if(表达式) 语句1;
else 语句2;
语句1称为if子句,语句2称为else子句,这些子句只允许是一条语句,若需要多条语句时,则应该使用“{}”将这些语句括起来组成复合语句。
另外要注意,else不是一条独立的语句,它只是if语句的一部分,因此在程序中else必须与if配对。
图3.2 if-else语句执行过程
(2)执行过程
首先计算圆括号内的表达式值,若为非0值,则执行语句1,然后脱离本选择结构,继续执行if语句的下一个语句;否则执行语句2,然后脱离本选择结构,继续执行if语句的下一个语句 。
3.if-else-if语句
(1)语法形式如下:
if(表达式1) 语句1;
else if(表达式2) 语句2;
else if(表达式3) 语句3;
 ……
else if(表达式n-1) 语句n-1;
else 语句n;
(2)执行过程
  若表达式1为真,执行语句1,否则进行下一步判断;若表达式2为真,执行语句2,否则进行下一步判断;……;最后所有表达式都为假时,执行语句n。if-else-if语句的执行过程如图3-3所示。
※重点提示:使用if~else~if语句时,请注意各个分支结构的条件一定要按照某种顺序书写。这样做不仅使程序条理清晰,而且能使条件书写简捷,不易出错。
四、嵌套的if语句
 在if语句中又包含一个或多个if语句称为if语句的嵌套。
以下是C语言中if~else语句的二重嵌套的三种形式。
(1)在if子句中嵌套具有else子句的if语句,如图3.4(a)所示
(2)在if子句中嵌套不含else子句的if语句,如图3.4(b)所示
(3)在else子句中嵌套if语句,如图3.4(c)所示。
图3.4 嵌套的if语句结构
如果把嵌套写成如下形式:
 if(表达式1)
  if(表达式2)
    语句1;
 else
  语句2;
程序设计者把else与第一个if书写在同一列,试图以此表示它们的匹配的。但是,根据if和else配对规则,else却是与第二个if配对(离它最近)。
C语言不是以书写格式来分隔语句的,而是由逻辑关系决定的。
当if和else的数目不等时,为了保险起见,也可以用一对大括号括起来确定配对关系。
可作如下处理:
if(表达式1)
  {
if(表达式2)
   语句1;
}
else
  语句2;
例如:从键盘输入两个整数,试比较它们的大小。
main()
{ int a,b;
printf("Please enter two integers:\n");
scanf("%d,%d",&a,&b);
if(a!=b)
if(a>b)
printf("%d>%d\n",a,b);
else
printf("%d<%d\n",a,b);
else
printf("%d= =%d\n",a,b);
}
 程序运行结果为:
 Please enter two integers:
 3,57<回车>
 3<57
 Please enter two integers:
 9,-6<回车>
 9>-6
 Please enter two integers:
 456,456<回车>
 456= =456
 ※重点提示:在嵌套内的if语句既可以是if语句形式也可以是if~else语句形式,这就会出现多个if和多个else重叠的情况。此时要特别注意if和else的配对问题。if和else配对规则为:else总是与它前一个最近的if配对。
第三节 条件运算符和条件表达式
对于有些选择分支结构,C语言另外还提供了一个特殊的运算符——条件运算符。
由此构成的表达式也可以形成简单的选择结构,这种选择结构能以表达式的形式内嵌在允许出现表达式的地方,使得可以根据不同的条件使用不同的数据参与运算。
1.条件运算符
 条件运算符由两个符号“ ”和“:”组成,要求有3个操作对象,称三目(元)运算符,它是C语言中唯一的三目运算符。
2.条件表达式
 条件表达式的一般形式为:
 表达式1?表达式2:表达式3
以下是几点说明:
(1)通过情况下,表达式1是关系表达式或逻辑表达式,用于描述条件表达式中的条件,表达式2和表达式3可以是常量、变量或表达式。
(2)条件表达式的执行顺序为:先求解表达式1,若值为非0,表示条件为真,则求解表达式2,此时表达式2的值就作为整个条件表达式的值;若表达式1的值为0,表示条件为假,则求解表达式3,表达式3的值就是整个条件表达式的值。
(3)在程序中,通过把条件表达式的值直接赋予某个变量。例如:
 min=(a 执行结果就是将条件表达式的值赋予变量min,即将a和b二者中较小的赋给min。
(4)条件表达式的优先级别仅高于赋值运算符,而低于前面介绍过的所有运算符。
(5)条件运算符的结合方向为“自右至左”。
(6)条件表达式允许嵌套,即允许条件表达式中的表达式2和表达式3又是一个条件表达式。例如:x>0 1:x<0 -1:0
  上述条件表达式中,表达式3部分又是一个条件表达式。根据条件表达式的结合性,上述条件表达式等价于:x>0 1:(x<0 -1:0)。
 其作用是判断x的符号情况。当x为正数时,该条件表达式的值为1;当x为负数时,该条件表达式的值为-1;当x为0时,该条件表达式的值为0。
(7)条件表达式不能取代一般的if语句,仅当if语句中内嵌的语句为赋值语句(且两个分支都给同一变量赋值)时才能代替if语句。
(8)表达式1、表达式2、表达式3的类型可以不同。此时条件表达式的值的类型为它们中较高的类型。
※重点提示:条件表达式的执行顺序为:先求解表达式1,若值为非0,则此时表达式2的值就作为整个条件表达式的值;反之,则表达式3的值就是整个条件表达式的值。
第四节 switch语句
if语句处理两个分支,处理多个分支时需使用if~else~if结构,但如果分支较多,则嵌套的if语句层数就越多,程序不但冗长而且理解也比较困难。
C语言又提供了一种专门用于处理多分支结构的条件选择语句,称为switch语句,又称开关语句。
使用switch语句直接处理多个分支。
一般形式为:
 switch(表达式)
{ case 常量表达式1:
 语句1;  break;
 case 常量表达式2:
 语句2;  break;
 ……
 case 常量表达式n:
 语句n;  break;
  default:
 语句n+1;
    break;}
说明:
(1)switch、case、break、default均为C语言的保留字。
(2)swich的表达式通常是一个整型或字符型变量,也允许是枚举型变量,其结果为相应的整数、字符或枚举常量。
(3)常量表达式又称为开关常数,必须是与表达式对应一致的整数、字符或枚举常量。
(4)语句1至语句n,可以是简单语句,也可以是复合语句。
(5)在关键字case和常量表达式之间一定要有空格。
 ※重点提示:在switch语句中,default以及break是可以有也可以没有的,且case语句标号后的语句也可以省略不写。
图3.6 switch语句的执行过程
例如,下面的switch语句可以根据键入考试成绩的等级(grade)输出百分制分数段:
键入'A',输出85~100
键入'B',输出70~84
键入其他任意字符,输出error
switch (grade)
{ case'A':
printf("85~100\n");
break;
case'B':
printf("70~84\n");
break;
default:
printf("error\n");}
 注意:
(1)在switch~case语句中,各个case常量表达式不一定要按其值的大小顺序来书写语句,但要求各个case后的常量表达式必须是不同的值,以保证分支选择的唯一性。例如:
switch (ch)
 {case'A':
语句1; break;
case'B':
语句2; break;
case'A':
语句2;  break;
default: 语句3;
}
该例中前2个case语句都是合法的,当变量ch取'A'、'B'时,分别执行语句1、2,但最后一条case语句与第一条case语句的常量表达式的值相同,这是不允许的。
(2)如果在case后面包含多条执行语句时,也不需要加大括号,进入某个case后,会自动顺序执行本case后面的所有执行语句。
(3)default总是放在最后,这时,default后不需要break语句。
(4)default部分也不是必须的,如果没有这一部分,当switch后面圆括号中表达式的值与所有case后面的常量表达式的值都不相等时,则不执行任何一个分支直接退出switch语句。此时,switch语句相当于一个空语句。
(4)在switch~case语句中,多个case可以共用一条执行语句,例如:
case 'A':
case 'B':
printf(">60\n");
break;
在A、B两种情况下,均执行相同的语句,即输出“>60”。
(5)在switch语句中,只有最后一个分支(default)中的break语句的存在于否不影响执行结果。因为没有这个break语句,执行该分支的所有语句后也会自动退出switch语句。而其余各分支中的break语句有与无时的流程是完全不同的。
第五节 goto语句
一、 语句标号
在C语言中,语句标号不必特殊加以定义,标号可以是任意合法的标识符,当在标识符后面加一个冒号,该标识符就成为一个语句标号。
注意,C语言中,语句标号必须是标识符,而不能是数值常量形式,标号可以和变量同名。
通常,标号用作goto语句的转向目标。
如:goto state;
 C语言中,可以在任何语句前加上语句标号,如:
 state: printf(“end\n”);
二、 goto语句
 goto语句称为无条件转向语句,goto语句的一般形式为:
  goto 语句标号;
  goto语句的作用是把程序的执行转向语句标号所在的位置,这个语句标号必须与此goto语句同在一个函数内。
 ※重点提示:滥用goto语句将使得程序的流程毫无规律,可读性差,对于初学者来说应尽量不采用。
同课章节目录