第5章作业答案_第1页
第5章作业答案_第2页
第5章作业答案_第3页
第5章作业答案_第4页
第5章作业答案_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5-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:如果用户输入:98 99

2、 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 d

3、ata:如果用户输入: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 “std

4、io.h” Void main() int I,j;char c; for (i=0,i<=13;i+) for (j=0;j<i;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

5、*6=12 2*7=14 2*8=16 2*9=18.解 #include “stdio.h” Void main() int i,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”Void main()char c;int count_char,count_digital,count_other

6、;count_char=count_digital=count_other=0;c=getchar(); while (c!=#) if (c>=a&& c<=z c>=A&& c<=Z)count_char+;else if (c>=0&& c<=9)count_digital+;else count_other+;c=getchar(); printf(“nchar:%d,digital:%d,others:%dn”,count_char,count_digital,count_other); 程序运行时,

7、如果用户输入:There are 30 students in the classroom 则运行结果为:char: 30, digital: 2 , 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;i<100;i+)x=a+i*h;sum=sum+h*f(x);printf(“nsum

8、 of area is %lf”,sum);程序运行结果:Sum of area is 4.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”void main() float a,b,h,x,sum; i

9、nt flag;long i;for (i=1,sum=0,flag=1;fabs(1.0/i)>=1.E-5;I+)sum=sum=flag*1.0/i;flag=-flag;Printf(“nSum is %f”,sum);解程序的运行结果:sum is 0.693134说明本题的关键是循环的次数不是使用循环计数器控制,而是使用一个条件来控制循环,循环条件是:fads(1.0/i)>=1.E-55-8若口袋放12个球,3个红的,3个白的,6个黑的,从中任选8个,编写程序列出所有可能的取法。解方法一:#include “stdio.h”void main()int red ,wh

10、ite ,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”void main()int red,white,black;for (red=0;red<=3;red+)for (white=0;white<=3;white+)if ( (8-red-wh

11、ite)<=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,黑色白色球个数的上限为6,三种球的个数想加是8,就是一组取法;第二种方法使用双重循环,只对红色和白色球的个数进行穷举,而黑色球使用公式8-red-white计算出来,当然这个数的上限为6,所以要用if语句做判断

12、,黑色球满足这个条件时,就是一组取法。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%10;sum=sum+k;i=i/10;printf(“n sum is %d”,sum);程序运行时,首先显示Enter a integer:如果用户输入:1987则运行结果为sum is 255-

13、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+2*high;i+;total=total-2*high;printf(“nTotal is %f,the tenth is %f”,total,high);方法二:#include “stdio.h”

14、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 tenth is 0.097656!说明本题循环语句控制也是比较简单的,只是要注意循环次数与题目的要求是否吻合。例如,方法一中,循环次数是10次,则为了求在第十次落地时共经过多少米,需要将第十次反弹的距离减掉。

15、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+)if(cock*5+hen*3+chick/3=100&& chick%3=0&& (cock+hen+chick)=100) printf(“ncock %d,h

16、en %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)printf(“ncock %d,hen %d,chick %d”,cock,hen,chick);方法三:#include

17、 “stdio.h”void main()int cock,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);程序运行结果:cock 0, hen 25, ch

18、ick 75cock 4, hen 18, chick 78cock 8, hen 11, chick 81cock 12, hen 4, chick 84说明方法一使用三重循环对鸡翁、母、雏的只数进行穷举,是最容易想到的方法,也是效率最低的;方法二使用双重循环对鸡翁、母的只数进行穷举,而鸡雏的只数由公式“100-鸡翁-鸡母”计算;而由下面两个公式:鸡翁+鸡母+鸡雏=100鸡翁*5+鸡母*3+鸡雏/3=100可以推出:鸡翁*7+鸡母*4=100,从而得出鸡母=(100-鸡翁*7)/4,因此方法三只对鸡翁的只数进行穷举,而鸡母和鸡雏分别用公式求得,因此用单循环即可,是效率最高的方法。5-12编写

19、程序求解1000!的末尾有多少个0(注意,不能做连乘,否则会溢出的)。解#include “stdio.h”void main()int I,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 (“nThere are %d zero in the end of 1000!n”,sum);程序运行结果:There are 249 zero in the end of 1000!说明本题不能用连乘来判断1000!末尾的0的个数,而是判断从1到1000中有多少个因子5,因为任何一个偶数乘以5都

20、会得到一个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”void main()long sum ,s,j;int i,a,n;printf(“nEnter a and n :”);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<

21、=n;i+) for (j=1;j<=i;j+) printf(“%d”,a);if (i= =n)printf(“= %ld”,sum);elseprintf(“+”);方法二:#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;s=s*10;for(i=1;i<=n;i+) for (j=1;j<=I;j+)pri

22、ntf(“%d”,b);if (i=n)printf(“=%ldn”,sum);elseprintf(“+”);程序运行时,首先显示Enter a and n:如果用户输入:2 5则运行结果为:2+22+222+2222+22222=24690说明方法一与方法二的思路完全不同。方法一中将a+aa+aaa+aaaa+aaaaa看成是下面的式子a aaaaaaaaa + 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的方

23、法扩大,表示个位,十位,百位。而方法二的思路是将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<=n<=20):”);scanf(“%d”,&n);while(n>20IIn<4)printf(“n enter n again:”);Scanf(“%d”,&am

24、p;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<=n<=20):”);scanf(“%d”&n);while(n>20IIn<4) printf(“nEnter n again:”); scanf(“%d”,&n);

25、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=%fn”n,sum); 说明本题为了输出格式好看,n的下限是4,为防止溢出,n的上限使20。两种方法第一种的效率高,而第二种比较容易理解,内循环是求一!。5-15猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天剩下的桃子,吃掉一半,又多吃了一个。以后每天将前一天的桃子吃掉一半,再多吃一个。到第10天只剩下一个桃子,求第

26、一天共摘了多少桃子。 解 #include “stdio.h” void main( ) int 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

27、“stdio.h”void main( ) int i,j;char c; 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” void main( ) int i,sum; i=sum=0; while (i<=5) sum+=1; i+; printf(“i=%d,sum=%dn”,i,sum);

28、解程序的运行结果是:i=6,sum=15 用for语句代替while语句程序如下:#include “stdio.h”void main*( ) int i,sum; for (i=sum=0;i<=5;sum+=i,i+); printf(“i=%d,sum=%dn”,i,sum); 5-18判断下面程序的运行结果,并用while语句代替do while语句重新编写程序,确保输出结果相同。 #include stdio.h” void main( ) int i,sum; i=5;sum=0;do Sum+=2*i; i- -; while(i>0); printf(“i=%d,

29、sum=%dn”,i,sum); 解程序的运行结果是:I=0,sum=30用while语句代替do while语句的程序如下: #include “stdio.h” void main( ) int i,sum;i=5;sum=2*i;i- -; while(i>0) sum+=2*i; i- -; printf(“i=&d,sum=%dn,i,sum); 5-19判断下面程序的运行结果,不用break语句重新编写程序,确保输出结果相同。#include “stdio.h”void main( ) int i,sum; for (i=sum=1;i<5;i+) sum*=I; if (sum>5*i) break; printf(“i=%d,sum=%dn”,i,sum); 解 程序的结果是: i=4,sum=24; 不用break语句,重新编写程序如下:#include “stdio.h”void main( ) int i,sum,flag;flag=1;for (i=sum=1;i<

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论