C语言课件:第五章选择结构_第1页
C语言课件:第五章选择结构_第2页
C语言课件:第五章选择结构_第3页
C语言课件:第五章选择结构_第4页
C语言课件:第五章选择结构_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

1、1第五章第五章 选择结构选择结构u正确使用逻辑表达式正确使用逻辑表达式u掌握用掌握用if语句实现选择结构语句实现选择结构u掌握条件运算符的使用掌握条件运算符的使用 5. 关系运算符和关系表达式关系运算符和关系表达式例如例如: x != y、 s - db+c 、b 、=、bc2、关系表达式、关系表达式l 关系符与运算分量构成关系表达式关系符与运算分量构成关系表达式l 关系表达式的结果是一个逻辑值,关系表达式的结果是一个逻辑值,根据关系是否满足,分别取真或假。根据关系是否满足,分别取真或假。结果:结果:a=2e1关系运算符关系运算符 e2C语言中没有专用的语言中没有专用的逻辑值,用数值逻辑值,用

2、数值1和和0标识逻辑真和假。标识逻辑真和假。 1-真真 0-假假 算术式算术式100=13.5c5*18=90 (int)2.5!=2.5int i=1,j=7,a;a=i+(j%4!=0);a的值?的值? 在在C C语言中,将非语言中,将非0 0就视为就视为“真真”。关系运算符关系运算符含义含义举例举例值值Less than6 91 (true)=Less than or equal to5 Greater than2 60 (false)=Greater than or equal to9 = 51 (true)=Equal to7 = 50 (false)!=Not equal to6

3、!= 51 (true)练练 习习1. 判断奇、偶数判断奇、偶数 设有变量定义设有变量定义 int z; 分析分析z%2=0 的值?的值? 如果如果z为偶数,则为偶数,则 z%2=0的值为的值为1; 否则否则z为奇数,则为奇数,则 z%2=0的值为的值为0; 因此,因此,z%2=0是断言是断言“z是偶数是偶数”的的c语言判断式。语言判断式。2. 判断判断x与与y的某位数字是否相同的某位数字是否相同判断个位数上数字相同判断个位数上数字相同 如:如:x%10=y%10判断十位数上数字相同判断十位数上数字相同 如:如:x/10%10=y/10%10用逻辑运算符将关系运算用逻辑运算符将关系运算表达式或

4、逻辑量连接起来表达式或逻辑量连接起来构成逻辑表达式构成逻辑表达式5.25.2逻辑运算逻辑运算符与逻辑表达式符与逻辑表达式运算符:运算符:& & (与与): 两边为两边为1,结果为,结果为1| (或):两边有一个为(或):两边有一个为1,结果为,结果为1! (非):非(非):非1为为0,非,非0为为1优先级:优先级:!最高,!最高,&次之,次之,|最低最低设设int a=1,b=1,x=2,y=0;(ab)&(xy);ab&xy;(y|b)&(y|a); y|b&y|a;1 1、逻辑运算符、逻辑运算符结合性:与结合性:与和和或或是左结合,是

5、左结合,非非 右结合右结合两式是等价的,因为两式是等价的,因为关系运算符高于关系运算符高于&两式结果一样,但含两式结果一样,但含义不同义不同2 2、逻辑表达式、逻辑表达式任何非零实任何非零实数均作为逻数均作为逻辑上的辑上的1 1例:例:a=5,b=7,c=4,d=3x=(a+b)(c+d)&(da)先先做算术运算,做算术运算,再做关系判断,再做关系判断,将最后结果赋给将最后结果赋给xl逻辑符与运算分量构成逻辑表达式逻辑符与运算分量构成逻辑表达式l逻辑表达式的值是逻辑表达式的值是1 1或或0,表示真或假,表示真或假e1逻辑运算符逻辑运算符 e2x的值?的值?052785278从左

6、向右运算从左向右运算(52)(52)逻辑值为逻辑值为1 1 (17)(17)逻辑值为逻辑值为0 0 (08)(08)逻辑值为逻辑值为0 0整个表达式的值为整个表达式的值为 0 0 在逻辑表达式中,并不是所有的逻辑运算在逻辑表达式中,并不是所有的逻辑运算都必须执行。都必须执行。l如果如果&的一边已经为的一边已经为0,结果一定为结果一定为 0l如果如果 | 的一边已经为的一边已经为 1 ,结果一定为结果一定为 1(1) a&b&c a非非0时再判断时再判断 b, a、b均非均非0再判断再判断c(2) a|b|c 若若a为非为非0,不必判断,不必判断 b和和 c,结果一定为,

7、结果一定为 1 已知已知 :a=1,b=2,c=3,d=4,m=1,n=1执行执行(m=ab)&(n=cd) 之后之后 m=?n=?由于由于 ab的值为的值为 0,&的结果一定为的结果一定为0,即,即 m=0(n=cd)不再运算,不再运算,n维持原有的值,即维持原有的值,即 n=1m=0n=114 & 47!(23) | ! (25)(4=7)求表达式的值:求表达式的值: 1101练习:控制条件的正确表示方法(练习:控制条件的正确表示方法( 常用如下)常用如下)v判断变量判断变量ch是否为数字字符是否为数字字符 ch=0& ch=a& ch=A&

8、 ch=a& ch=A& chy) printf( %d , x); else printf(%d,y);例例: if(xy) x=y;printf(%d%d, x,y);else printf(%d,y);表达式的类型可以是任意的数值表达式的类型可以是任意的数值类型类型(整型、实型、字符型、指针整型、实型、字符型、指针型型)如:如: if(3)printf( ok ); if(a)printf( a=%d ,a);5.35.3选择语句选择语句必须有分号必须有分号不能有分号不能有分号当当P条件为真时,执行条件为真时,执行A操作,否则执行操作,否则执行B操作操作选择结构选择结构A

9、PB真真假假 将输入的大写字母转换为小写字母将输入的大写字母转换为小写字母,否则,按原字符输出。否则,按原字符输出。 #include stdio.h main( ) char ch; scanf(%c, &ch); if (ch=A& ch=A& ch=A& ch=Z) ch=ch+32; printf(“%c”,ch); else ch=ch-32; printf(%c, ch); 讨论:以下写法可否?讨论:以下写法可否?if 语句的其他形式:语句的其他形式: 1. if (表达式表达式) 语句语句如:如: if(xy) y=x; 思考思考a取不同的值时,语

10、句的执行情况?取不同的值时,语句的执行情况?控制条件的几种形式:控制条件的几种形式: if(a=0) k=1; if(a=0) k=1; if(a!=0) k=1; if(a) k=1; if(1) k=1;提示:不要用提示:不要用=比较两个浮点数是否相等。比较两个浮点数是否相等。可使用如下方式:可使用如下方式:if(fabs(a-b)1.e-6)if(fabs(a-b)1.e-6)fabs(x)fabs(x)是库函数,表示求是库函数,表示求x x的绝对值的绝对值, ,使用该函数必须加使用该函数必须加#include math.h 例例1:#include stdio.h main() int

11、 a,b,s; scanf(%d%d,&a,&b); s=a; if(ab ) t=a;a=b;b=t; if(ac ) t=a;a=c;c=t; if(bc) t=b;b=c;c=t; printf(%d,%d,%dn,a,b,c); 运行结果:运行结果:1,2,3按数值从小到大按数值从小到大排队排队 例例3: #include stdio.h main() int a,b,c=25; a=10c; b=a=a; printf(a=%d,b=%d,a,b); if(c) printf(c=%dn,c); 运行结果:运行结果: a=0,b=1,c=25例例4:指出下列程序的输出

12、结果:指出下列程序的输出结果:#include stdio.hmain() int a; scanf(%d,&a); if (a50) printf(%d,a); if (a40) printf(%d,a); if (a30) printf(%d,a);程序运行程序运行: 输入输入58输出输出? 585858程序运行程序运行: 输入输入30输出输出? 无输出结果无输出结果20例例5: 写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。其中:用其中:用leap代表闰年的信息,代表闰年的信息,leap=1闰年,闰年,leap=0 非闰年非闰年 main( ) int year, le

13、ap; scanf(%d, &year); leap=0; if(year%4= =0 & year%100!=0)|(year%400= =0) leap=1; if(leap= =1) printf(“%d is a leap yearn”, year); else printf(%d is not a leap yearn , year); 输入:输入: 1989 结果为:结果为: 1989 is not a leap year输入:输入: 2000结果为:结果为: 2000 is a leap year21 2. if(表达式表达式1) 语句语句 1 else if (

14、表达式表达式2) 语句语句 2 else if (表达式表达式3) 语句语句 3 else if (表达式表达式m) 语句语句 m else语句语句 m+1 注意:注意:else与与if之之间要留一个空格间要留一个空格例例6:给定:给定x, 求求y。 Y=X+0.3 X100X+0.4 100 X200X+0.5 200 X300X+0.6 X 30023 X+0.3 X100X+0.4 100 X200X+0.5 200 X300X+0.6 X 300y=main()float x,y;scanf( %f ,&x);if (x100) y=x+0.3;else if (x200) y

15、=x+0.4; else if (x300) y=x+0.5; else y=x+0.6;printf( x=%f,y=%f ,x,y); 或 if( ) if( ) 语句语句 else 语句语句 内嵌if 内嵌if 或 if( ) if( ) 语句语句 else if( ) 语句语句2 else 语句语句3if( ) if( ) 语句语句 else 语句语句else if( ) 语句语句 else 语句语句 内嵌if5.3.2 if语句的嵌套语句的嵌套(在在if中嵌套或在中嵌套或在else中嵌套中嵌套)一般形式如下:一般形式如下:或 if( ) 语句语句 else if( )语句语句2 el

16、se语句语句 3 内嵌if 内嵌if例例7.阅读程序,指出运行结果(阅读程序,指出运行结果( ) main( ) int a=-2,b=-1,c=2; if(ab) if(by)x=y,y=x;elsex+;y+;printf(%d,%d,x,y);A. 有语法错误,不能通过编译有语法错误,不能通过编译B. 输入输入4和和3,则输出,则输出3和和3C. 输入输入4和和3,则输出,则输出3和和4D. 输入输入4和和3,则输出,则输出3和和5C注意:注意:y+不是不是else的的子句,因此,子句,因此,y+是是必须执行的。必须执行的。main()int x;scanf(%d,&x);if(

17、x+=5) printf(x=%dn,x);else printf(%dn,x-);printf(%d,x);练习练习3:下列程序,输出结果是:下列程序,输出结果是:如:输入如:输入3 先用先用 x(即即x=5),再执行再执行x+, 再执行再执行printf结果为:结果为:x=4 4如:输入如:输入6 结果为:结果为:7 65.3条件运算符及其运算条件运算符及其运算语言增设了一个条件操作符,它是唯一的语言增设了一个条件操作符,它是唯一的三目三目操作符。操作符。格式:格式: 表达式表达式 ?表达式:表达式?表达式:表达式功能:功能: 判断表达式的值,该值为判断表达式的值,该值为“非非”,则取表达

18、式,则取表达式2 的值,该值为的值,该值为“ 0 ”时,取表达式的值。时,取表达式的值。例如:程序段:例如:程序段:if(ab) max=a; else max=b;与:与: max=ab ? a : b等价等价 若若 a=3, b=2, 则则 max=a 说明说明: (1) 条件运条件运算符算符优优先先于赋值运算符。于赋值运算符。 (2) 条件运算符的结合方向为条件运算符的结合方向为“自右向自右向 左左”。如:如: ab ? a : cd ? c : d 相当于相当于ab ? a : (cd ? c : d ) 当当a=1,b=2,c=3,d=4 时,时, 表达式的值取表达式的值取d的值的值

19、4条件表达式条件表达式(4) 条件表达式中的表达式的类型可以与表达式和表达式的条件表达式中的表达式的类型可以与表达式和表达式的类型不同,条件表达式值的类型为二者中较高的类型。类型不同,条件表达式值的类型为二者中较高的类型。如:如: xy ? 1.2 : 6 , 当当xy成立时成立时条件表达式条件表达式的的值为值为1.2 ,否则为实,否则为实型数据型数据6.0。如:如:c=xy ? 1 : s , 当当xy成立时成立时c=1, 否则否则c= s。例:例: main( ) char ch; scanf(%c, &ch); ch= (ch= A & chb) printf( %d ,

20、a); else printf( %d ,b); printf(%d,ab ? a : b); (3)可以用条件表达式取代一般的可以用条件表达式取代一般的if结构语句。结构语句。本程序的功能是输入一个英文字本程序的功能是输入一个英文字符,判断它是否大写,如果是,符,判断它是否大写,如果是,将它转换成小写,否则不转换。将它转换成小写,否则不转换。输入:输入:A a一般可以用一对一般可以用一对if-else来描述的语句,可以用来描述的语句,可以用条件表达式来替换。条件表达式来替换。条件条件表达表达式式5.4 switch语语句句 该语句为开关语句,解决多分支的情况。该语句为开关语句,解决多分支的情

21、况。格式:格式: switch(表达式)表达式) case 常量常量表达式:表达式:语句语句序列序列 case 常量常量表达式:表达式:语句语句序列序列 case 常量表达式常量表达式n:语句序列语句序列 n default :语句序列:语句序列n+1 功能:从多条可供选择的执行流程中选择一条功能:从多条可供选择的执行流程中选择一条说明说明:(1) 表达式必须是整型或字符型。表达式必须是整型或字符型。 (2)“常量常量表达式表达式1”、“常量常量表达式表达式2”“常量常量表达表达式式n”的值必须的值必须互不相同互不相同。注意:这里注意:这里一定要留有一定要留有一个空格!一个空格!(3)case

22、后的语句序列可以是一条语句,也可后的语句序列可以是一条语句,也可以是多条语句,若是多条语句以是多条语句,若是多条语句不必用括号括起来不必用括号括起来。(4) case后的后的“常量表达式常量表达式”只起到语句标号只起到语句标号的作用,而不进行条件判断,故在执行完某个的作用,而不进行条件判断,故在执行完某个 case后的语句序列后,将自动转移到下一个后的语句序列后,将自动转移到下一个case继续执行。继续执行。其计算步骤是:其计算步骤是: 1. 计算表达式的值;计算表达式的值;2.使其顺次与常量表达式比较,若找到与表达式的值相等的使其顺次与常量表达式比较,若找到与表达式的值相等的case常量表达

23、式,执行该常量表达式,执行该case后边的语句序列,之后后边的语句序列,之后依次往依次往下执行语句块。下执行语句块。表达式语句序列1语句序列2语句序列n语句序列n+1 34 例如:根据考试成绩的等级打印出百分制分数段。例如:根据考试成绩的等级打印出百分制分数段。#include “stdio.h”main() char grade; grade=getchar(); switch( grade ) case A : printf(85100n ) ; case B : printf(7084n); case C: printf(6069n); case D :printf(60n); defa

24、ult : printf(errorn); 若输入若输入A则输出结果:则输出结果:851007084606960error遇到遇到switch的右的右花括号为止花括号为止若在执行一个若在执行一个case分支后分支后,使流程跳出使流程跳出switch结构结构,终止终止switch语句的执行语句的执行,这时要用这时要用break语句语句. switch( grade ) case A : printf(85100n) ; break; case B : printf(7084n); break; case C : printf(6069n); break; case D :printf(60n);

25、 break; default : printf(error); 输出结果:输出结果:7084当当grade的值的值为为 B B 时时36流程图为:流程图为: grade输出输出 “85100”输出输出 “60”输出输出 “60-69”输出输出 “error”输出输出 “70-84”(5) case和和default 的次序可以交换。(的次序可以交换。( case 不需要按次序不需要按次序排列,排列, default 可以在任何位置)可以在任何位置)main( ) int c=3; switch(c) case 1: c+;default: c+; case 2: c+; printf(c=%

26、dn, c);case 3: c+;讨论:若程序改动如下:讨论:若程序改动如下:c为多为多少?少?main( ) int c=3; switch(c) case 1: c+; case 3: c+;default: c+; case 2: c+; printf(c=%dn, c);c=5c=6c=4c=4此处加上此处加上break;后后c为多为多少?少?break;(6)多个)多个case可以执行同一个语句序列。可以执行同一个语句序列。switch(c=getchar( ) case y : case Y: printf(You are right.n);例例7 :判断某年某月有几天:判断某年

27、某月有几天 分析分析:2月:闰月月:闰月29天,非闰月天,非闰月28天;天; 1、3、5、7、8、10、12月月31天;天; 4、6、9、11月月30天。天。main( ) int year,month,days; scanf(%d%d,&year,&month); switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case 12:days=31; printf(%d,days);break; case 4:case 6:case 9:case 11:days =30; printf(%d,days); break;case 2: if(year%4= =0&year% 100!=0)|(year%400= =0) days=29; else days =28; printf(%d,days);break;default : printf(“month is not divided); 多个多个case可共可共用一组执行用一组执行语句语句40第五章第五章笔头作业:笔头作业:主教材:第五章全部主教材:第五章全部 阅读上机指导第五章阅读上机

温馨提示

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

评论

0/150

提交评论