《吉林大学《C语言程序设计基础》课程选择程序结构设计.ppt》由会员分享,可在线阅读,更多相关《吉林大学《C语言程序设计基础》课程选择程序结构设计.ppt(51页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C程序设计程序设计第第5章章 选择结构程序设计选择结构程序设计本章要点本章要点5.1 关系运算符和关系表达式所谓所谓“关系运算实际上是关系运算实际上是“比较运算。将两个比较运算。将两个值进行比较,判断比较的结果是否符合给定的条件。值进行比较,判断比较的结果是否符合给定的条件。例如,例如,a a3 3是一个关系表达式。是一个关系表达式。如果如果a a的值为的值为5 5,那么关系表达式的值为,那么关系表达式的值为“真;真;如果如果a a的值为的值为2 2,不满足,不满足“a“a3 3条件,那么称关条件,那么称关系表达式的值为系表达式的值为“假。假。5.1.1 关系运算符及其优先次序 C语言提供6种
2、关系运算符:(1)小于 (2)大于 (4)=大于或等于 (5)=等于 (6)!=不等于优先级相同高优先级相同低优先次序:优先次序:1 1前前4 4种关系运算符的种关系运算符的优先级别高于后两种。优先级别高于后两种。2 2关系运算符的优先关系运算符的优先级低于算术运算符。级低于算术运算符。3 3关系运算符的优先关系运算符的优先级高于赋值运算符。级高于赋值运算符。以上关系如图以上关系如图5-15-1所示。所示。算术运算符关系运算符赋值运算符(高)(低)图5-1例如:例如:ca+b ca+b 等效于等效于c(a+b)c(a+b)a=bca=bc等效于等效于a=a=bcbc a=bc 等效于等效于a=
3、(bc)a=(bc)5.1.2 5.1.2 关系表达式关系表达式用关系运算符将两个表达式可以是算术、关系、用关系运算符将两个表达式可以是算术、关系、逻辑、赋值、字符表达式连接起来的式子,称逻辑、赋值、字符表达式连接起来的式子,称关系表达式。关系表达式。关系表达式的值是一个逻辑值,即关系表达式的值是一个逻辑值,即“真或真或“假假。例如:例如:ab,a+bb+c,a(b=5),(ab)(by)b)&(xy)可写成可写成ab&xy ab&xy(!a)|(a(!a)|(ab)b)可写成可写成!a|a!a|ab b5.2.2 5.2.2 逻辑表达式逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式用
4、逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。子就是逻辑表达式。逻辑表达式的值应该是一个逻辑量逻辑表达式的值应该是一个逻辑量“真或真或“假。假。逻辑值及其判断逻辑值及其判断 C C语言编译系统在给出逻辑运算结果时语言编译系统在给出逻辑运算结果时,以数值以数值1 1代表代表“真真,以以0 0代表代表“假假,但在判断一个量是否但在判断一个量是否为为“真时真时,以以0 0代表代表“假假,以非以非0 0代表代表“真。真。例如:假设a=4,b=5。!a 的值为0。a&b 的值为1。a|b 的值为1。!a|b 的值为1。4&0|2 的值为1。说明:由系统给出的逻辑运算结果不是0就是1,不可能
5、是其它数值。而在逻辑表达式中作为参加逻辑运算的运算对象操作数可以是0假或任何非0的数值真。分析:53&2|84-!0注意:注意:在逻辑表达式的求解中,并不是所有的逻辑在逻辑表达式的求解中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。算符才能求出表达式的解时,才执行该运算符。1 1a&b&c a&b&c 只有只有a a为真时,才需要判为真时,才需要判别别b b的值,只有的值,只有a a和和b b都为真的情况下才都为真的情况下才需要判别需要判别c c的值,见的值,见图图5.35.3。图5-3(2)a|
6、b|c(2)a|b|c 只要只要a a为真为真,就不必判断就不必判断b b和和c;c;只有只有a a假,才假,才判别判别b;ab;a和和b b都为假都为假才判别才判别c c,见图,见图 如果有下面的逻辑表达式:如果有下面的逻辑表达式:(m=ab)&(n=cd)(m=ab)&(n=cd)当当a=1,b=2,c=3,d=4,a=1,b=2,c=3,d=4,m m和和n n的原值为的原值为1 1时,执行之后时,执行之后m=0,n=1m=0,n=1。图5-4 例:要判别某一年year是否闰年。闰年的条件是符合下面二者之一:能被4整除,但不能被100整除。能被4整除,又能被400整除。可以用一个逻辑表达
7、式来表示:(year%4=0&year%100!=0)|year%400=0 可以加一个“!用来判别非闰年:!(year%4=0&year%100!=0)|year%400=05.3 if语句5.3.1 if5.3.1 if语句的三种形式语句的三种形式1.1.单分支形式单分支形式 if(if(表达式表达式)语句语句 例如例如:if(xy)if(xy)printf(“%d printf(“%d,x);,x);这种这种ifif语句的执行语句的执行 过程见图过程见图5-5(a)5-5(a)。0 表表 达达式式 语句语句1图5-5a 2双分支形式 if表达式)语句1else 语句2 例如:if(xy)
8、printf“d,x;else printf“d,y;见图5-5b。语句语句1 1语句语句2 2真真假假图5-5b表达式表达式3多分支形式 if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 :else if表达式m语句m else 语句n 流程图如图5-6。表达式表达式1 1FT表达式表达式3 3FT表达式表达式2 2FT表达式表达式4 4FT语句语句4 4语句语句5 5语句语句3 3语句语句2 2语句语句1 1图5-6例如:ifnumber500 cost=0.15;else ifnumber300 cost=0.10:else ifnumber10
9、0 cost=0.075;else ifnumber50 cost=0.05;else cost=0;说明:(1)假设表达式的值为0,按“假处理,假设表达式的值为非0,按“真处理。(2)在if和else后面可以有多个操作语句,此时用花括号“将几个语句括起来成为一个复合语句。例例5.1 5.1 输入两个实数输入两个实数,按代数值由小到大次序输出这按代数值由小到大次序输出这两个数。两个数。void main()void main()float a,b,t;float a,b,t;scanf(“%f,%fscanf(“%f,%f,&a,&b);,&a,&b);if(ab)if(ab)t=a;t=a;
10、a=b;a=b;b=t;b=t;printf(“%5.2f,%5.2fprintf(“%5.2f,%5.2f,a,b);,a,b);abt运行情况如下:3.6,-3.2-3.20,3.60例例5.2 5.2 输入输入3 3个数个数a,b,c,a,b,c,要求按由小到大的顺序输出。要求按由小到大的顺序输出。void main()void main()float a,b,c,t;float a,b,c,t;scanf(“%f,%f,%fscanf(“%f,%f,%f,&a,&b,&c);,&a,&b,&c);if(ab)if(ab)t=a;a=b;b=t;t=a;a=b;b=t;if(ac)if(
11、ac)t=a;a=c;c=t;t=a;a=c;c=t;if(bc)if(bc)t=b;b=c;c=t;t=b;b=c;c=t;printf(“%5.2f,%5.2f,%5.2fprintf(“%5.2f,%5.2f,%5.2f,a,b,c);,a,b,c);运行情况如下:3.7,11.00,3.00,7.005.3.2 if 语句的嵌套一般形式如下:一般形式如下:if()if()if()if()语句语句1 1else else 语句语句2 2elseelseif()if()语句语句3 3else else 语句语句4 4应当注意应当注意ifif与与elseelse的配对关系。的配对关系。els
12、eelse总是与它上面的总是与它上面的最近的最近的ifif配对。配对。例例 5.3 5.3 有一函数有一函数 -1 (x0)-1 (x0)1 (x0)编一程序,输入一个编一程序,输入一个x值,输出值,输出y值。值。有以下几种写法,请判断哪些是正确的?有以下几种写法,请判断哪些是正确的?程序1:main()int x,y;scanf(“%d,&x);if(x0)y=-1;else if(x=0)y=0;else y=1;printf(“x=%d,y=%dn,x,y);可以用流程图5-7来表示。图5-7输入输入x x开始开始x0 x=0)if(x=0)if(x0)y=1;if(x0)y=1;els
13、ey=0;elsey=0;elsey=-1;elsey=-1;见流程图见流程图5-85-8。x0 x0 x0 x0y=0y=0y=1y=1y=-1y=-1YNYN图5-8程序程序3:3:将上述将上述ifif语句改为:语句改为:y=-1;y=-1;if(x!=0)if(x!=0)if(x0)y=1;if(x0)y=1;else y=0;else y=0;见流程图见流程图5-95-9可看出是错可看出是错误的。误的。x0 x0 x0 x0y=0y=0y=1y=1YNYN图5-9y=-1y=-1 程序程序4:4:将上述将上述ifif语句改为:语句改为:y=0;y=0;if(x=0)if(x=0)if(
14、x0)y=1;if(x0)y=1;else y=-1;else y=-1;见流程图见流程图5-105-10可看出是错可看出是错 误的。误的。x0 x0 x0 x0y=-1y=-1y=1y=1y=0y=0YNYN图5-105.3.3 条件运算符 假设有以下if语句 if(ab)max=a;else max=b;可以用下面的条件运算符来处理:max=(ab)?a:b;其中?和:为条件运算符,有三个操作对象,称三目运算符。条件表达式的一般形式为:条件表达式的一般形式为:表达式表达式1 1?表达式?表达式2 2:表达式:表达式3 3它的执行过程见它的执行过程见图图5-115-11。图5-11表达式表达
15、式1 1条件表达式条件表达式取表达式取表达式2 2的值的值真(真(1 1)条件表达式条件表达式取表达式取表达式3 3的值的值假(假(0 0)说明:1条件运算符优于赋值运算符。低于关系和算术运算符。例如:int a=5,b=6;max=(ab)?a:b 等价于max=ab?a:b 执行结果是将 a 和 b 两者中大的赋给 max。ab?a:b+1 相当于 ab?a:(b+1)2条件运算符的结合方向为“自右自左。例如:ab?a:cd?c:d 相当于 ab?a:(cd?c:d)假设:a=1,b=2,c=3,d=4,那么表达式的值等于4。3条件表达式中,表达式2和表达式3不仅可以是数值表达式,还可以是
16、赋值表达式或函数表达式。例如:ab?(a=100):(b=100)ab?printf(“%d,a):printf(“%d,b)4 4表达式表达式1,1,表达式表达式2 2和表达式和表达式3 3的类型不同。的类型不同。例如例如:xy?1:1.5:xy?1:1.5 如果如果x=y,xy,xy,值应为值应为1,1,由于由于1.51.5是实型,比整型高,因此,是实型,比整型高,因此,将将1 1转换成实型值转换成实型值1.01.0。例例5.4 5.4 输入一个字符,判别它是否大写字母,如果输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换,然是,将它转换成小写字母;如果不是,
17、不转换,然后输出最后得到的字符。后输出最后得到的字符。main()main()char ch;char ch;scanf(“%c scanf(“%c,&ch);,&ch);ch=(ch=A&ch=A&ch=Z)?(ch+32):ch;printf(“%c printf(“%c,ch);,ch);运行结果如下:Aa5.4 switch语句 一般形式一般形式:switch(switch(表达式表达式)case case 常量表达式常量表达式1:1:语句语句1 1 case case 常量表达式常量表达式2:2:语句语句2 2.case case 常量表达式常量表达式n:n:语句语句n ndefau
18、lt:default:语句语句n+1n+1 例如:根据考试成绩的等级打印出百分制分数段。switch(grade)caseA:printf(“85-100n);caseB:printf(“70-84n);caseC:printf(“60-69n);caseD:printf(“60n);default:printf(“errorn);说明:(1)switch后面括弧内的“表达式可以为任何类型。(2根据case后面的常量表达式来寻找入口。(3每一个case的常量表达式的值必须互不相同,否那么就会出现互相矛盾的现象。(4各个case和default的出现次序不影响执行结果。(5执行完一个case后面
19、的语句后,流程控制转移到下一个case继续执行。“case常量表达式只是起语句标号作用,并不是在该处进行条件判断。应该在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行。将上面的switch结构改写如下:switch(grade)case A:printf(“85-100n);break;case B:printf(“70-84n);break;case C:printf(“60-69n);break;case D:printf(“60n);break;default:printf(“errorn);流程图见图5.12所示。输出7084输出6069输出60n);
20、break;.5.5 程序举例 例例5.5 5.5 写程序写程序,判断某一年是否闰年。判断某一年是否闰年。闰年的条件是符合下面二者之一:闰年的条件是符合下面二者之一:能被能被4 4整除,但不能被整除,但不能被100100整除。整除。能被能被4 4整除,又能被整除,又能被400400整除。整除。year year4 40&year0&year100!=0|year100!=0|year400=0400=0 用图用图5-135-13来表示判别闰年的算法。来表示判别闰年的算法。图图5-135-13 yearyear被被4 4整除整除真真假假yearyear被被100100整除整除真真假假yearye
21、ar被被400400整除整除真真真真假假假假leap=1leap=1leap=0leap=0leap=0leap=0leap=1leap=1leapleap输出输出“闰年闰年”输出输出“非闰年非闰年”voidmain()intyear,leap;scanf(“%d,&year);if(year%4=0)if(year%100=0)if(year%400=0)leap=1;elseleap=0;elseleap=1;elseleap=0;if(leap)printf(“%dis,year);elseprintf(“%disnot,year);printf(“aleapyearn);运行情况:19
22、891989 is not a leap year20002000 is a leap year也可以将程序中第也可以将程序中第4 41111行改写成以下的行改写成以下的ifif语句语句:if(year%4!=0)if(year%4!=0)leap=0;leap=0;else if(year%100!=0)else if(year%100!=0)leap=1;leap=1;else if(year%400!=0)else if(year%400!=0)leap=0;leap=0;elseelse leap=1;leap=1;也可以用一个逻辑表达式包含所有的闰年条件,将上述也可以用一个逻辑表达式
23、包含所有的闰年条件,将上述ifif语句语句用下面的用下面的ifif语句代替:语句代替:if(year%4=0&year%100!=0)|(year%400=0)if(year%4=0&year%100!=0)|(year%400=0)leap=1;leap=1;else else leap=0;leap=0;例例 5.6 5.6 求求ax2+bx+c=0ax2+bx+c=0方程的解。方程的解。求解时,应该有以下几种可能:求解时,应该有以下几种可能:a=0,a=0,不是二次方程。不是二次方程。b b2 2-4ac=0,-4ac=0,有两个相等实根。有两个相等实根。b b2 2-4ac0,-4ac
24、0,有两个不等实根。有两个不等实根。b b2 2-4ac0,-4ac0-4ac0输出输出“非二非二次次”方程方程输出两输出两个相等个相等实根:实根:-b/2a-b/2a输出两个实根输出两个实根x1,x2输出两个复根:输出两个复根:p+qi,p-qi计算复根的实部和计算复根的实部和虚部:虚部:实部实部 p=-b/2a图5-14虚部虚部#include“math.hmain()float a,b,c,disc,x1,x2,realpart,imagpart;scanf(“%f,%f,%f,&a,&b,&c);printf(“The equation);if(fabs(a)=1e-6)printf(
25、“is not quadratic);elsedisc=b*b-4*a*c;if(fabs(disc)1e-6)x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf(“has distinct real roots:%8.4f and%8.4fn,x1,x2);else realpart=-b/(2*a);imagpart=sqrt(-disc)/(2*a);printf(“has complex roots:n);printf(“%8.4f+%8.4fin,realpart,imagpart);printf(“%8.4f-%8.4fin
26、,realpart,imagpart);运行结果如下:运行结果如下:1,2,11,2,1The equation has two equalroots:-1.0000The equation has two equalroots:-1.00001,2,21,2,2The equation has complex roots:The equation has complex roots:-1.0000+1.0000i-1.0000+1.0000i-1.0000-1.0000i-1.0000-1.0000i2,6,12,6,1The equation has distinct real roots
27、:-0.1771 The equation has distinct real roots:-0.1771 and-2.8229and-2.8229 例例5.7 5.7 运输公司对用户计算运费。距离运输公司对用户计算运费。距离(s)(s)越远越远,每公每公里运费越低。标准如下里运费越低。标准如下:s250km s250km 没有折扣没有折扣 250=s500%2 250=s500%2折扣折扣 500=s1000%5 500=s1000%5折扣折扣 1000=s2000%8 1000=s2000%8折扣折扣 2000=s3000%10 2000=s3000%10折扣折扣 3000=s%15 3000=3000)c=12;elsec=s/250;switch(c)case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;case 4:case 5:case 6:case 7:d=8;break;case 8:case 9:case 10:case 11:d=10;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);printf(“freight=%15.4f,f);运行情况如下:100,20,300freight=588000.0000