C语言程序设计 习题参考解答
第一章 C语言概述
1.1、CDCCC
1.2、编程题
(1)解:
main()
{
printf(" * * * * * * * * * * \n");
printf("\n");
printf(" Very Good! \n");
printf("\n");
printf(" * * * * * * * * * * \n");
}
运行结果:
* * * * * * * * * *
Very Good!
* * * * * * * * *
(2) (略)
1.3 (略)
1.4 (略)
1.5 (略)
Menu
C语言程序设计 习题参考解答
第二章 基本数据类型和表达式
2.1、BABAB DDABD CCDAC ABADD DCBB
2.2 (略)
2.3 (略)
2.4 (略)
Menu
C语言程序设计 习题参考解答
第三章 控制流
3.1
解:
main()
{
float c,f;
printf("请输入一个华氏温度:\n");
scanf("%f",&f);
c=(5.0/9.0)*(f-32); //注意5和9要用实型表示,否则5/9值为零
printf("摄氏温度为:%5.2f\n",c);
}
运行结果:
请输入一个华氏温度:
78
摄氏温度为:25.56
3.2
解:
main()
{ int x,y;
printf(" 输入 x:");
scanf("%d",&x);
if(x<1)
{
y=x;
printf(" X=%d,Y=X=%d \n",x,y);
}
else if(x<10)
{
y=2*x-1;
printf(" X=%d,Y=2*X-1=%d \n",x,y);
}
else
{
y=3*x-11;
printf(" X=%d,Y=3*x-11=%d \n",x,y);
}
}
运行结果:
1:输入 X:4
X=4,Y=2*X-1=7
2:输入 X:-1
X=-1,Y=X=-1
3:输入 X:20
X=20,Y=3*x-11=49
3.3
解:
main()
{
int t,a,b,c,d;
printf("请输入四个数:");
scanf("%d,%d,%d,%d",&a,&b,&c,&d);
printf("\n\n a=%d,b=%d,c=%d,d=%d\n",a,b,c,d);
if(a>b)
{t=a;a=b;b=t;}
if(a>c)
{t=a;a=c;c=t;}
if(b>c)
{t=b;b=b;b=t;}
if(b>d)
{t=b;b=d;d=t;}
if(c>d)
{t=c;c=d;d=t;}
printf("\n排序后的结果如下:\n");
printf(" %d %d %d %d \n",a,b,c,d);
}
3.4
实际上应该有以下几种可能:
(1) (1) a=0,不是二次方程。
(2) (2) b^2-4ac=0,有两个相等实根。
(3) (3) b^2-4ac>0,有两个不等实根。
(4) (4) b^2-4ac<0,有两个共轭复根。
据此编写程序如下:
#include
main()
{ float a,b,c,d,disc,x1,x2,realpart,imagpart;
scanf
(“%f,%f,%f”,&a,&b,&c);
printf(“The equation”);
if (fabs(a)<=le-6)
printf(“is not a quadratic”);
else
disc=b*b-4*a*c;
if (fabs(disc)<=le-6)
printf(“has two equal roots:%8.4f\n”,-b/(2*a));
else if (disc)>le-6
{x1=(-b+sqrt(disc))/2*a;
x2=(-b-sqrt(disc))/2*a;
printf(“has distinct real roots: %8.4f and %8.4f\n”,x1,x2);
}
else
{realpart=-b/(2*a);
imagpart=sqrt(-disc)/(2*a);
printf(“has complex roots:\n”);
printf(“%8.4f+%8.4fi\n”,realpart,imagpart);
printf(“%8.4f-%8.4fi\n”,realpart,imagpart);
}
}
程序中用disc代表b^2-4ac,先计算disc的值,以减少以后的重复计算。对于判断b^2-4ac是否等于0时,要注意一个问题:由于disc(即b^2-4ac)是实数,而实数在计算和存储时会有一些微小的误差,因此不能直接进行如下判断:if
(disc==0)……
因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于零而导致结果错误。所以采取的办法是判别disc的绝对值(abs(disc))是否小于一个很小的数(例如10^-6),如果小于此数,就认为disc=0。程序中以realpart代表实部p,以imagpart代表虚部q,以增加可读性。
3.5
分析此问题,折扣的变化是有规律的:折扣的“变化点”都是250的倍数(250,500,1000,2000,3000)。利用这一特点,
可以在横轴上加一种坐标c,c的值为s/250。C代表250的倍数。当c<1时,表示s<250,无折扣;1<=
c<=
2时,表示250<=s<500,折扣d=2%;2<=c<4时,d=5%;4<=c<8时,d=8%;8<=c<12时,d=10%;c>12时,d=15%;
据此写出程序如下:
main()
{
int c,s;
float p,w,d,f;
scanf(“%f,%f,%d”,&p,&w,&s);
if (s>=3000) c=12;
else c=s/250;
switch(c)
{
case 0:d=0;break;
case 1:d=2;break;
case 2:
case 3:d=5;break;
case 4:
case 5:
case 6:
case 7:d=8;break;
case 8:
case 9:
case 10:
case 11:d=10;break;
case 12:d=15;break;
}
f=p*w*s*(1-d/100.0);
printf(“freight=%15.4f”,f);
}
运行情况如下:
100,20,300
freight=588000.0000
请注意:c、s是整型变量,因此c=s/250为整数。当s>=3000时,令c=12,而不使c随s增大,这是为了在switch语句中便于处理,用一个case可以处理所有s>=3000的情况。
3.6 (略)
3.7
解:
main()
{
int n,t,number=20;
float a=2,b=1,s=0;
for(n=1;n<=number;n++)
{
s=s+a/b;
t=a;a=a+b;b=t;
}
printf("总和=%9.6f\n",s);
}
3.8 (略)
3.9
解:
main()
{
int i,j,k,n;
printf("水仙花数是:");
for(n=100;n<1000;n++)
{
i=n/100;
j=n/10-i*10;
k=n%10;
if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)
{
printf("\n%d",n);
}
}
}
3.10
解:
main()
{
int day,x1,x2;
day=9;
x2=1;
while(day>0)
{
x1=(x2+1)*2;
x2=x1;
day--;
}
printf("桃子总数=%d\n",x1);
}
3.11
解:
main()
{
float sn=100.0,hn=sn/2;
int n;
for(n=2;n<=10;n++)
{
sn=sn+2*hn;
hn=hn/2;
}
printf(“第十次落地是共经过的米数为:%f”,sn);
printf(“第十次反弹%f米\n”,hn);
}
3.12
解:
#include
main()
{
float x,x0,f,f1;
x=1.5;
do
{
x0=x;
f=((2*x0-4)*x0+3)*x0-6;
f1=(6*x0-8)*x0+3;
x=x0-f/f1;
}
while(fabs(x-x0)>=1e-5);
printf("方程的根=%6.2f\n",x);
}
3.13
解:
#include
main()
{
float x0,x1,x2,fx0,fx1,fx2;
do
{
printf("请输入x1,x2的值:\n");
scanf("%f,%f",&x1,&x2);
fx1=x1*((2*x1-4)*x1+3)-6;
fx2=x2*((2*x2-4)*x2+3)-6;
}
while(fx1*fx2>0);
do
{
x0=(x1+x2)/2;
fx0=x0*((2*x0-4)*x0+3)-6;
if((fx0*fx1)<0)
{
x2=x0;
fx2=fx0;
}
else
{
x1=x0;
fx1=fx0;
}
}
while(fabs(fx0)>=1e-5);
printf("方程的根是%6.2f\n",x0);
}
3.14
解:
#include
main()
{
int i,j,k;
for(i=0;i<=3;i++)
{
for(j=0;j<=2-i;j++)
printf(" ");
for(k=0;k<=2*i;k++)
printf("*");
printf("\n");
}
for(i=0;i<=2;i++)
{
for(j=0;j<=i;j++)
printf(" ");
for(k=0;k<=4-2*i;k++)
printf("*");
printf("\n");
}
}
3.15
解:
main()
{
char i,j,k;
for(i='x';i<='z';i++)
for(j='x';j<='z';j++)
{
if(i!=j)
for(k='x';k<='z';k++)
{
if(i!=k&&j!=k)
{
if(i!='x'&&k!='x'&&k!='z')
printf("顺序为:\na--%c\tb--%c\tc--%c\n",i,j,k);
}
}
}
}
运行结果:
顺序为:
a—z b—x c—y
Menu