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语句的功能与特点是否已经掌握?
在程序设计中还发现哪些问题用现有的方法无法处理或处理起来困难?