admin 管理员组文章数量: 1086019
2024年4月26日发(作者:压力容器是怎么分类的)
第5章 选择结构程序设计
5-1 比较单分支、双分支、多分支if语句。
答:(1)多分支if语句可用多条单分支、双分支if语句等价实现。
(2)双分支if语句形式上相当于单分支if语句扩展else分支而来。
(3)单分支if语句可以认为是双分支if语句缺省else子句的特殊情
况,一条双分支语句可用两条单分支语句实现。
思考:分支结构主要用在哪些情况下?它有哪几种形式?
5-2
1x0
y
0x0
, 下列描述哪些是正确的?
x0
1
(1) if (x<0)y=−1;
else if(x==0) y=0;
else y=1;
(2)if(x>=0)
if(x>0) y = 1 ;
else y = 0 ;
else y = -1 ;
(3) y = -1 ;
if(x!=0)
if(x>0) y = 1 ;
else y = 0 ;
(4)y = 0 ;
if (x>=0)
if(x>0) y = 1 ;
答:(1) 正确 ; (2) 正确 ;(3) 不正确 ;(4) 不正确 ;
思考 : 若将(3)改为: y = -1 ; (4) 改为:y = 0 ;
if(x>=0) /*删除原if(x>=0)*/
if(x>0) y =1 ; if(x>0) y = 1 ;
else y = 0 ; else y = -1 ;
后是否正确 ?
5-3 仔细阅读以下程序 , 指出程序的运行结果 .
#include
main()
{ int a , b ;
a = b = 5 ;
if(a==1)
if(b==5)
{a+=b ;
printf("a=%dn ",a) ;
}
else
{a-=b ;
printf("a=%dn",a) ;
}
printf("a+b=%d",a+b) ;
}
解 : 结果为 : a + b = 10
思考: 为何有三个printf 语句 ,却只有一行输出
5行去掉或改为if(a==5) , 结果是否一样 ?
5-3仔细阅读以下程序 ,指出程序的运行结果 。
解: #include
main()
{ int i =1 , j = 0 ,m = 1 ,n =2 ;
switch(i++)
{case 1 : m++ ;n++ ;
case 2 : switch(++j)
{case 1 : m++ ;
case 2 : n++ ;
}
case 3 : m++ ;n++ ;
break ;
case 4 :m++ ;n++ ;
}
printf("m=%d,n=%d" , m ,n) ;
}
如果将第 ?
解 : 结果为 : m =4 ,n = 5
思考:将switch(i++)改为switch(i)结果有何变化?去掉“break:”
语句后,结果有何变化?
5-5 仔细阅读以下程序,指出程序的运行结果 。
#include
main()
{ char ch ;
printf("Enter ch: ") ;
scanf("%c",&ch) ;
switch(ch)
{case 'm' : printf("Good morning !n") ; break ;
case 'n' : printf("Good night!n ") ; break ;
default : printf("I can not understand!n") ; break ;
}
printf("All right!n") ;
}
解 : 当输入m时结果为:
Enter ch : m
Good morning !
All right !
当输入n时结果为:
Enter ch : n
Good night !
All right !
当输入其它字符时结果为:
Enter ch : k
I can not understand !
All right !
思考:当输入大写的M与N时,将会有什么结果?如果希望输入
大写的M,N与输入小写的m、n时结果相同,程序如何修改?
5-6编写程序,求三个数的最小值。进一步考虑求四个数、五个数
及更多的数的最小值及最大值.
解:#include
main()
{
int a1 ,a2 ,a3 ,min ;
scanf("%d,%d,%d",&a1,&a2,&a3) ;
min = a1 ;
if(a2 if(a3 printf("最小值为:%dn",min) ; } 思考:要求出最大值,是否将min改为max就可以了?关键应 改什么地方 ? 5-7 编写程序,解方程ax+b=0 . 解: #include main() { float a,b,x ; scanf("%f,%f",&a,&b) ; if(a==0) if(b==0) printf("x可为任意值!n") ; else printf("无解!n") ; else {x=-b/a ; printf("方程的根为:%fn",x) ; } } 思考 : 此题与习题2-14的程序有何不同之处?具有了什么功 能? 5-8 编写程序,解方程ax2+bx+c=0。要求分别用if语句和switch 语句实现 。 解 : (1) 用if语句实现。 #include #include main() {float a,b,c,d,x,x1,x2 ; printf("请输入方程的三个系数a,b,c :" ) ; scanf("%f,%f,%f",&a,&b ,&c) ; if(a==0) {if(b==0) {if(c==0) printf("x可为任意值!n") ; else printf("无解!n") ; } else {x=-c/b ; printf("方程的根=%fn",x) ; } } else {d=b*b-4*a*c ; if(d>=0) {x1 = (-b+sqrt(d)/(2*a)) ; x2 = (-b-sqrt(d)/(2*a)) ; printf("第一个根=%f ,第二个根=%fn",x1,x2); } else printf("方程无实根!n") ; } } (2) 用switch语句实现 。 #include #include main() {float a,b,c,d,x,x1,x2 ; printf("请输入方程的三个系数a,b,c :" ) ; scanf("%f,%f,%f",&a,&b,&c) ; switch((int) a) //先判断a是否为0 {case 0: //如果a为0 switch((int) b) {case 0: //如果b也为 0 switch((int) c) {case 0: //如果c也为0 printf("x可为任意值!n") ;goto end ; default: printf("无解!n") ; goto end ; } default: x=-c/b ; printf("方程的根为%fn",x) ; goto end ; } default : // 如果a不为 0 { d = b*b-4*a*c ; if(d>=0) { x1 = (-b+sqrt(d)/(2*a)) ; x2 = (-b-sqrt(d)/(2*a)) ; printf( "第一个根=%f ,第二个根=%fn",x1,x2); } else printf("方程无实根!n") ; } } end: printf(“end”); } 思考:if语句与switch语句的嵌套结构与形式有何特点?与单结 构if语句的区别是什么? 5-9 编写程序,判断一个整数是否既是2的倍数、又是3的倍 数。 解 : #include main() {int n ,flag = 0 ; printf("请输入整数:") ; scanf("%d",&n) ; if((n%2==0)&&(n%3==0)) flag = 1 ; if(flag==0) printf("%d不能同时被2和被3整除n",n) ; else printf("%d能同时被2和被3整除n",n) ; } 思考: flag的作用是什么?如果去掉flag,程序应该如何改动? 5-10 编写程序,判断2000年、2008年、2100年是否为闰年。 解:#include main() {int y1 = 2000 ,y2 = 2008 , y3 = 2100 ; if((y1%400==0)||(y1%4==0&&y1%100!=0)) printf("%d年是闰年n",y1) ; else printf("%d年不是闰年n",y1) ; if((y2%400==0)||(y2%4==0&&y2%100!=0)) printf("%d年是闰年n",y2) ; else printf("%d年不是闰年n",y2) ; if((y3%400==0)||(y3%4==0&&y3%100!=0)) printf("%d年是闰年n",y3) ; else printf("%d年不是闰年n",y3); } 思考 : 此题中的几个if结构是什么关系?注意找出其中的不同 之处,你会发现什么? 5-11.编写程序,将五级记分成绩转换成百分制成绩,转换规则 如下: 'A'—95,'B'—85,'C'—75,'D'—65,'E'—55 。 解:#include main() {int s = 0; char c ; printf("请输入五级记分的成绩:") ; scanf("%c",&c) ; switch(c) {case 'A' : case 'a' : s =95 ; break ; case 'B' : case 'b' : s =85 ; break ; case 'C' : case 'c' : s =75 ; break ; case 'D' : case 'd' : s =65 ; break ; case 'E' : case 'e' : s =55 ; break ; default : s = 0 ; } if(s==0) printf("输入错误n"); else printf("五级分制%c对应百分制为%dn",c,s) ; } 思考 : 此题中若去掉所有“break ;”语句,将会出现什么情况? 5-12.有一个不多于5位的正整数,求它的位数,同时求出它的 每位数字。 解 : #include main() {long n ; /*存放整数*/ int a1,a2,a3,a4,a5 ;/*存放各位的数*/ printf("请输入一个正整数(<100000):" ); scanf("%ld",&n) ; a5=n/10000 ; a4=(n-a5*100000)/1000 ; a3=(n-a5*100000-a4*1000)/100 ; a2=(n-a5*100000-a4*1000-a3*100)/10 ; a1=n-a5*100000-a4*1000-a3*100-a2*10 ; if(a5>0) printf(有五位数,分别是%ld,%d,%d,%d,%dn",a5,a4,a3,a2,a1) ; else if(a4>0) printf("有四位数,分别是%d,%d,%d,%dn",a4,a3,a2,a1) ; else if(a3>0) printf("有三位数,分别是%d,%d,%dn",a3,a2,a1) ; else if(a2>0) printf("有二位数,分别是%d,%dn",a2,a1) ; else if(a1>0) printf("有一位数,分别是%dn",a1) ; else printf("输入数据非正整数或为0n") ; } 思考 :如何将一个整数的各位数字进行分离?你还能想出其它 什么办法? 5-13 输入一个字符,编写程序判断该输入字符的种类:数字、 字母或其它。 解 : #include main() {char c ; printf("请输入字符:") ; scanf("%c",&c) ; if((c>= 'a')&&(c<='z')||(c>='A')&&(c<'Z')) printf("字符的种类是:字母n") ; else if(c>='0'&&c<='9') printf("字符的种类是: 数字n") ; else printf("字符的种类是: 其它n") ; } 思考 : 此题中的if与else之间的结构是什么关系 ? 5-14 输入三角形三边,编写程序判断三角形的种类:等腰三角 形、等边三角形或一般三角形 。 解: #include main() {int a,b,c ; printf("请输入三角形的三边值a,b,c:") ; scanf("%d,%d,%d",&a,&b,&c) ; if(a==b&&b==c) printf("等边三角形n") ; else if(a!=b&&a!=c&&b!=c) printf("一般三角形n") ; else printf("等腰三角形n"); } 思考:如果输入的a,b,c三个值不能构成三角形,将如何处理? (在何处添加什么样的语句。) 5-15 编写程序,根据输入的字符输出相应的字串 : 输入字符 输出字串 a或A American b或B Britain c或C China d或D Denmark 其它 Other 解: #include main() {char c ; printf("请输入字符:") ; scanf("%c",&c) ; switch(c) { case 'a': case 'A':printf("Americann") ;break ; case 'b': case 'B':printf("Britain n") ;break ; case 'c': case 'C':printf("China n") ;break ; case 'd': case 'D':printf("Denmark n") ;break ; default : printf("Othern") ; } } 思考 :此题为何不用if语句的结构形式?if语句与switch语句 的区别是什么? 5-16 编写程序,将输入的数字(0-6)转换成对应的星期英文 名称输出 。 解 : #include main() {char c ; printf("请输入数字(0-6):") ; scanf("%c",c) ; switch(c) {case 0 :printf("SUNn") ;break ; case 1 :printf("MONn") ;break ; case 2 :printf("TUEn") ;break ; case 3 :printf("WEDn") ;break ; case 4 :printf("THUn") ;break ; case 5 :printf("FRIn") ;break ; case 6 :printf("SATn") ;break ; default :printf("输入错误n") ; } } 思考 : 此程序中若将“char c ;”改为“int c ;”是否可行 ?switch 的语句的主要特点是什么? 5-17.编写个人所得税计算程序。 解 : 个人所得税的计算办法是以每月收入额减除800元基本费 用后,根据下表采用5%~45%的九级超额累计税率 。 级数 全月应纳税所的额 税率/% 1 不超过800元的 5 2 超过800元至2000元的部分 10 3 超过2000元至5000元的部分 15 4 超过5000元至20000元的部分 20 5 超过20000元至40000元的部分 25 6 超过40000元至60000元的部分 30 7 超过60000元至80000元的部分 35 8 超过80000元至100000元的部分 40 9 超过100000元的部分 45 程序如下 : #include main() { float shouru ,nashui ; printf("请输入你的收入:") ; scanf("%f",&shouru) ;/*计算纳税额*/ shouru-=800 ; if(shouru<=0) nashui = 0 ; else if(shouru<=800) nashui=0.05*shouru ; else if(shouru<=2000) nashui=25+(shouru-800)*0.1 ; else if(shouru<=5000) nashui=175+(shouru-2000)*0.15 ; else if(shouru<=20000) nashui=625+(shouru-5000)*0.2; else if(shouru<=40000) nashui=3625+(shouru-20000)*0.2; else if(shouru<=60000) nashui=8625+(shouru-40000)*0.3; else if(shouru<=80000) nashui=14625+(shouru-60000)*0.35 ; else if(shouru<=100000) nashui=21625+(shouru-80000)*0.4; else nashui=29625+(shouru-100000)*0.45; printf("您应交纳个人所得税为:%8.2fn",nashui) ; printf(“——纳税光荣——!n”); } 5-18 某公司的利润提成方案是:1万元及1万元以下利润提成 5%,2万元及2万元以下利润提成6%,4万元及4万元以下利润提 成7%,5万元及5万元以下利润提成8%,5万元以上利润提成9%。 总提成采用分段累计计算。 张三完成利润10万元,李四完成利润8万元,王五完成利润12 万元。 编写程序,计算张三、王五、李四可获得的利润提成。 解:分析可得出如下的函数关系式: x×5% x≤1万元 500+(x-1) ×6% 1万元<x≤2万元 y = 1100+(x-2) ×7% 2万元<x≤4万元 2500+(x-4) ×8% 4万元<x≤5万元 3300+(x-5) ×9% x>5万元 #include main() {float tc,z3,l4,w5; printf("请输入张三、李四、王五各自完成的利润额:"); scanf("%f,%f,%f",&z3,&l4,&w5); /*计算张三的提成*/ if(z3<=1.0) tc=z3*0.05; else if (z3<=2.0) tc=500+(z3-1)*0.06; else if(z3<=4.0) tc=1100+(z3-2)*0.07; else if(z3<=5.0) tc=2500+(z3-4)*0.08; else tc=3300+(z3-5)*0.09; printf("张三的提成为%8.2fn",tc); /*计算李四的提成*/ if(l4<=1.0) tc=l4*0.05; else if (l4<=2.0) tc=500+(l4-1)*0.06; else if (l4<=4.0) tc=1100+(l4-2)*0.07; else if (l4<=5.0) tc=2500+(l4-4)*0.08; else tc=3300+(l4-5)*0.09; printf("李四的提成为%8.2fn",tc); /*计算王五的提成*/ if(w5<=1.0) tc=w5*0.05; else if (w5<=2.0) tc=500+(w5-1)*0.06; else if (w5<=4.0) tc=1100+(w5-2)*0.07; else if (w5<=5.0) tc=2500+(w5-4)*0.08; else tc=3300+(w5-5)*0.09; printf("王五的提成为%8.2fn",tc); } 思考:此题中为计算张三、李四、王五三个人的利润提成,重复 了相同的计算过程,你对此有何想法?是否会想到循环控制? 5-19 编写电子词典主控程序,假定电子词典具有单词查询、增加 词条、修改词条、删除词条等功能项,每个功能项暂用空语句代替或 用printf()函数输出一些提示信息代替。 解:#include main() { char c; printf("tt电子词典主控程序n"); printf("S-单词查询"); printf("A-增加词条"); printf("M-修改词条"); printf("tttD-删除词条n"); printf("Q-退出程序n"); printf("请选择输入"); scanf("%c",&c); switch(c) { case 's': case 'S': printf("S-单词查询n");break; case 'a': case 'A': printf("A-增加词条n");break; case 'm': case 'M': printf("M-修改词条");break; case 'd': case 'D': printf("D-删除词条n");break; case 'q': case 'Q': printf("Q退出程序n");break; } } 思考:你对if与switch语句的功能与特点是否已经掌握?在程序设 计中还发现哪些问题用现有的方法无法处理或处理起来困难?
版权声明:本文标题:第5章选择结构程序设计习题及答案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1714099690a665650.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论