第5章作业答案DOC.docx
《第5章作业答案DOC.docx》由会员分享,可在线阅读,更多相关《第5章作业答案DOC.docx(27页珍藏版)》请在冰点文库上搜索。
![第5章作业答案DOC.docx](https://file1.bingdoc.com/fileroot1/2023-6/6/efc6b092-6ba0-41ae-aaf1-aea8d17a1e1e/efc6b092-6ba0-41ae-aaf1-aea8d17a1e1e1.gif)
第5章作业答案DOC
[5-1]编写程序,输入某种功课的若干个同学的成绩,以-1作为终止的特殊成绩,计算平均成绩并输出.
[解]
#include“stdio.h”
voidmain()
{
inti,score;
floatsum;
i=0;
printf(“enterscoreendwith-1:
”);
scanf(“%d”,&score);
while(score!
=-1)
{i=i+1;
sum=sum+score;
scanf(“%d”,&sore);
}
printf(“averscoreis%f”,sum/i);
}
程序运行时,首先显示enterscoreendwith-1:
如果用户输入:
98998786-1
则运行结果为:
啊上十92.500000
[5-2]编写程序计算如果每年按照年利率I(例如2%)投资S(例如50000元),在第Y(例如10)年得到的总钱数M。
公式:
M=S*(1+I)y
[解]
#Include“stdio.h”
Voidmain()
{
floatI,s,m;
inty;
printf(“Enterdata:
”);
scanf(“%f%f%d”,&I,&s,&y);
m=s;
while(y>=1)
{m=m*(1+i);
y--;
}
printf(“Thereare%10.2fyuan”,m);
}
程序运行时,首先显示Enterdata:
如果用户输入:
0.025000010
则运行结果为:
Thereare59754.63yuan
[5-3]编写程序,用循环语句输入下列图形。
ABCDEFGHIJKLM*NOPQRSTUVWXYZ
BCDEFGHIJKLM*NOPQRSTUVWXY
CDEFGHIJKLM*NOPQRSTUVMX
DEFGHIJKLM*NOPQRSTUVM
EFGHIJKLM*NOPQRSTUV
FGHIJKLM*NOPQRSTU
GHIJKLM*NOPQRST
HIJKLM*NOPQRS
IJKLM*NOPQR
JKLM*NOPQ
KLM*NOP
LM*NO
M*N
*
[解]
#include“stdio.h”
Voidmain()
{
intI,j;charc;
for(i=0,i<=13;i++)
{
for(j=0;j
putchar(‘’);
for(c=‘A’+i;c<=‘M’;c++)
putchar(c);
putchar(‘*’);
for(c=‘N’;c<=‘Z’-i;c++)
putchar(c);
putchar(‘\n’);
}
}
程序运行时,将按题目要求显示图形。
[5-4]编写程序,输出九九乘法表。
1*1=11*2=21*3=31*4=41*5=51*6=61*7=71*8=81*9=9
2*1=22*2=42*3=62*4=82*5=102*6=122*7=142*8=162*9=18
……….
[解]
#include“stdio.h”
Voidmain()
{
inti,j;
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
printf(“%d+%d=%2d”,i,j,i*j);
printf(“\n”);
}
}
程序运行时,将按题目要求显示九九表。
[5-5]编写程序,输入一组字符(以#号结尾),对该组字符做一个统计,统计字母、数字和其他字符的个数,输出统计结果。
[解]
#include“stdio.h”
Voidmain()
{
charc;
intcount_char,count_digital,count_other;
count_char=count_digital=count_other=0;
c=getchar();
while(c!
=‘#’)
{
if(c>=‘a’&&c<=‘z’∣∣c>=‘A’&&c<=‘Z’)
count_char++;
elseif(c>=‘0’&&c<=‘9’)
count_digital++;
else
count_other++;
c=getchar();
}
printf(“\nchar:
%d,digital:
%d,others:
%d\n”,count_char,count_digital,count_other);
}
程序运行时,
如果用户输入:
Thereare30studentsintheclassroom
则运行结果为:
char:
30,digital:
2,others:
7
[5-6]编写程序通过计算100个矩形的面积得到函数f(x)的数值积分。
f(x)=(x+x2,其中0≤x≤b。
[解]
#definef(x)((x)*(x)+(x))
#include“stdio.h”
voidmain()
{
Doublea,b,h,x,sum;
inti;
a=0;
b=0;
h=(b-a)/100;
sum=0;
for(i=0;i<100;i++)
{
x=a+i*h;
sum=sum+h*f(x);
}
printf(“\nsumofareais%lf”,sum);
}
程序运行结果:
Sumofareais4.066800
[说明]
本题的循环是比较简单的,是循环100次,框图在此略去。
主要是要计算在区间(a,b)之间的100个小矩形的面积,这100个小矩形的宽是(b-a)/100,高是f(x),x的值在区间(a,b)中,第一个x的值是a+1*h,第二个x值是a+2*h,依次类推。
[5-7]求1-1/2+1/3-1/4+.....+(-1)n+1/n的值并输出。
结束条件为︳1/n︳<10-5。
[解]
#include“stdio.h”
#include“math.h”
voidmain()
{
floata,b,h,x,sum;
intflag;
longi;
for(i=1,sum=0,flag=1;fabs(1.0/i)>=1.E-5;I++)
{
sum=sum=flag*1.0/i;
flag=-flag;
}
Printf(“\nSumis%f”,sum);
}
[解]
程序的运行结果:
sumis0.693134
[说明]
本题的关键是循环的次数不是使用循环计数器控制,而是使用一个条件来控制循环,循环条件是:
fads(1.0/i)>=1.E-5
[5-8]
若口袋放12个球,3个红的,3个白的,6个黑的,从中任选8个,编写程序列出所有可能的取法。
[解]
方法一:
#include“stdio.h”
voidmain()
{
intred,white,black;
for(red=0;red<=3;red++)
for(white=0;white<=3;white++)
for(black=0;black<=6;black++)
if(red+white+black==8)
printf(“\nred%d,white%d,black%d”,red,white,black);
}
方法二:
#include“stdio.h”
voidmain()
{
intred,white,black;
for(red=0;red<=3;red++)
for(white=0;white<=3;white++)
if((8-red-white)<=6)
printf(“\nred%d,white%d,black%d”,red,white,8-red-white);
}
程序运行结果:
red0,white2,black6
red0,white3,black5
red1,white1,black6
[说明]
本题使用穷举法解决问题。
第一种方法使用三重循环,对每一种颜色的球的个数进行穷举,红色和白色球个数的上限为3,黑色白色球个数的上限为6,三种球的个数想加是8,就是一组取法;第二种方法使用双重循环,只对红色和白色球的个数进行穷举,而黑色球使用公式8-red-white计算出来,当然这个数的上限为6,所以要用if语句做判断,黑色球满足这个条件时,就是一组取法。
[5-9]编写程序,输入一个正整数,计算并显示该整数的各位数字之和,例如整形数1987各位数字之和是1+9+8+7,等于25。
[解]
#incliude“stdio.h”
voidmain()
{
longi,sum;
intk;
printf(“\nenterainteger:
”);
scanf(“%d”,&i);
sum=0;
while(i!
=0)
{k=i%10;
sum=sum+k;
i=i/10;
}
printf(“\nsumis%d”,sum);
}
程序运行时,首先显示Enterainteger:
如果用户输入:
1987
则运行结果为
sumis25
[5-10]编写程序用循环语句解决下列问题:
一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求它在第10次落地时共经过多少米?
第10次反弹多少米?
[解]
方法一:
#include“stdio.h”
voidmain()
{
inti;
floattotal,high;
total=high=100.0;
i=1;
while(i<=10)
{
high=hight/2;
total=total+2*high;
i++;
}
total=total-2*high;
printf(“\nTotalis%f,thetenthis%f”,total,high);
}
方法二:
#include“stdio.h”
voidmain()
{
inti;
floattotal,high;
total=100.0;
higf=total/2;
i=2;
while(i<=10)
{
total=total+2*high;
high=high/2;
i++;
}
printf(“\nTotalis%f,thetenthis%f!
”,total,high);
}
程序运行结果:
Totalis299.609375,thetenthis0.097656!
[说明]
本题循环语句控制也是比较简单的,只是要注意循环次数与题目的要求是否吻合。
例如,方法一中,循环次数是10次,则为了求在第十次落地时共经过多少米,需要将第十次反弹的距离减掉。
[5-11]请为“百鸡问题”编写程序。
百鸡问题:
“鸡翁一,值钱三;鸡雠三,值钱一。
百钱买百鸡,问鸡翁、母、雠各几只“。
[解]
方法一:
#include“stdio.h”
voidmain()
{
intcock,hen,chick;
for(cock=0;cock<=20;cock++)
for(hen=0;hen<=33:
hen++)
for(chick=0;chick<=100;chick++)
if(cock*5+hen*3+chick/3==100&&chick%3\
==0&&(cock+hen+chick)==100)
printf(“\ncock%d,hen%d,chick%d”,cock,hen,chick);
}
方法二:
#include“stdio.h”
voidmain()
{
intcock,hen,chick;
for(cock=0;cock<=20;cock++)
for(hen=0;hen<=33;hen++)
{
chick=100-hen-cock;
if(cock*5+hen*3+chick/3==100&&chick%3==0&&(cock+hen+chick)==100)
printf(“\ncock%d,hen%d,chick%d”,cock,hen,chick);
}
}
方法三:
#include“stdio.h”
voidmain()
{
intcock,hen,chick;
for(cock=0;cock<=20;cock++)
{hen=(100-7*cock)/4;
chick=100-hen-cock;
if(cock*5+hen*3+chick/3==100&&chick%3==0&&(cock+hen+chick)
==100\&&hen>=0&&chick>=0)
printf(“\ncock%d,hen%d,chick%d”,cock,hen,chick);
}
}
程序运行结果:
cock0,hen25,chick75
cock4,hen18,chick78
cock8,hen11,chick81
cock12,hen4,chick84
[说明]
方法一使用三重循环对鸡翁、母、雏的只数进行穷举,是最容易想到的方法,也是效率最低的;方法二使用双重循环对鸡翁、母的只数进行穷举,而鸡雏的只数由公式“100-鸡翁-鸡母”计算;而由下面两个公式:
鸡翁+鸡母+鸡雏=100
鸡翁*5+鸡母*3+鸡雏/3=100
可以推出:
鸡翁*7+鸡母*4=100,从而得出鸡母=(100-鸡翁*7)/4,因此方法三只对鸡翁的只数进行穷举,而鸡母和鸡雏分别用公式求得,因此用单循环即可,是效率最高的方法。
[5-12]编写程序求解1000!
的末尾有多少个0(注意,不能做连乘,否则会溢出的)。
[解]
#include“stdio.h”
voidmain()
{
intI,sum,k;
sum=0;
for(i=5;i<=1000;i=i+5)
{
k=i;
while(k%5==0)
{sum=sum+1;
k=k/5;
}
}
printf(“\nThereare%dzerointheendof1000!
\n”,sum);
}
程序运行结果:
Thereare249zerointheendof1000!
[说明]
本题不能用连乘来判断1000!
末尾的0的个数,而是判断从1到1000中有多少个因子5,因为任何一个偶数乘以5都会得到一个0。
[5-13]编写程序求a+aa+aaa…+aa…a,其中a是一个数字。
例如:
3+33+333+3333+33333(此时n为5)。
要求a和n从键盘输入,输出格式为:
3+33+333+3333+33333=37035。
[解]
方法一:
#include“stdio.h”
voidmain()
{
longsum,s,j;
inti,a,n;
printf(“\nEnteraandn:
”);
scanf(“%d%d”,&a,&n);
sum=0;
j=1;
for(i=n;i>0;i--)
{s=i*j*a;
sum=sum+s;
j=j*10;
}
for(i=1;i<=n;i++)
{for(j=1;j<=i;j++)
printf(“%d”,a);
if(i==n)
printf(“=%ld”,sum);
else
printf(“+”);
}
}
方法二:
#include“stdio.h”
voidmain()
{
longsum,s,a;
intI,n,j,b;
printf(“\nEnteraandn:
”);
scanf(“%ld%d”,&a,&n);
sum=0;
s=0;
for(i=1;i<=n;i++)
{s=s+a;
sum=sum+s;
s=s*10;
{
for(i=1;i<=n;i++)
{for(j=1;j<=I;j++)
printf(“%d”,b);
if(i==n)
printf(“=%ld\n”,sum);
else
printf(“+”);
}
}
程序运行时,首先显示Enteraandn:
如果用户输入:
25
则运行结果为:
2+22+222+2222+22222=24690
[说明]
方法一与方法二的思路完全不同。
方法一中将a+aa+aaa+aaaa+aaaaa看成是下面的式子
a
aa
aaa
aaaa
+aaaaa
----------------------------------------
从该式子看出,计算的结果应该是:
“个位的n个a”+“十位的n-1个a”+“百位的n-2个a”+…。
因此,在程序中用s=i*j*a计算“个位的n个a”,“十位的n-1个a”…;其中,i从n递减到1,而j以1,10,100的方法扩大,表示个位,十位,百位。
而方法二的思路是将a扩大10倍并加上a,变成aa;再将aa扩大10倍并加上a,变成aaa,依此类推,在变化的同时将a与aa以及aaa进行累加。
[5-14]编写程序求1!
+2!
+3!
+......+n!
n为输入并且3〈=n〈=20。
[解]
#include“stdio.h”
voidmain()
{
floatsum,product;
inti,n;
printf(“\nentern\(4<=n<=20):
”);
scanf(“%d”,&n);
while(n>20IIn<4)
{
printf(“\nenternagain:
”);
Scanf(“%d”,&n);
}
sum=0;
product=1;
for(i=1;i<=n;i++);
{
product=product*i;
sum=sum+product;
}
printf(“1!
+2!
+3!
+.....%d!
=%f\n”,n,sum);
}
方法二:
#include“stdio.h”
voidmain()
{
floatsum,product;
inti,n,j;
printf(“\nEntern\(4<=n<=20\):
”);
scanf(“%d”’&n);
while(n>20IIn<4)
{
printf(“\nEnternagain:
”);
scanf(“%d”,&n);
}
sum=0;
product=1;
for(i=1;i<=n;i++)
{product=1;
for(j=1;j<=i;j++)
product=product*j;
sum=sum+product;
}
printf(“1!
+2!
+%d=%f\n”’n,sum);
}
[说明]
本题为了输出格式好看,n的下限是4,为防止溢出,n的上限使20。
两种方法第一种的效率高,而第二种比较容易理解,内循环是求一!
。
[5-15]猴子吃桃问题。
猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。
第二天剩下的桃子,吃掉一半,又多吃了一个。
以后每天将前一天的桃子吃掉一半,再多吃一个。
到第10天只剩下一个桃子,求第一天共摘了多少桃子。
[解]
#include“stdio.h”
voidmain()
{
inti,y,x;
i=1;
x=1;
while(i<=9)
{x=(x+1)*2;
i++;
}
printf(“Totalis%d\n”,x);
}
[说明]
根据题目,第10天剩下一个桃子(设为X),第9天的桃子就是(X+1)*2,第8天的桃子就是(第9天的桃子+1)*2,依次类推。
[5-16]编写程序输出下列图形:
1
22
333
4444
55555
666666
7777777
88888888
999999999
[解]
#include“stdio.h”
voidmain()
{
inti,j;charc;
for(i=1;i<=9;i++)
{
for(j=9;j>i;j--)
putchar(‘‘)’;
for(j=1;j<=I;j++)
putchar(i+‘0’);
putchar(‘\n’);
}
}
[5-17]判断下面程序的运行结果,并用for语句代替while语句重新编写程序,确保输出结果相同。
#include“stdio.h”
voidmain()
{
inti,sum;
i=sum=0;
while(i<=5)
{sum+=1;
i++;
}
printf(“i=%d,sum=%d\n”,i,sum);
}
[解]
程序的运行结果是:
i=6,sum=15
用for语句代替while语句程序如下:
#include“stdio.h”
voidmain*()
{
inti,sum;
for(i=sum=0;i<=5;sum+=i,i++);
printf(“i=%d,sum=%d\n”,i,sum);
}
[5-18]判断下面程序的运行结果,并用while语句代替dowhile语句重新编写程序,确保输出结果相同。
#includestdio.h”
voidmain()
{
inti,sum;
i=5;
sum=0;
do
{
Sum+=2*i;
i--;
}while(i>0);
printf(“i=%d,s