admin 管理员组

文章数量: 1086019


2024年4月26日发(作者:压力容器是怎么分类的)

第5章 选择结构程序设计

5-1 比较单分支、双分支、多分支if语句。

答:(1)多分支if语句可用多条单分支、双分支if语句等价实现。

(2)双分支if语句形式上相当于单分支if语句扩展else分支而来。

(3)单分支if语句可以认为是双分支if语句缺省else子句的特殊情

况,一条双分支语句可用两条单分支语句实现。

思考:分支结构主要用在哪些情况下?它有哪几种形式?

5-2

1x0

y

0x0

, 下列描述哪些是正确的?

x0

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语句的功能与特点是否已经掌握?在程序设

计中还发现哪些问题用现有的方法无法处理或处理起来困难?


本文标签: 输入 语句 程序 分支