《C语言程序设计教程(第2版)课件第5章.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计教程(第2版)课件第5章.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第5 5章章 选择结构选择结构本章要点本章要点关系运算符与关系表达式关系运算符与关系表达式逻辑运算符与逻辑表达式逻辑运算符与逻辑表达式条件运算符与条件表达式条件运算符与条件表达式ifif语句语句switchswitch语句语句本章难点本章难点ifif语句的嵌套语句的嵌套switchswitch语句的使用语句的使用 5.1 关系运算符和关系表达式 6 种关系运算符种关系运算符:(小于)(小于)(小于或等于)(小于或等于)(大于)(大于)(大于或等于)(大于或等于)(等于)(等于)!(不等于)(不等于)5.1.1 关系运算符关系运算符优先级相同(高)优先级相同(低)结合性结合性:自左向右:自左向
2、右 关系运算符的优先次序关系运算符的优先次序 与其它运算符优先级的比较与其它运算符优先级的比较:算术运算符算术运算符关系运算符关系运算符赋值运算符赋值运算符(高)(高)(低)(低)例如:c=da+b等效于:c=(d(a+b)1.什么是关系表达式?什么是关系表达式?5.1.2 关系表达式关系表达式如:(ab)(bc)、ay、s+fd2.关系表达式的值关系表达式的值运算结果运算结果 逻辑值逻辑值 1“真真”,0“假假”如:如:设设 a=3,b=2,c=1 求下面关系表达式求下面关系表达式 的值:的值:cb (a-b)=1 b+ca值为值为值为值为值为值为如果关系运算对象的类型不同,也要先进行类型转
3、换如果关系运算对象的类型不同,也要先进行类型转换。关系表达式的应用。关系表达式的应用。main()char c=k;int i=4,j=2,k=5;float x=3e+5,y=7.56;printf(“%d,%dn”,a+3=k+1);printf(“%d,%dn”,i+j=-3*j,k=j=i+7);printf(“%d,%dn”,xa+b&ab等效于:c=(d(a+b)&(ab)1.什么是逻辑表达式?什么是逻辑表达式?5.2.2 逻辑表达式逻辑表达式用逻辑运算符将逻辑运算对象连结起来的式子用逻辑运算符将逻辑运算对象连结起来的式子。如:(ab)&(bb 2.逻辑表达式的值逻辑表达式的值运算
4、结果运算结果 逻辑值逻辑值(只有假为只有假为0、真为、真为1两种取值两种取值)如:如:53&2|84 b&d值为值为 1值为值为运算对象运算对象 以以数值非数值非0为真、为真、0为假为假注意事项:注意事项:(1)代数式不等式代数式不等式0 x0)&(x5),而不能直接写成而不能直接写成0 x y)z=x;2.双分子语句双分子语句if(表达式表达式)语句语句1 else 语句语句2 执行过程:当表达式的值为“真”(非零)时,执行语句1,否则,执行语句2。如如:if(xy)z=x;else z=y;3.多分子语句多分子语句if(表达式表达式1)语句语句1 else if(表达式表达式2)语句语句2
5、 else if(表达式表达式3)语句语句3 :else if(表达式表达式m)语句语句m else 语句语句n如:if (grade=85)level=A;else if(grade=70)level=B;else if(grade=60)level=C;else level=D;if 语句说明:语句说明:if后面的表达式一般为逻辑表达式或关系表后面的表达式一般为逻辑表达式或关系表 达式,也可以是任意数值类型表达式。达式,也可以是任意数值类型表达式。该语句是合法的:if(3)printf(“ok!”);if 语句中的语句中的“语句语句”为一个简单语句或复合语句。为一个简单语句或复合语句。如:
6、下面程序段是否有错?if (x=0)printf(“X is positive.”);x+;else printf(“X is negative.”);if (x=0)printf(“X is positive.”);x+;else printf(“X is negative.”);4.if 语句的嵌套语句的嵌套 在 if 语句中又包含一个或多个if 语句称为 if 语句的嵌套语句的嵌套。一般形式:if(条件1)if(条件2)语句1 else 语句2else if(条件3)语句3 else 语句4内嵌if内嵌if如:if(x0)if(y0)printf(x0,y0);else printf(“
7、x0,y0)printf(“x0);else printf(“x=0,y6)if(n12)printf(“6n12”);else printf(“n6)if(n12)printf(“6n12”);else printf(“n=6”);缩缩 排排#inclde main()int x;scanf(“%d”,&x);if(x0)printf(“X is positive.”);x=x+1;else printf(“X is negative.”);缩进缩进缩进用用if 语句实现选择结构举例语句实现选择结构举例 -1;x0 main()int x,y;scanf(%d,&x);if(x0)y=-1;
8、else if(x=0)y=0;else y=1;printf(x=%d y=%d,x,y);例例:托运行李计费。用托运行李计费。用f代表收费,代表收费,w代表重量,并将它们定义代表重量,并将它们定义成实型数。则有关系成实型数。则有关系:w*0.205 (0=w=50)f=w*0.313 (50w200)main()float f,m;printf(“input weight:”);scanf(“%f”,&w);if(w200)f=(w-120)*0.413+10*0.23;else if(w50)f=w*0.313;else f=w*0.205;printf(“w=%f,f=%fn,w,f)
9、;5.3.2 条件运算符条件运算符1.条件运算符与条件表达式条件运算符与条件表达式条件表达式的一般形式条件表达式的一般形式:表达式1?表达式2表达式3如:如:max=(ab)?a:b;若若 a=3,b=2,则则 max=?如:(ab)?a:b 目的目的简化 if 语句。if(ab)max=a;else max=b;等效于:条件运算符的优先级:条件运算符的优先级:算数运算符算数运算符=关系运算符关系运算符=逻辑运算符逻辑运算符(除!除!)赋值运算符赋值运算符c&cd?a+b:d 等效于等效于:x=(a+b)c)&(cd)?(a+b):d)条件运算符的结合方向条件运算符的结合方向:自右至左自右至左
10、 如:如:ab?a:cd?c:d等效于:等效于:ab?a:(cd?c:d)2.条件表达式与条件表达式与if语句的比较语句的比较 当当if语句中嵌套的语句是赋值语句,而且语句中嵌套的语句是赋值语句,而且两个分支都给同一个变量赋值时,条件表达式两个分支都给同一个变量赋值时,条件表达式能替代能替代if 语句语句。如下面的写法是错误的:如下面的写法是错误的:a0?printf(“abs(a)=%dn”,a):printf(“abs(a)=%dn”,(-1)*a);此语句的本意是:此语句的本意是:if(a0)printf(“abs(a)=%dn”,a);elseprintf(“abs(a)=%dn”,(
11、-1)*a);可以改写为:可以改写为:printf(“abs(a)=%dn”,a0?a:(-1)*a);例:把输入字符中的小写字符转换成大写并输出例:把输入字符中的小写字符转换成大写并输出。#include main()char ch;scanf(%c,&ch);ch=(ch=a&chb)?a:b;max=(tc)?t:c;printf(max=%dn,max);5.3.3 switch 5.3.3 switch 语句语句一般形式:一般形式:switch(表达式)表达式)case 常量表达式常量表达式1:语句序列:语句序列1 case 常量表达式常量表达式2:语句序列:语句序列2 break;
12、:case 常量表达式常量表达式n:语句序列语句序列n break;default:语句序列语句序列n+1 此处break用于退出switch语句break;执行过程:执行过程:例如:例如:switch(grade)case A:printf(“85100 ”);case B:printf(“7084 ”);case C:printf(“6069 ”);case D:printf(“60 ”);default:printf(“error”);若若grade=A,输出结果是什么?输出结果是什么?85100 7084 6069 60 error 用用break语句处理后的程序段:语句处理后的程序段
13、:switch(grade)case A:printf(“85100”);break;case B :printf(“7084”);break;case C :printf(“6069”);break;case D:printf(“60”);break;default:printf(“error”);若若gread=A,输出结果又是什么?输出结果又是什么?85100完整程序完整程序:main()char grade;printf(“Input grade(A,B,C,D):”);scanf(“%c”,&grade);switch(grade)caseA:printf(“85100”);brea
14、k;case B:printf(“7084”);break;case C:printf(“6069”);break;case D:printf(“60”);break;default:printf(“error!”);流程图为:grade输出 “85100”输出 “60”输出 “60-69”输出 “error”输出 “70-84”5.3.4 5.3.4 标号语句和标号语句和gotogoto标号语句一般形式:标号语句一般形式:语句标号:语句语句标号:语句例例如如:end:,该该标标志志符符就就成成了了语语句句标标号号,但但标标号号不不能能用用数数值值表表示示,例例如如:12:,3:,5:都都是是
15、错错误误的的。标标号号可可以以与与变变量量同同名。名。goto语句一般形式:语句一般形式:goto 语句标号;语句标号;goto语句的作用是使程序改变原来的执行顺序,语句的作用是使程序改变原来的执行顺序,而跳到指定的语句上执行。而跳到指定的语句上执行。例如:例如:goto sd;sd:printf(“this is a cat!n”);说明:C语语言言允允许许在在任任何何语语句句前前加加一一个个语语句句标标号号,作作为为goto语句的目标。给语句加标号的形式:语句的目标。给语句加标号的形式:语句标号:语句语句标号:语句 goto语语句句是是一一种种非非结结构构化化语语句句,结结构构化化程程序序
16、设设计计方方法法不不提提倡倡使使用用goto语语句句,因因为为滥滥用用goto语语句句将将使使程程序序流流程程无无规规律律,可可读读性性差差。但但也也不不是是绝绝对对禁禁止止使使用用,只只有有在在能能够够大大大大提提高高程程序序效效率时才使用。率时才使用。且记:不要从循环体外跳到循环体内且记:不要从循环体外跳到循环体内!main()int i,sum=0;i=1;loop:if(i100)sum=sum+1;i+;goto loop;printf(“%d”,sum);一、例一、例 用用if 语句和语句和goto语句构成循环求语句构成循环求 1+2+3+100。二、用二、用goto语句和语句和
17、if 语句语句构成循环构成循环计算计算10!并输出结果。!并输出结果。main()int i=1,sum=1;loop:if(i=10)sum=sum*i;i+;goto loop;printf(“10!=%dn”,sum);运行结果:10!=24320本应是:10!=3628800 main()int i=1;long sum=1;loop:if(i=10)sum=sum*i;i+;goto loop;printf(“10!=%ldn”,sum);5.4 5.4 选择结构程序设计举例选择结构程序设计举例例例 写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。设:设:leap代表闰年信息
18、,代表闰年信息,leap=1闰年,闰年,leap=0 非闰年非闰年不能被4整除非闰年被4整除,但不能被100整除闰年被100整除,又能被400整除闰年其他,非闰年非闰年main()int year,leap=0;scanf(“%d”,&year);/*输入年份值*/if(year%4=0&year%100!=0)|(year%400=0)leap=1;else leap=0;if(leap=1)printf(“%d is leap”,year);else printf(“%d is not leap”,year);main()int year,leap=0;scanf(“%d”,&year);
19、/*输入年份值*/if(year%4!=0)leap=0;else if(year%100!=0)leap=1;else if(year%400!=0)leap=0;else leap=1;if(leap=1)printf(“%d is leap”,year);else printf(“%d is not leap”,year);例例 已知基本运费、货重,以及路程已知基本运费、货重,以及路程(s)和折扣的关和折扣的关系标准如下:系标准如下:s250km 没有折扣 250s500%2折扣 500s1000 5%折扣 1000s2000 8%折扣 2000s=3000)c=12;else c=s/
20、250;/*按按250分类分类*/switch(c)case 0:d=0;break;/*s250*/case 1:d=2;break;/*250s500*/case 2:/*500s750*/case 3:d=5;break;/*750s1000*/case 4:/*1000s1250*/case 5:/*1250s1500*/case 6:/*1500s1750*/case7:d=8;break;/*1750s2000*/case8:/*2000s2250*/case9:/*2250s2500*/case10:/*2500s2750*/case11:d=10;break;/*2750s=3
21、000)d=15;else if(s=2000&s=1000&s=500&s=250&s0,有两个不相等的实根有两个不相等的实根 4、b2-4ac0,有两个共轭复根有两个共轭复根 5、如何判断实数为零(或大于零,或小于零)、如何判断实数为零(或大于零,或小于零)特殊条件的处理特殊条件的处理#includemain()else if(disc1e-6)float a,b,c,d,disc,x1,x2,realpart,imapart;x1=(-b+sqrt(disc)/(2*a);scanf(“%f,%f,%f”,&a,&b,&c);x2=(-b-sqrt(disc)/(2*a);printf(
22、“The equation”);if(fabs(a)=1e-6)else printf(“is not a quadratic”);realpart=-b/(2*a);else imagpart=sqrt(-disc)/(2*a);disc=b*b-4*a*c;printf(“has complex roots:n”);if(fabs(disc)=1e-6)打印虚根;printf(“has two equal roots:%7.4fn”,-b/(2*a);有问题吗?有问题吗?习题习题 给一个不多于给一个不多于5位的正整数位的正整数,要求要求:求出它是几位数求出它是几位数;分分别打印出每一位数字
23、别打印出每一位数字;按逆序打印出各位数字按逆序打印出各位数字,例如原数为例如原数为321,应输出应输出123。#include main()long int num;int n1,n2,n3,n4,n5,bits;scanf(“%ld”,&num);if(num9999)bits=5 else if(num999)bits=4;else if(num99)bits=3;else if(num9)bits=2;else bits=1;printf(“bits=%dn”,bits);n5=num/10000;n4=(int)(num-n5*10000)/1000;n3=(int)(num-n5*1
24、0000-n4*1000)/100;n2=(int)(num-n5*10000-n4*1000-n3*100)/10;n1=(int)(num-n5*10000-n4*1000-n3*100-n2*10);switch(bits)case 5:printf(“Every bit is:%d,%d,%d,%d,%dn”,n5,n4,n3,n2,n1);printf(“Reverse is:%d,%d,%d,%d,%dn”,n1,n2,n3,n4,n5);break;case 4:printf(“Every bit is:%d,%d,%d,%dn”,n4,n3,n2,n1);printf(“Rev
25、erse is:%d,%d,%d,%dn”,n1,n2,n3,n4);break;case 3:printf(“Every bit is:%d,%d,%dn”,n3,n2,n1);printf(“Reverse is:%d,%d,%dn”,n1,n2,n3);break;case 2:printf(“Every bit is:%d,%dn”,n2,n1);printf(“Reverse is:%d,%dn”,n1,n2);break;case1:printf(“Bit is:%dn”,n1);printf(“Reverse is:%dn”,n1);运行情况:运行情况:12345 Inputbi
26、ts=5Every bit is:1,2,3,4,5Reverse is:5,4,3,2,1Output5.5 5.5 小结小结(1)(1)C C语语言言提提供供的的关关系系运运算算符符有有6 6种种:(小小于于),=(大大于于),=大大于于等等于于),=(=(等等于于),!=(!=(不不等等于于)。用用关关系系运运算算符符将将两两个个表表达达式式连连接接起起来来,进行关系运算的式子称为关系表达式。进行关系运算的式子称为关系表达式。(2)(2)C C语语言言提提供供的的逻逻辑辑运运算算符符有有3 3种种:&(&(逻逻辑辑与与),|(|(逻逻辑辑或或),!(!(逻逻辑辑非非)。用用逻逻辑辑运运算
27、算符符将将一一个个或或多多个个表表达达式式连连接接起起来来,进进行行逻逻辑辑运运算算的的式式子子称称为为逻逻辑表达式。辑表达式。(3)(3)ifif语句的三种基本形式如下:语句的三种基本形式如下:单分支单分支if语句语句 双分支双分支if语句语句 多分支多分支if语句语句(4)(4)使用使用ifif语句的注意事项如下:语句的注意事项如下:ifif语语句句中中的的“表表达达式式”必必须须用用“()()”括括起起来来。“表表达达式式”,除除常常见见的的关关系系表表达达式式或或逻逻辑辑表表达达式式外外,也也允允许许是是其其他他类类型型的的数数据据,如如整整型型、实实型型、字符型等。字符型等。elseelse子子句句(可可选选)是是ifif语语句句的的一一部部分分,必必须须与与ifif配配对对使使用用,不不能能单单独独使使用。用。“语语句句组组1 1”和和“语语句句组组2 2”,可可以以只只包包含含一一个个简简单单语语句句,也也可可以以是是复复合合语语句句。当当ifif和和elseelse后后面面的的语语句句组组,仅仅由由一一条条语语句句构构成成时时,也也可可不不使使用用复合语句形式复合语句形式(即去掉花括号即去掉花括号)。if语句允许嵌套,但嵌套的层数不宜太多。语句允许嵌套,但嵌套的层数不宜太多。(5)switch语句用来实现多分支结构的程序设计。语句用来实现多分支结构的程序设计。
限制150内