2022年第五章选择结构程序设计 .pdf
第五章 选择结构程序设计(4 学时 ) 学号姓名班级成绩A B C 学习目的与要求:1、 学会正确使用关系运算符和逻辑运算符;2、重点掌握三种if 语句;3、 能够理解 if 语句的嵌套;4、重点掌握switch 语句;本章重点 :1、 三种 if 语句;2、if 语句的嵌套;3、switch 语句;第 1 讲知识归纳:1、关系运算符:(1) 、 、= 优先级高= 、! = 优先级低举例 :先乘除,后加减;注意:区分 =和= = (2) 关系表达式的值:关系表达式成立,为真-用 1 表示关系表达式不成立,为假- 用 0 表示2、逻辑运算符(1) 优先级别: ! 、 & 、 | 从左往右,优先级依次降低;(3) 逻辑表达式的值表达式结果为真- 值 为 1 表达式结果为假- 值 为 0 (4)a&b&c 只有 a 为真 (非 0) 时,才需要判别b 的值,只有 a和 b 都为真的情况下才需要判别c 的值。对 & 运算符,只有a0 , 才继续进行右面的运算;(5) a | b | c 只有 a 为假 (0) 时,才需要判别b 的值,只有a 和 b 都为假的情况下才需要判别c 的值。对 | 运算符,只有a=0 , 才继续进行其右面的运算。3、if 语句的第一、第二种形式:(1) (1) if ( 条件) 语句 1 ; (2) (2) if ( 条件) 语句 1 else 语句 2 基础练习 (A) 一、填空题1、关系表达式的运算结果是值。 C 语言没有逻辑型数据,以代表 “ 真” ,以代表 “ 假” 。2、逻辑运算符!是运算符,其结合性是由。3、C 语言提供的三种逻辑运算符是、 、 。其中优先级最高的为,优先级最低的为。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 14 页 - - - - - - - - - 4、逻辑运算符两侧的运算对象不但可以是0 和 1,或者是0 和非 0 的整数,也可以是任何类型的数据。系统最终以和 来判定它们属于“ 真” 或“ 假” 。5、设 y 为 int 型变量,请写出描述“y 是偶数 ” 的表达式。6、设 x,y,z 均为 int 型变量,请写出描述“x 或 y 中有一个小于z” 的表达式。7、条件 “ 2x3 或 xbc 的值是。10、当 a=5,b=4,c=2 时,表达式ab!=c 的值是。11、已知 A=7.5,B=2,C=3.6 ,表达式AB&CA|AB的值是。12、若 a=6,b=4,c=2,则表达式 !(a-b)+c-1&b+c/2的值是1 。13、有 int x,y,z;且 x=3,y=-4,z=5 ,则表达式 (x&y)=(x|z)的值为。14、有 int x,y,z;且 x=3,y=-4,z=5 ,则以下表达式的值为。!(xy)+(y!=z)|(x+y)&(y-z) 15、有 int a=3,b=4,c=5,x,y; ,则以下表达式的值为。!(x=a)&(y=b)&0 16、 if (!k) a=3; 语句中的 !k 可以改写为,使其功能不变。二、选择题1、逻辑运算符两侧运算对象的数据类型() 。A) 只能是 0 或 1 B)只能是 0 或非 0 正数C)只能是整型或字符型数据D) 可以是任何类型的数据2、以下关于运算符优先顺序的描述中正确的是() 。A) 关系运算符 算术运算符 赋值运算符 逻辑与运算符B)逻辑与运算符关系运算符 算术运算符 赋值运算符C)赋值运算符 逻辑与运算符 关系运算符 算术运算符D) 算术运算符 关系运算符 赋值运算符 逻辑与运算符3、下列运算符中优先级最高的是() 。A) B)+ C)& D)!= 4、为判断字符变量c 的值不是数字也不是字母时,应采用下述表达式 ()。A)c=57&c=90&c=122 B)!(c=57&c=90&c=122) C)c=48&c=65&c=97&c=48&c=65&c=97&c=1)&(x=200)&(x=1)|(x=200)|(x=1)&(x=200)&(x=1)|(x=200)|(x=300) 6、设 x、y 和 z 是 int 型变量,且x=3,y=4,z=5 ,则下面表达式中值为0 的是() 。A) x & yB) x=y C) x|y+z&y-z D) !(x=y&chb)&(n=cd) 后 n 的值为() 。A)1 B)2 C)3 D)4 9、以下不正确的if 语句形式是() 。A) if(xy&x!=y); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 14 页 - - - - - - - - - B) if(x=y) x+=y; C) if(x!=y) scanf(“ %d ” ,&x) else scanf(“%d ”,&y);D) if(xy) z=x; x=y; y=z; A)x=10,y=20,z=30 B)x=20,y=30,z=30 C)x=20,y=30,z=10 D)x=20,y=30,z=20 11、以下 if 语句语法正确的是()。A) if(x0) printf(“ %f” ,x)else printf(“ %f”,-x); B)B) if(x0) x=x+y; printf(“ %f” ,x); else printf(“ %f”,-x); C)C) if(x0) x=x+y; printf(“ %f” ,x); else printf(“ %f”,-x); D)D) if(x0) x=x+y; printf(“ %f” ,x) else printf(“ %f”,-x); 12、请阅读以下程序:main() int a=5,b=5,c=0; if(a=b+c) printf(“ *n” );else printf(“ $n” ); 以下程序() 。A)有语法错不能通过编译B)可以通过编译但不能通过连接C)输出 * D)输出 $ 三、写出下列程序的运行结果1、若运行时输入:2,则以下程序的运行结果是。#include void main(void) char Class; printf(“ Enter 1 for 1st class post or 2 for 2nd post”);scanf(“ %c” ,&Class);if(Class= 1)printf(“ 1st class postage is 19p”);else printf(“ 2nd class postage is 14p”);2、若运行时输入:4.4,则以下程序的运行结果是。#include void main(void) float CostPrice,SellingPrice; printf(“ Enter Cost Price $:”);scanf(“ %f” ,&CostPrice);if(CostPrice=5) SellingPrice=CostPrice+CostPrice*0.25; printf(“ Selling Price(0.25)$%6.2f”,SellingPrice); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 14 页 - - - - - - - - - else SellingPrice=CostPrice+CostPrice*0.30; printf(“ Selling Price(0.30)$%6.2f”,SellingPrice); 3、以下程序的运行结果是。main() if(2*2=55) printf(“ %dn” ,m);else printf(“ %dn” ,m -); A)4 B)5 C)6 D)7 二、根据程序的功能,将以下程序补充完整1、以下程序对输入的四个整数,按从小到大的顺序输出。请在内填入正确内容。main() int t,a,b,c,d; printf(“ input a,b,c,d:”)scanf(“ %d,%d,%d,%d”,); if(ab) if () t=a;a=c;c=t; if (ad) t=a;a=d;d=t; if ( ) t=b;b=c;c=t; if (bd) t=b;b=d;d=t; if (cd) t=c;c=d;d=t; printf(“ %d,%d,%d,%d” ,a,b,c,d); 三、编程:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 14 页 - - - - - - - - - 1、试编程判断输入的正整数是否既是5 又是 7 的整倍数。若是,则输出yes;否则输出no。2、编制程序要求输入整数x、 y 和 z,若 x2+y2+z2大于 1000,则输出 x2+y2+z2千位以上的数字,否则输出三数之和。3、编写程序,输入三角型的三条边长,求其面积。注意:对于不合理的边长输入要输出数据错误的提示信息。第 2 讲知识归纳:1、if 语句的第三种形式:if ( 条件 1 ) 语句 1 else if ( 条件 2 ) 语句 2 else if ( 条件 3 ) 语句 3 else 语句n2、if 语句的嵌套:(1) 三种 if 语句可以互相嵌套,应当注意的是,else 总是与他上面最近的if 配对。(2) 如果 if 与 else 的数目不一样, 为实现程序设计者的企图,可以加 括起来确定配对关系;3、条件运算符:(1) 格式:表达式 1 ?表达式2 :表达式3 (2) 条件运算符的结合方向为“ 自右至左 ” ;如: ab?a:cd?c:d; /先算出 cd?c:d ,用它的结果,作为表达式3,参与前面的运算4、switch语句:格式: switch ( 表达式) case 常量表达式1 : 语句1 case 常量表达式2 : 语句2 .case 常量表达式n : 语句n default: 语句n+1 /default 可有可无; (1) switch 后,表达式 的类型常用int ,char , case后的常量表达式类型一定与表达式类型匹配;(2) case后常量表达式的值必须互不相同;(3) case和 default 出现次序不影响执行结果;(4) case语句后如没有break,顺序向下执行。切记!名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 14 页 - - - - - - - - - 基础练习 (A) 一、填空题1、在 if 语句中又包含一个或多个if 语句称为。2、为了避免在嵌套的条件语句if-else 中产生二义性,C 语言规定: else子句总是与配对。如果 if 与 else 数目不一样,为实现设计者的企图,可以加来确定配对关系。3、条件运算符是C 语言中唯一的一个目运算符,其结合性为。4、假设条件表达式的格式为:表达式1?表达式2:表达式若表达式2 和表达式 3 的类型不同,此时条件表达式的值的类型为二者中较的类型5、在 switch 语句中, switch 后面括弧内的 “ 表达式 ” ,可以为类型。6、若 a=1,b=2,则表达式ab?a:b+1 的值是。7、若 w1、x2、 y3、z4,则条件表达式wx?w:yz?y:z 的值是。8、若有以下if 语句: if (ab) min=a; else min=b; 可用条件运算符来处理的等价式子为。9、若 x=1,y=2,z=3 ,则表达式 (xb) c=1; else if(a=b) c=0; else c=-1; printf(“ %dn” ,c);2、 main() int a,b,c; int s,w,t; s=w=t=0; a=-1; b=3; c=3; if(c0) s=a+b; if(a0) if(c0) w=a-b; else t=c; printf(“ %d %d %d” ,s,w,t); 3、 switch(grade) case A : printf(“ 85n” );case B : printf(“ 70n” );case C : printf(“ 60n” );名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 14 页 - - - - - - - - - case D : printf(“ 60n” );default: printf(“ error!n” ); 若 grade 的值为 C,则输出结果是能力提高 (B) 一、写出下列程序的运行结果1、 #include void main(void) int x,y=1,z; if(y!=0) x=5; printf(“ n” ,x);if(y=0) x=4; else x=5; printf(“ n” ,x);x=1; if(y0) x=4; else x=5; printf(“ n” ,x);2、 #include void main(void) int x,y=-2,z; if(z=y)0) x=4; else if(y=0) x=5; else x=6; printf(”n” ,x,z);if(z=(y=0) x=5; x=4; printf(“n” ,x,z);if(x=z=y) x=4; printf(“n” ,x,z);3、 #include 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; printf(“ a=%d,b=%d” ,a,b);二、根据程序的功能,将以下程序补充完整以下程序计算某年某月有几天。其中判别闰年的条件是:能被 4 整除但不能被100 整除的年是闰年,能被400 整除的年也是闰年。请在内填入正确内容。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 14 页 - - - - - - - - - main() int yy,mm,len; printf(“ year,month=” );scanf(“ %d %d” ,&yy,&mm);switch(mm) case 1: case 3: case 5: case 7: case 8: case 10: case 12: ; break; case 4: case 6: case 9: case 11: len=30; break; case 2: if(yy%4=0&yy%100!=0|yy%400=0); else; break; default: printf(“ input error”); break; printf(“ the length of %d %d is n”,yy,mm,len); 三、将以下程序段改用嵌套的if 语句实现。int s,t,m; t=(int)(s/10); switch(t) case 10: m=5; break; case 9: m=4; break; case 8: m=3; break; case 7: m=2; break; case 6: m=1; break; default: m=0; 四、编程:1、已知银行整存整取存款不同期限的月息利率分别为:0.315%期限一年0.330%期限二年月息利率 0.345% 期限三年0.375%期限五年0.420%期限八年要求输入存钱的本金和期限,求到期时能从银行得到的利息与本金的合计。2、编写一个简单计算器程序,输入格式为:data1 op data2。其中 data1 和 data2 是参加运算的两个数,op 为运算符,它的取值只能是+、-、*、/。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 14 页 - - - - - - - - - 3、 编写程序, 输入一位学生的生日(年: y0、月:m0、日:d0); 并输入当前的日期(年:y1、月: m1、日: d1);输出该生的实足年龄。链接二级考试一、一、选择题1、当 a=1,b=3,c=5,d=5 时,执行下面一段程序后,x 的值为() 。A) 1 B) 2 C) 3 D) 6 if(ab) if(cd) x=1; else if(ac) if(bb)&(n=cd)后,n 的值为() 。A) 1 B) 2 C) 3 D) 0 3、在执行以下程序时,为了使输出结果为:t=4,则给 a 和 b 输入的值应满足的条件是() 。A) ab B) ab0 C) 0aab main() int s,t,a,b; scanf(%d,%d,&a,&b); s=1; t=1; if(a0)s=s+1; if(ab)t=s+t; else if(a=b) t=5; else t=2*s; printf(t=%dn,t); (1999 年 4 月)4、语句 :printf(%d ,(a=2)&(b=-2) ;的输出结果是() 。A) 无输出B) 结果不确定C) -1 D) 1 5、当 c 的值不为0 时,在下列选项中能正确将c 的值赋给变量a、b 的是() 。A) c=b=a ; B) (a=c) (b=c) ;C) (a=c) &(b=c) ; D) a=c=b ;6、能正确表示a 和 b 同时为正或同时为负的逻辑表达式是() 。A) (a=0 b=0)&(a0 b=0&b=0)&(a0&b0)&(a+b0 7、以下程序的输出结果是() 。A) -1 1 B) 0 1 C) 1 0 D) 0 0 main( ) int a= -1 ,b=1,k;if(+a0)& ! (b- 0?1:x0) y=1; B) if(x) else if(x0)y=1; else y=0; else if(x=0) if(x0)y=1; if(x0)y=1; else if(x=0)y=0; else y=-1; else y=-1; 10、若有定义 : float w; int a, b; 则合法的 switch 语句是() 。A) switch(w) B) switch(a); case 1.0: printf(*n); case 1 printf(*n); case 2.0: printf(*n); case 2 printf(*n); C) switch(b) D) switch(a+b); case 1: printf(*n) ; case 1: printf(*n); default: printf(n); case 2: printf(*n); case 1+2: printf(*n); default: printf(n); 11、有如下程序:main() int x=1,a=0,b=0; switch(x) case 0: b+; case 1: a+; case 2: a+;b+; printf(“ a=%d,b=%dn” ,a,b); 该程序的输出结果是() 。A) a=2,b=1 B) a=1,b=1 C) a=1,b=0 D) a=2,b=2 12、有如下程序main() float x=2.0,y; if(x0.0) y=0.0; else if(x10.0) y=1.0/x; else y=1.0; printf(“ %fn” ,y); 该程序的输出结果是()A) 0.000000 B) 0.250000 C) 0.500000 D) 1.000000 13、有如下程序main() int a=2,b=-1,c=2; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 14 页 - - - - - - - - - if(ab) if(b0) c=0; else c+ printf(“ %dn” ,c); 该程序的输出结果是()A) 0 B) 1 C) 2 D) 3 14、有如下程序段int a=14,b=15,x; char c= A;x=(a&b)&(c B );执行该程序段后,x 的值为() 。A) ture B) false C) 0 D) 1 15、设 x、y、 t 均为 int 型变量,则执行语句:x=y=3;t=+x|+y; 后, y 的值为() 。A) 不定值B) 4 C) 3 D) 1 16、若执行以下程序时从键盘上输入9,则输出结果是() 。A) 11 B) 10 C) 9 D) 8 Main0 int n; scanf(“ %d ” ,&n);if(n+10) printf(“ %dn” ,n);else printf(“ %dn” ,n -); 17、若 a、b、c1、c2、x、 y、均是整型变量,正确的switch 语句是() 。A) swich(a+b); B) switch(a*a+b*b) case 1:y=a+b; break; case 3: case 0:y=a-b; break; case 1:y=a+b;break; case 3:y=b-a,break; C) switch a D) switch(a-b) case c1 :y=a-b; break default:y=a*b;break case c2: x=a*d; break case 3:case 4:x=a+b;break default:x=a+b; case 10:case 11:y=a-b;break; 18、若变量c 为 char 类型,能正确判断出c 为小写字母的表达式是() 。A) a =c= a )|(c= z)C) ( a =c) D) (c= a )&(c= z)(2001 年 4 月)19、假定 w、x、y、 z、m 均为 int 型变量,有如下程序段:w=1; x=2; y=3; z=4; m=(wx)?w:x; m=(my)?m:y; m=(mb?(ac?a:c):(b); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 14 页 - - - - - - - - - A) 5 B) 4 C) 6 D) 不确定21、以下程序的输出结果是() 。main() int a=4,b=5,c=0,d; d=!a&!b|!c; printf(%dn,d); A) 1 B) 0 C) 非 0 的数 D)-1 22、已有定义 :int x=3,y=4,z=5 ; ,则表达式 !(x+y)+z-1 & y+z/2的值是() 。A) B) C)D) 23、有一函数,0 x0 x0 x101y,以下程序段中不能根据值正确计算出值的是() 。A) if(x0) y=1; B) y=0; else if(x=0) y=0; if(x0) y=1; else y=-1; else if(x=0) if(x=0); if(x0) y=1; if(x0) y=1; else y=0; else y=-1; else y=-1; (2002 年 9 月)24、有以下程序main() int a=15,b=21,m=0; switch(a%3) case 0:m+;break; case 1:m+; switch(b%2) default:m+; case 0:m+;break; printf(“ %dn” ,m); 程序运行后的输出结果是() 。A) 1 B) 2 C) 3 D) 4 25、 C 语言中用于结构化程序设计的三种基本结构是() 。A) 顺序结构、选择结构、循环结构B) if 、switch、break C) for 、while 、do-while D) if 、for、continue 26、有以下程序main() int i=1,j=1,k=2; if(j+ k+)&i+) printf(%d,%d,%d n,i,j,k); 执行后输出结果是() 。A) 1, 1,2 B) 2,2,1 C) 2,2,2 D) 2,2,3 27、有以下程序main() int a=5,b=4,c=3,d=2; if(abc) printf(%dn,d); else if(c-1=d)=1) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 14 页 - - - - - - - - - printf(%dn,d+1); else printf(%dn,d+2) 执行后输出结果是() 。A) 2 B) 3 C) 4 D)编译时有错,无结果28、以下选项中非法的表达式是() 。A) 0=xa)|(m=ab); printf(%d,%dn,k,m); 程序运行后的输出结果是() 。A) 0,0 B) 0,1 C) 1,0 D) 1,1 30、有定义语句: int a=1,b=2,c=3,x; 则以下选项中各程序段执行后,x 的值不为3 的是( ) 。A) if(ca) x=1; B) if(a3) x=3; else if(ba) x=2; else if (a2) x=2; else x=3; else x=1; C) if(a3) x=3; D) if(ab) x=b; if(a2) x=2; if(bc) x=c; if(a1) x=1; if(ca) x=a; 二、填空题1、条件 “ 20 x30 或 x50) printf(%d,a); if(a40) printf(%d,a); if(a30) printf(%d,a); 7、以下程序输出的结果是_。main() int a=5,b=4,c=3,d; d=(abc); printf(%dn,d); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 14 页 - - - - - - - - - (2002 年 4 月)8、以下程序运行后的输出结果是_。main() int x=10,y=20,t=0; if(x=y)t=x;x=y;y=t; printf(“ %d,%d n” ,x,y); 9、若有以下程序main() int p,a=5; if(p=a!=0) printf(%dn,p); else printf(%dn,p+2); 执行后输出结果是_。10、若有以下程序main() int a=4,b=3,c=5,t=0; if(ab)t=a;a=b;b=t; if(a0 ? p/10:p%3); 12、以下程序运行后的输出结果是_。main() int a=1, b=3, c=5; if (c=a+b) printf(yesn); else printf(non); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 14 页 - - - - - - - - -