资源预览内容
第1页 / 共50页
第2页 / 共50页
第3页 / 共50页
第4页 / 共50页
第5页 / 共50页
第6页 / 共50页
第7页 / 共50页
第8页 / 共50页
第9页 / 共50页
第10页 / 共50页
亲,该文档总共50页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
C语言程序设计第五章第五章 选择结构的程序设计选择结构的程序设计主要内容1.关于条件的表示2.if条件分支结构3.选择结构的嵌套4.switch-case开关语句5.程序举例引入:u在现实生活中,需要进行判断和选择的情况是很多的u处理这些问题,关键在于进行条件判断u由于程序处理问题的需要,在大多数程序中都会包含选择结构,需要在进行下一个操作之前先进行条件判断5.1关于条件的表示进行逻辑判断时,进行逻辑判断时,C C语言中提供了三种运算:语言中提供了三种运算: 关系运算、逻辑运算、条件运算关系运算、逻辑运算、条件运算三种运算的结果:三种运算的结果: 均为逻辑值:即为均为逻辑值:即为“真真”或或“假假”。对于参与运算的逻辑型数据,进行逻辑判断对于参与运算的逻辑型数据,进行逻辑判断时时将非将非0 0视为视为“真真”;0 0视为视为“假假”。关系运算符关系运算符关系运算符共有关系运算符共有6 6种(双目运算符种(双目运算符 ) 大于大于 = = 大于等于大于等于 小于小于 = ,=, , =b+ca(b+c)关系运算的结果应该为逻辑型“真”或“假”,用整型1表示“真”,用整型0表示“假”,即其结果为逻辑值。关系运算实例关系表达式75的值是1,57的值是0。已知:inta=13,b=2,c=1;abab)=cab=ca-b=c成立,结果为1不成立,结果为0成立,结果为1不成立,结果为0结果为1与上面等价,结果为1等价于(a-b)=1,结果为0例若a=0;b=0.5;x=0.3;则a=x278在C中是允许的,值为0例inti=1,j=7,a;a=i+(j%4!=0);则a=2例a0结果为A100结果为10关系运算注意(1)例注意区分“=”与“=”inta=0,b=1;if(a=b)printf(“aequaltob”);elseprintf(“anotequaltob”);例应避免对实数作相等或不等的判断如1.0/3.0*3.0=1.0结果为可改写为:fabs(1.0/3.0*3.0-1.0)3&2|83)&2|(83)&2|(8b)&(n=cd)/结果结果m=0,n=1m=0,n=1逻辑运算符和表达式(3)条件运算符(三目)?:条件表达式:表达式1?表达式2:表达式3三、条件运算符和条件表达式功能:如果表达式1成立(表达式1值为非0),则执行表达式2;否则(表达式1不成立),执行表达式3。 例:例: max= (ab) ? a : b; max= (ab) ? a : b; 求变量求变量a a与与b b的最大值的最大值 min = (ab) ? a : b; min = (ab) ? a : b; 求变量求变量a a与与b b的最小值的最小值条件运算符的运算方向:条件运算符的运算方向: 在一个表达式内在一个表达式内为“自左向右自左向右”; 多个表达式多个表达式连用用结合性合性“自右向左自右向左”。 例:例: int x=1,y=2,z=3,w=4;int x=1,y=2,z=3,w=4; printf(printf(“%dn%dn”,yx?w:z);,yx?w:z);条件表达式的使用条件表达式的使用#include #include void main()void main() char ch; char ch; scanf(%c,&ch); scanf(%c,&ch); ch=(ch=A&ch=A&chy) printf(“%d”,x);表达式表达式语句语句真(非真(非0 0)假假(0 0)表达式必须用表达式必须用括号括起来。括号括起来。例例5.1 输入两个实数,按代数值输入两个实数,按代数值由小到大的顺序输出这两个数。由小到大的顺序输出这两个数。#includevoid main()float a,b,t;scanf(“%f,%f”,&a,&b);if(ab)t=a;a=b;b=t;printf(“%5.2f,%5.2fn”,a,b);ynabt=aa=bb=t5.2if条件分支结构例例5.2 5.2 输入三个数输入三个数a,b,c,a,b,c,要求按由小到大的顺序输出。要求按由小到大的顺序输出。if ab if ab 将将a a和和b b对换对换if ac if ac 将将a a和和c c对换对换if bc if bc 将将b b和和c c对换对换abacbca和b交换a和c交换c和b交换yyynn5.2if条件分支结构 #include #include void main ( ) void main ( ) float a,b,c,t; float a,b,c,t; scanf( scanf(“%f,%f,%f%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(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.2fn,a,b,c);printf(%5.2f,%5.2f,%5.2fn,a,b,c); 5.2if条件分支结构(2) ifelse两路分支结构两路分支结构if(if(表达式表达式) ) 语句语句1;1;else else 语句语句2;2; 条件条件 语句语句1 语句语句2YN例:在屏幕上显示输出两个数中的较大者。 if (xy) printf(“%d”,x); else printf(“%d”,y);5.2if条件分支结构(3) ifelse ifelse多路分支结构多路分支结构ifif(表达式(表达式1 1)语句)语句1;1; else if( else if(表达式表达式2)2)语句语句2;2; else if( else if(表达式表达式3)3)语句语句3;3; else if( else if(表达式表达式m)m)语句语句m;m; else else 语句语句n;n;5.2if条件分支结构 例:从键盘输入一个字符,对输入的字符进行例:从键盘输入一个字符,对输入的字符进行分类,分为:分类,分为:控制控制、数字数字、大写字母大写字母、小写小写字母字母和其他字符等五类。和其他字符等五类。 分析:分析:ASCIIASCII码表中的码表中的前前3232个个 (ASCII(ASCII码为码为 0 031) 31) 字符为控制字符字符为控制字符;09为数字;为数字;AZ为大写字母;为大写字母; az为小写字母;为小写字母;其它。不是以上其它。不是以上 4 4 类字符的全部字符。类字符的全部字符。#include void main ( ) char c; printf (Enter a character:); c = getchar( ); if (c=0 & c=A & c=a & c=z ) printf (nIs a lower character.n); else printf (nIs another character.n);注意:如何判断注意:如何判断数字数字、大写字母大写字母和和小写字母小写字母说明:说明:(1)3(1)3种形式的种形式的ifif语句中在语句中在ifif后面都有表达式,后面都有表达式, 一般为逻辑表达式或关系表达式。一般为逻辑表达式或关系表达式。(2)(2)第二、第三种形式的第二、第三种形式的ifif语句中,在每个语句中,在每个 elseelse前面有一个分号,整个语句结束处有一前面有一个分号,整个语句结束处有一 个分号。个分号。(3)(3)在在ifif和和elseelse后面可以只含有后面可以只含有一个一个内嵌的操内嵌的操 作语句,也可以有多个操作语句,此时用大作语句,也可以有多个操作语句,此时用大 括号将几个语句括起来成为一个复合语句。括号将几个语句括起来成为一个复合语句。5.2if条件分支结构5.3选择结构的嵌套ifif语句的嵌套:语句的嵌套:在在ifif语句中又包含一个或多个语句中又包含一个或多个ifif语句称为语句称为ifif语句的嵌套。语句的嵌套。内嵌内嵌ifif形式:形式:if()if()if() if() 语句语句1;1;else else 语句语句2;2;elseelseif() if() 语句语句3;3;else else 语句语句4;4;输入入变量量x, 计算算y: x+1 x1y = x+2 1=x2 x+3 2=x=3if (x2) if(x1) y = x+1; else y = x+2;else if(x3) y = x+3; else y = x+4; x 2 x 1y = x+1y = x+2非0 0非0 0 x 3y = x+3y = x+4非0 0匹配规则:匹配规则:elseelse总是与它上面的、最近的、同一复合语句中的、未配总是与它上面的、最近的、同一复合语句中的、未配对的对的ifif语句配对。语句配对。例:例:if()if()if() if() 语句语句1;1;elseelseif() if() 语句语句2;2;else else 语句语句3;3;例:例:if()if()if() if() 语句语句1;1;elseelseif() if() 语句语句2;2;else else 语句语句3;3;当当ifif和和elseelse数目不同时,可以加数目不同时,可以加大括号大括号来确定配对关系。来确定配对关系。5.3选择结构的嵌套 -1 (x0)一个一个x x值,输出值,输出y y值。值。算法算法1 1: 算法算法2 2:输入输入x x 输入输入x x若若x0,x0,则则y=-1 y=-1 若若x0,x0,x0,则则y=1 y=1 若若x=0,x=0,则则y=0y=0输出输出y y 若若x0,x0,则则y=1y=1 输出输出y y 5.3选择结构的嵌套 #includevoid main() int x,y; scanf(“%d”,&x); 程序段程序段 printf(“x=%d,y=%dn”,x,y); 5.3选择结构的嵌套上例中的程序段有四个,请判断哪个是正确的?程序1: 程序2: if(x=0) y=-1; if(x0) y=1; else else y=0; if(x=0) y=0; else y=-1; else y=1;程序3: 程序4: y=-1; y=0; if(x!=0) if(x=0) if(x0) y=1; if(x0) y=1; else y=0; else y=-1;正确正确5.3选择结构的嵌套5.4switch-case开关语句(多分支选择语句)switch语句的格式:语句的格式:switch(表达式)(表达式) case常量表达式:语句常量表达式:语句; case常量表达式:语句常量表达式:语句; case常量表达式:语句常量表达式:语句; default: 语句语句; 表达式的值为整型、字符型或枚举型switch 后面的表达式的各个不同的取值表达式的值表达式的值=常量表达式常量表达式 2 的值的值表表达达式式语句序列语句序列1语句序列语句序列2语句语句序列序列n语句语句序列序列n+1 表达式的值表达式的值= =常量表达式常量表达式 1 1 的值的值表达式的值表达式的值=常量表达式常量表达式 n 的值的值其他其他5.4switch-case开关语句(多分支选择语句)例例: :要求按照考试成绩的等级输出百分制分数段,用要求按照考试成绩的等级输出百分制分数段,用switchswitch语句实现:语句实现: switch(grade) switch(grade) case A:printf(85100n); case A:printf(85100n); case B:printf( 7084n); case B:printf( 7084n); case C:printf( 6069n); case C:printf( 6069n); case D:printf( 60n ); case D:printf( 60n ); default:printf( errorn); default:printf( errorn); 5.4switch-case开关语句(多分支选择语句)switch语句格式语句格式switch (表达式表达式) case 常量常量1: 语句语句序列序列1; break; case 常量常量2: 语句语句序列序列2; break; default: 语句语句序列序列n+1; 5.4switch-case开关语句(多分支选择语句)执行语句序列1=常量1?计算表达式的值相等不相等break执行语句序列2=常量2?相等不相等break执行语句序列n+1有default?有没有5.4switch-case开关语句(多分支选择语句)说明:(1)(1) switchswitch后面括弧内的后面括弧内的“表达式表达式”, ANSIANSI标准允许标准允许它为任何类型。它为任何类型。(2) (2) 当表达式的值与某一个当表达式的值与某一个casecase后面的常量表达式的值相后面的常量表达式的值相 等时,就执行此等时,就执行此casecase后面的语句,若所有的后面的语句,若所有的casecase 中的常量表达式的值都没有与表达式的值匹配的,就执中的常量表达式的值都没有与表达式的值匹配的,就执行行defaultdefault后面的语句。后面的语句。(3) (3) 每一个每一个casecase的常量表达式的值必须的常量表达式的值必须互不相同互不相同,否则就,否则就 会出现互相矛盾的现象(对表达式的同一个值,有两会出现互相矛盾的现象(对表达式的同一个值,有两种或种或 多种执行方案)。多种执行方案)。5.4switch-case开关语句(多分支选择语句)(4) (4) 各个各个casecase的出现次序不影响执行结果的出现次序不影响执行结果( (有有breakbreak的情况的情况) )。 例如,可以先出现例如,可以先出现“case case : :”,然后是,然后是“case case : :”。(5) (5) 执行完一个执行完一个casecase后面的语句后,流程控制转移到下一后面的语句后,流程控制转移到下一 个个casecase继续执行继续执行(无(无breakbreak的情况)的情况)。“casecase常量表达常量表达式式”只是起语句标号作用,并不是在该处进行条件判断。只是起语句标号作用,并不是在该处进行条件判断。在执行在执行switchswitch语句时,根据语句时,根据switchswitch后面表达式的值找到后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行匹配的入口标号,就从此标号开始执行下去,不再进行判断。判断。 在执行一个在执行一个casecase分支后分支后, ,可以用一个可以用一个breakbreak语句来终止语句来终止switchswitch语句的执行。语句的执行。 (6) (6) 多个多个casecase可以共用一组执行语句。可以共用一组执行语句。 5.4switch-case开关语句(多分支选择语句)5.5程序举例例例1 1 运输公司对用户计算运费。运输公司对用户计算运费。路程()越远,每公里运费越低。标准如下:路程()越远,每公里运费越低。标准如下: 250250 没有折扣没有折扣 250250500 500 折扣折扣 5005001000 1000 折扣折扣 100010002000 2000 折扣折扣 200020003000 103000 10折扣折扣 30003000 1515折扣折扣设每公里每吨货物的基本运费为,货物重为,距离为,设每公里每吨货物的基本运费为,货物重为,距离为,折扣为,则总运费的计算公式为:折扣为,则总运费的计算公式为:* * * *()() 分析折扣变化的规律性:分析折扣变化的规律性:折扣的折扣的“变化点变化点”都是的倍数都是的倍数 设一变量,设一变量,c c的值为的值为s/250s/250。c c代表的倍数。代表的倍数。 ,无折扣;,无折扣;,折扣;,折扣;,;,;,;,;,;,; ,。,。 5.5程序举例#include #include void main ( )void main ( ) int c,s; int c,s;float p,w,d,f;float p,w,d,f;scanf(%f,%f,%d,&p,&w,&s);scanf(%f,%f,%d,&p,&w,&s);if(s=3000) c=12;if(s=3000) c=12;else c=s/250;else c=s/250;switch(c)switch(c) case 0:d=0;break; case 0:d=0;break; case 1:d=2;break; case 1:d=2;break; case 2:case 3:d=5;break case 2:case 3:d=5;break; case 4:case 5:case 6:case 7:d=8;break;case 4:case 5:case 6:case 7:d=8;break; case 8:case 9:case 10: case 8:case 9:case 10: case 11:d=10;break; case 11:d=10;break; case 12:d=15;break; case 12:d=15;break; f=p*w*s*(1-d/100.0);f=p*w*s*(1-d/100.0);printf(freight=%15.4fn,f);printf(freight=%15.4fn,f);5.5程序举例1.switch1.switch语句与语句与ifif语句不同,仅能判断一种关系:语句不同,仅能判断一种关系:是否是否恒等恒等。 2.switch2.switch语句中语句中casecase子句的子句的常量常量可以是整型常量、可以是整型常量、字符型常量、枚举型数据,或是整型常量表达式,字符型常量、枚举型数据,或是整型常量表达式,不允许是变量不允许是变量。3.3.在同一个在同一个switchswitch中,中,casecase子句的子句的常量不能相同常量不能相同。在嵌套的在嵌套的switchswitch语句中,不同层次的语句中,不同层次的switchswitch之间,之间,可有相同的常量。可有相同的常量。switchswitch语句语句使用注意事项使用注意事项4.case 4.case 和和 default default 子句只能在子句只能在switchswitch语句语句中使用,且中使用,且 casecase和和 default default 只起只起标号作用标号作用,可出现在可出现在switchswitch中的任何位置。中的任何位置。5.case 5.case 和和 default default 子句后面的语句序列允子句后面的语句序列允许由多个可执行语句组成,且不必用许由多个可执行语句组成,且不必用“ ”括起来,也可以为空语句。括起来,也可以为空语句。switchswitch语句语句使用注意事项使用注意事项switchswitch语句的变形语句的变形1.default1.default子句可以省略子句可以省略。2.case 2.case 和和 default default 子句后面的语句可以子句后面的语句可以为空语句。为空语句。3.switch3.switch语句中可语句中可省略省略breakbreak语句,语句,但省略但省略后会改变流程。后会改变流程。例例 void main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0: a+; break; case 1: b+; break; case 2: a+;b+; break; case 3: a+;b+; printf(“na=%d,b=%d”,a,b); 运行结果:a=2,b=1嵌套的嵌套的switch语句语句跳出本次跳出本次switch例例5 55 5 求求x x2 2方程的解。方程的解。基本的算法:基本的算法: ,不是二次方程。,不是二次方程。 b b2 2,有两个相等实根。,有两个相等实根。 b2 ,有两个不等实根。,有两个不等实根。 b2 ,有两个共轭复根。,有两个共轭复根。5.5程序举例 #include #include #include #include void main ( ) void main ( ) float a,b,c,disc,x1,x2,realpart,imagpart; float a,b,c,disc,x1,x2,realpart,imagpart; scanf(%f,%f,%f,&a,&b,&c); scanf(%f,%f,%f,&a,&b,&c); printf(the equation ); printf(the equation ); if(fabs(a)=1e-6) if(fabs(a)=1e-6)printf(is not a quadraticn);printf(is not a quadraticn); else else disc=b*b-4*a*c; disc=b*b-4*a*c; if(fabs(disc)=1e-6) if(fabs(disc)1e-6)else if(disc1e-6)x1=(-b+sqrt(disc)/(2*a);x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf( printf(“has distinct real roots:%8.4f and has distinct real roots:%8.4f and %8.4fn%8.4fn”,x1,x2);,x1,x2); else elserealpart=-b/(2*a);realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); imagpart=sqrt(-disc)/(2*a); printf( printf(“ has complex rootsn has complex rootsn”);); printf( printf(“%8.4f+%8.4fin%8.4f+%8.4fin”,realpart,imagpart);,realpart,imagpart); printf( printf(“%8.4f-%8.4fin%8.4f-%8.4fin”,realpart,imagpart);,realpart,imagpart); 5.5程序举例
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号