1、第5章作业答案DOC5-1 编写程序,输入某种功课的若干个同学的成绩,以-1作为终止的特殊成绩,计算平均成绩并输出.解#include “stdio.h”void main() int i,score; float sum; i=0; printf(“enter score end with -1:”); scanf(“%d”,&score); while (score!=-1) i=i+1; sum=sum+score; scanf(“%d”,&sore); printf(“aver score is %f”,sum/i);程序运行时,首先显示enter score end with -1:
2、如果用户输入:98 99 87 86 -1则运行结果为:啊上十92.5000005-2编写程序计算如果每年按照年利率I(例如2%)投资S(例如50000元),在第Y(例如10)年得到的总钱数M。公式:M=S*(1+I)y解 #Include “stdio.h” Void main() float I,s,m; int y; printf(“Enter data:”); scanf(“%f%f%d”,&I,&s,&y); m=s; while (y=1) m=m*(1+i); y-; printf(“There are %10.2f yuan”,m); 程序运行时,首先显示Enter data:
3、如果用户输入:0.02 50000 10则运行结果为:There are 59754.63 yuan 5-3编写程序,用循环语句输入下列图形。 ABCDEFGHIJKLM*NOPQRSTUVWXYZ BCDEFGHIJKLM*NOPQRSTUVWXY CDEFGHIJKLM*NOPQRSTUVMX DEFGHIJKLM*NOPQRSTUVMEFGHIJKLM*NOPQRSTUV FGHIJKLM*NOPQRSTU GHIJKLM*NOPQRST HIJKLM*NOPQRS IJKLM*NOPQR JKLM*NOPQ KLM*NOP LM*NO M*N * 解 #include “stdio.h
4、” Void main() int I,j;char c; for (i=0,i=13;i+) for (j=0;ji;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=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=92*1=2 2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16
5、2*9=18.解 #include “stdio.h” Void main() int i,j;for (i=1;i=9;i+)for (j=1;j=a& c=A& c=0& c=9) count_digital+; else count_other+; c=getchar(); printf(“nchar:%d,digital:%d,others:%dn”,count_char,count_digital,count_other); 程序运行时,如果用户输入:There are 30 students in the classroom 则运行结果为:char: 30, digital: 2
6、, others: 75-6编写程序通过计算100个矩形的面积得到函数f(x)的数值积分。f(x)=(x +x2,其中0xb。解 #define f(x) (x)*(x)+(x) #include “stdio.h”void main() Double a,b,h,x,sum; int i; a=0; b=0; h=(b-a)/100; sum=0; for (i=0;i100;i+) x=a+i*h; sum=sum+h*f(x); printf(“nsum of area is %lf”,sum);程序运行结果:Sum of area is 4.066800说明本题的循环是比较简单的,是循
7、环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=1.E-5;I+) sum=sum=flag*1.0/i; flag=-flag; Printf(“nSum is %f”,sum); 解程序的运行结果:sum is 0.693134说明本题的关键是循环的次数不是使用循环计数器控制,而是使用一个条件来控制循环,循环条件是:fads(1.
8、0/i)=1.E-55-8若口袋放12个球, 3个红的,3个白的,6个黑的,从中任选8个,编写程序列出所有可能的取法。解方法一: #include “stdio.h” void main() int red ,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”
9、void main() int red,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); 程序运行结果:red 0,white 2,black 6red 0,white 3,black 5red 1,white 1,black 6说明本题使用穷举法解决问题。第一种方法使用三重循环,对每一种颜色的球的个数进行穷举,红色和白色球个数的上限为3,黑色白色球个数的
10、上限为6,三种球的个数想加是8,就是一组取法;第二种方法使用双重循环,只对红色和白色球的个数进行穷举,而黑色球使用公式8-red-white计算出来,当然这个数的上限为6,所以要用if语句做判断,黑色球满足这个条件时,就是一组取法。5-9编写程序,输入一个正整数,计算并显示该整数的各位数字之和,例如整形数1987各位数字之和是1+9+8+7,等于25。解 #incliude “stdio.h” void main() long i,sum; int k; printf(“n enter a integer:”); scanf(“%d”,&i); sum=0; while(i!=0) k=i%1
11、0; sum=sum+k; i=i/10; printf(“n sum is %d”,sum);程序运行时,首先显示Enter a integer:如果用户输入:1987则运行结果为sum is 255-10编写程序用循环语句解决下列问题:一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求它在第10次落地时共经过多少米?第10次反弹多少米?解方法一:#include “stdio.h”void main() int i;float total ,high;total=high=100.0;i=1 ;while (i=10) high=hight/2; total=total+
12、2*high; i+; total=total-2*high; printf(“nTotal is %f,the tenth is %f”,total,high);方法二:#include “stdio.h”void main() int i; float total,high; total=100.0; higf=total/2;i=2;while (i=10) total=total+2*high; high=high/2;i+;printf(“nTotal is %f,the tenth is %f!”,total,high);程序运行结果:Total is 299.609375,the
13、 tenth is 0.097656!说明本题循环语句控制也是比较简单的,只是要注意循环次数与题目的要求是否吻合。例如,方法一中,循环次数是10次,则为了求在第十次落地时共经过多少米,需要将第十次反弹的距离减掉。5-11请为“百鸡问题”编写程序。百鸡问题:“鸡翁一,值钱三;鸡雠三,值钱一。百钱买百鸡,问鸡翁、母、雠各几只“。解方法一:#include “stdio.h”void main() int cock ,hen,chick; for (cock=0;cock=20;cock+) for (hen=0;hen=33:hen+) for (chick=0;chick=100;chick+)
14、 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”void main() int cock,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)
15、printf(“ncock %d,hen %d,chick %d”,cock,hen,chick); 方法三:#include “stdio.h”void main() int cock,hen,chick; for (cock=0;cock=0&chick=0) printf(“ncock %d,hen %d,chick %d”,cock,hen,chick); 程序运行结果:cock 0, hen 25, chick 75cock 4, hen 18, chick 78cock 8, hen 11, chick 81cock 12, hen 4, chick 84说明方法一使用三重循环对鸡
16、翁、母、雏的只数进行穷举,是最容易想到的方法,也是效率最低的;方法二使用双重循环对鸡翁、母的只数进行穷举,而鸡雏的只数由公式“100-鸡翁-鸡母”计算;而由下面两个公式: 鸡翁+鸡母+鸡雏=100 鸡翁*5+鸡母*3+鸡雏/3=100可以推出:鸡翁*7+鸡母*4=100,从而得出鸡母=(100-鸡翁*7)/4,因此方法三只对鸡翁的只数进行穷举,而鸡母和鸡雏分别用公式求得,因此用单循环即可,是效率最高的方法。5-12编写程序求解1000!的末尾有多少个0(注意,不能做连乘,否则会溢出的)。解#include “stdio.h”void main() int I,sum,k; sum=0; for
17、 (i=5;i0;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” void main() long sum,s,a; int I,n,j,b; printf(“nEnter a and n:”); scanf(“%ld%d”,&a,&n); sum=0; s=0; for (i=1;i=n;i+) s=s+a;sum=sum+s;
18、s=s*10; for(i=1;i=n;i+) for (j=1;j=I;j+) printf(“%d”,b); if (i=n) printf(“=%ldn”,sum); else printf(“+”); 程序运行时,首先显示Enter a and n:如果用户输入:2 5则运行结果为:2+22+222+2222+22222=24690说明方法一与方法二的思路完全不同。方法一中将a+aa+aaa+aaaa+aaaaa看成是下面的式子 a a a a a a a a a a + a a a a a-从该式子看出,计算的结果应该是:“个位的n个a”+“十位的n-1个a”+“百位的n-2个a”+
19、。因此,在程序中用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” void main() float sum,product; int i,n; printf(“n enter n (4=n20IIn4) printf(“n enter n again:
20、”); Scanf(“%d”,&n); sum=0;product=1;for(i=1;i=n;i+); product=product*i; sum=sum+product;printf(“1!+2!+3!+. %d!=%fn”,n,sum); 方法二: #include “stdio.h” void main() float sum,product; int i,n,j; printf(“nEnter n (4=n20IIn4) printf(“nEnter n again:”); scanf(“%d”,&n); sum=0;product=1;for (i=1;i=n;i+) produ
21、ct=1; for (j=1;j=i;j+) product=product*j; sum=sum+product;printf(“1!+2!+ %d=%fn”n,sum); 说明本题为了输出格式好看,n的下限是4,为防止溢出,n的上限使20。两种方法第一种的效率高,而第二种比较容易理解,内循环是求一!。5-15猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天剩下的桃子,吃掉一半,又多吃了一个。以后每天将前一天的桃子吃掉一半,再多吃一个。到第10天只剩下一个桃子,求第一天共摘了多少桃子。 解 #include “stdio.h” void main( ) i
22、nt i,y,x;i=1;x=1;while (i=9) x=(x+1)*2; i+;printf(“Total is %dn”,x); 说明 根据题目,第10天剩下一个桃子(设为X),第9天的桃子就是(X+1)*2,第8天的桃子就是(第9天的桃子+1)*2,依次类推。5-16编写程序输出下列图形: 12 2 3 3 3 4 4 4 4 5 5 5 5 5 6 6 6 6 6 6 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9解 #include “stdio.h”void main( ) int i,j;char c; for (i=1;ii;
23、j- -) putchar( ); for (j=1;j=I;j+) putchar(i+ 0); putchar(n); 5-17判断下面程序的运行结果,并用for语句代替while语句重新编写程序,确保输出结果相同。 #include “stdio.h” void main( ) int i,sum; i=sum=0; while (i=5) sum+=1; i+; printf(“i=%d,sum=%dn”,i,sum); 解程序的运行结果是:i=6,sum=15 用for语句代替while语句程序如下:#include “stdio.h”void main*( ) int i,sum; for (i=sum=0;i0); printf(“i=%d,s
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2