第五章 选择结构程序设计.docx

上传人:b****5 文档编号:3276113 上传时间:2022-11-21 格式:DOCX 页数:15 大小:24.34KB
下载 相关 举报
第五章 选择结构程序设计.docx_第1页
第1页 / 共15页
第五章 选择结构程序设计.docx_第2页
第2页 / 共15页
第五章 选择结构程序设计.docx_第3页
第3页 / 共15页
第五章 选择结构程序设计.docx_第4页
第4页 / 共15页
第五章 选择结构程序设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

第五章 选择结构程序设计.docx

《第五章 选择结构程序设计.docx》由会员分享,可在线阅读,更多相关《第五章 选择结构程序设计.docx(15页珍藏版)》请在冰豆网上搜索。

第五章 选择结构程序设计.docx

第五章选择结构程序设计

5-2

下列描述哪些是正确的?

(1) if(x<0)y=−1;

elseif(x==0)y=0;

elsey=1;

(2)if(x>=0)

if(x>0)y=1;

elsey=0;

elsey=-1;

(3)y=-1;

if(x!

=0)

if(x>0)y=1;

elsey=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;

elsey=0;elsey=-1;

后是否正确?

5-3仔细阅读以下程序,指出程序的运行结果.

#include

main()

{inta,b;

a=b=5;

if(a==1)

if(b==5)

{a+=b;

printf("a=%d\n",a);

}

else

{a-=b;

printf("a=%d\n",a);

}

printf("a+b=%d",a+b);

}

解:

结果为:

a+b=10

思考:

为何有三个printf语句,却只有一行输出?

如果将第5行去掉或改为if(a==5),结果是否一样?

5-3仔细阅读以下程序,指出程序的运行结果。

解:

#include

main()

{inti=1,j=0,m=1,n=2;

switch(i++)

{case1:

m++;n++;

case2:

switch(++j)

{case1:

m++;

case2:

n++;

}

case3:

m++;n++;

break;

case4:

m++;n++;

}

printf("m=%d,n=%d",m,n);

}

解:

结果为:

m=4,n=5

思考:

将switch(i++)改为switch(i)结果有何变化?

去掉“break:

”语句后,结果有何变化?

5-5仔细阅读以下程序,指出程序的运行结果。

#include

main()

{charch;

printf("Enterch:

");

scanf("%c",&ch);

switch(ch)

{case'm':

printf("Goodmorning!

\n");break;

case'n':

printf("Goodnight!

\n");break;

default:

printf("Icannotunderstand!

\n");break;

}

printf("Allright!

\n");

}

解:

当输入m时结果为:

Enterch:

m

Goodmorning!

Allright!

当输入n时结果为:

Enterch:

n

Goodnight!

Allright!

当输入其它字符时结果为:

Enterch:

k

Icannotunderstand!

Allright!

思考:

当输入大写的M与N时,将会有什么结果?

如果希望输入大写的M,N与输入小写的m、n时结果相同,程序如何修改?

5-6编写程序,求三个数的最小值。

进一步考虑求四个数、五个数及更多的数的最小值及最大值.

#include

main()

{

inta1,a2,a3,min;

scanf("%d,%d,%d",&a1,&a2,&a3);

min=a1;

if(a2

if(a3

printf("最小值为:

%d\n",min);

}

思考:

要求出最大值,是否将min改为n=max就可以了?

关键应改什么地方?

5-7编写程序,解方程ax+b=0.

解:

#include

main()

{floata,b,x;

scanf("%f,%f",&a,&b);

if(a==0)

if(b==0)printf("x可为任意值!

\n");

elseprintf("无解!

\n");

else

{x=-b/a;

printf("方程的根为:

%f\n",x);

}

}

思考:

此题与习题2-14的程序有何不同之处?

具有了什么功能?

5-8编写程序,解方程ax2+bx+c=0。

要求分别用if语句和switch语句实现。

解:

(1)用if语句实现。

#include

#include

main()

{floata,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");

elseprintf("无解!

\n");

}

else

{x=-c/b;

printf("方程的根=%f\n",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,第二个根=%f\n",x1,x2);

}

elseprintf("方程无实根!

\n");

}

}

(2)用switch语句实现。

#include

#include

main()

{floata,b,c,d,x,x1,x2;

printf("请输入方程的三个系数a,b,c:

");

scanf("%f,%f,%f",&a,&b,&c);

switch((int)a)//先判断a是否为0

{case0:

//如果a为0

switch((int)b)

{case0:

//如果b也为0

switch((int)c)

{case0:

//如果c也为0

printf("x可为任意值!

\n");gotoend;

default:

printf("无解!

\n");gotoend;

}

default:

x=-c/b;

printf("方程的根为%f\n",x);gotoend;

}

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,第二个根=%f\n",x1,x2);

}

elseprintf("方程无实根!

\n");

}

}

}

思考:

if语句与switch语句的嵌套结构与形式有何特点?

与单结构if语句的区别是什么?

5-9编写程序,判断一个整数是否既是2的倍数、又是3的倍数。

解:

#include

main()

{intn,flag=0;

printf("请输入整数:

");

scanf("%d",&n);

if((n%2==0)&&(n%3==0))flag=1;

if(flag==0)printf("%d不能同时被2和被3整除\n",n);

elseprintf("%d能同时被2和被3整除\n",n);

}

思考:

flag的作用是什么?

如果去掉flag,程序应该如何改动?

5-10.编写程序,判断2000年、2008年、2100年是否为闰年。

解:

#include

main()

{inty1=2000,y2=2008,y3=2100;

if((y1%400==0)||(y1%4==0&&y1%100!

=0))

printf("%d年是闰年\n",y1);

elseprintf("%d年不是闰年\n",y1);

if((y2%400==0)||(y2%4==0&&y2%100!

=0))

printf("%d年是闰年\n",y2);

elseprintf("%d年不是闰年\n",y2);

if((y3%400==0)||(y3%4==0&&y3%100!

=0))

printf("%d年是闰年\n",y3);

elseprintf("%d年不是闰年\n",y3);

}

思考:

此题中的几个if结构是什么关系?

注意找出其中的不同之处,你会发现什么?

5-11.编写程序,将五级记分成绩转换成百分制成绩,转换规则如下:

'A'—95,'B'—85,'C'—75,'D'—65,'E'—55。

解:

#include

main()

{ints=0;

charc;

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");

elseprintf("五级分制%c对应百分制为%d\n",c,s);

}

思考:

此题中若去掉所有“break;”语句,将会出现什么情况?

5-12.有一个不多于5位的正整数,求它的位数,同时求出它的每位数字。

解:

#include

main()

{longn;/*存放整数*/

inta1,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,%d\n",a5,a4,a3,a2,a1);

elseif(a4>0)printf("有四位数,分别是%d,%d,%d,%d\n",a4,a3,a2,a1);

elseif(a3>0)printf("有三位数,分别是%d,%d,%d\n",a3,a2,a1);

elseif(a2>0)printf("有二位数,分别是%d,%d\n",a2,a1);

elseif(a1>0)printf("有一位数,分别是%d\n",a1);

elseprintf("输入数据非正整数或为0\n");

}

思考:

如何将一个整数的各位数字进行分离?

你还能想出其它什么办法?

5-13输入一个字符,编写程序判断该输入字符的种类:

数字、字母或其它。

解:

#include

main()

{charc;

printf("请输入字符:

");

scanf("%c",&c);

if((c>='a')&&(c<='z')||(c>='A')&&(c<'Z'))

printf("字符的种类是:

字母\n");

elseif(c>='0'&&c<='9')

printf("字符的种类是:

数字\n");

elseprintf("字符的种类是:

其它\n");

}

思考:

此题中的if与else之间的结构是什么关系?

5-14输入三角形三边,编写程序判断三角形的种类:

等腰三角形、等边三角形或一般三角形。

解:

#include

main()

{inta,b,c;

printf("请输入三角形的三边值a,b,c:

");

scanf("%d,%d,%d",&a,&b,&c);

if(a==b&&b==c)printf("等边三角形\n");

elseif(a!

=b&&a!

=c&&b!

=c)

printf("一般三角形\n");

elseprintf("等腰三角形\n");

}

思考:

如果输入的a,b,c三个值不能构成三角形,将如何处理?

(在何处添加什么样的语句。

5-15编写程序,根据输入的字符输出相应的字串:

输入字符输出字串

a或AAmerican

b或BBritain

c或CChina

d或DDenmark

其它Other

解:

#include

main()

{charc;

printf("请输入字符:

");

scanf("%c",&c);

switch(c)

{case'a':

case'A':

printf("American\n");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("Other\n");

}

}

思考:

此题为何不用if语句的机构形式?

if语句与switch语句的区别是什么?

5-16编写程序,将输入的数字(0-6)转换成对应的星期英文名称输出。

解:

#include

main()

{charc;

printf("请输入数字(0-6):

");

scanf("%c",c);

switch(c)

{case0:

printf("SUN\n");break;

case1:

printf("MON\n");break;

case2:

printf("TUE\n");break;

case3:

printf("WED\n");break;

case4:

printf("THU\n");break;

case5:

printf("FRI\n");break;

case6:

printf("SAT\n");break;

default:

printf("输入错误\n");

}

}

思考:

此程序中若将“charc;”改为“intc;”是否可行?

switch的语句的主要特点是什么?

5-17.编写个人所得税计算程序。

解:

个人所得税的计算办法是以每月收入额减除800元基本费用后,根据下表采用5%--45%的九级超额累计税率。

级数全月应纳税所的额税率/%

1不超过800元的5

2超过800元至2000元的部分10

3超过2000元至5000元的部分15

4超过5000元至20000元的部分20

5超过20000元至40000元的部分20

6超过40000元至60000元的部分20

7超过60000元至80000元的部分20

8超过80000元至100000元的部分20

9超过100000元的部分20

程序如下:

#include

main()

{floatshouru,nashui;

printf("请输入你的收入:

");

scanf("%f",&shouru);/*计算纳税额*/

shouru-=800;

if(shouru<=0)nashui=0;

elseif(shouru<=800)nashui=0.05*shouru;

elseif(shouru<=2000)nashui=25+(shouru-800)*0.1;

elseif(shouru<=5000)nashui=175+(shouru-2000)*0.15;

elseif(shouru<=20000)nashui=625+(shouru-5000)*0.2;

elseif(shouru<=40000)nashui=625+(shouru-20000)*0.2;

elseif(shouru<=60000)nashui=8625+(shouru-40000)*0.3;

elseif(shouru<=80000)nashui=14625+(shouru-60000)*0.35;

elseif(shouru<=100000)nashui=21625+(shouru-80000)*0.4;

printf("纳税额为:

%f\n",nashui);

}

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()

{floattc,z3,l4,w5;

printf("请输入张三、李四、王五各自完成的利润额:

");

scanf("%f,%f,%f",&z3,&l4,&w5);

/*计算张三的提成*/

if(z3<=1.0)tc=z3*0.05;

elseif(z3<=2.0)tc=500+(z3-1)*0.06;

elseif(z3<=4.0)tc=1100+(z3-2)*0.07;

elseif(z3<=5.0)tc=2500+(z3-4)*0.08;

elsetc=3300+(z3-5)*0.09;

printf("张三的提成为%8.2f\n",tc);

/*计算李四的提成*/

if(l4<=1.0)tc=l4*0.05;

elseif(l4<=2.0)tc=500+(l4-1)*0.06;

elseif(l4<=4.0)tc=1100+(l4-2)*0.07;

elseif(l4<=5.0)tc=2500+(l4-4)*0.08;

elsetc=3300+(l4-5)*0.09;

printf("李四的提成为%8.2f\n",tc);

/*计算王五的提成*/

if(w5<=1.0)tc=w5*0.05;

elseif(w5<=2.0)tc=500+(w5-1)*0.06;

elseif(w5<=4.0)tc=1100+(w5-2)*0.07;

elseif(w5<=5.0)tc=2500+(w5-4)*0.08;

elsetc=3300+(w5-5)*0.09;

printf("王五的提成为%8.2f\n",tc);

}

思考:

此题中为计算张三、李四、王五三个人的利润提成,重复了相同的计算过程,你对此有何想法?

是否会想到循环控制?

5-19编写电子词典主控程序,假定电子词典具有单词查询、增加词条、修改词条、删除词条等功能项,每个功能项暂用空语句代替或用printf()函数输出一些提示信息代替。

   解:

#include

main()

{charc;

printf("\t\t电子词典主控程序\n");

printf("S-单词查询");

printf("A-增加词条");

printf("M-修改词条");

printf("\t\t\tD-删除词条\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语句的功能与特点是否已经掌握?

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 英语

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1