C语言程序设计_第三版_谭浩强主编第6—8章课后习题答案.doc

上传人:飞****2 文档编号:52757331 上传时间:2022-10-23 格式:DOC 页数:41 大小:118KB
返回 下载 相关 举报
C语言程序设计_第三版_谭浩强主编第6—8章课后习题答案.doc_第1页
第1页 / 共41页
C语言程序设计_第三版_谭浩强主编第6—8章课后习题答案.doc_第2页
第2页 / 共41页
点击查看更多>>
资源描述

《C语言程序设计_第三版_谭浩强主编第6—8章课后习题答案.doc》由会员分享,可在线阅读,更多相关《C语言程序设计_第三版_谭浩强主编第6—8章课后习题答案.doc(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、C语言第68章课后习题答案第六章 循环语句6.1输入两个正数,求最大公约数和最小公倍数. #include void main() int a,b,num1,num2,temp; printf(请输入两个正整数:n); scanf(%d,%d,&num1,&num2); if(num1num2) temp=num1; num1=num2; num2=temp; a=num1,b=num2; while(b!=0) temp=a%b; a=b; b=temp; printf(它们的最大公约数为:%dn,a); printf(它们的最小公倍数为:%dn,num1*num2/a); 编译已通过6.2

2、输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数.解: #include void main() char c;int letters=0,space=0,degit=0,other=0;printf(请输入一行字符:n);while(c=getchar()!=n) if(c=a&cA&c=0&c=9) digit+; else other+; printf(其中:字母数=%d 空格数=%d 数字数=%d 其它字符数=%dn,letters,space, digit,other); 6.3求s(n)=a+aa+aaa+aaa之值,其中a是一个数字,n表示a的位数。解: void

3、 main() int a,n,count=1,sn=0,tn=0; printf(请输入a和n的值:n); scanf(%d,%d,&a,&n); printf(a=%d n=%d n,a,n); while(count=n) tn=tn+a; sn=sn+tn; a=a*10; +count; printf(a+aa+aaa+=%dn,sn); 6.4 求 (即1+2!+3!+4!+20!)void main() float n,s=0,t=1; for(n=1;n=20;n+) t=t*n; s=s+t; printf(1!+2!+20!=%en,s); 阶乘利用递归,再求和:#incl

4、udeusing namespace std;long Func(int n)if(1=n)return n;if(n1)return n*Func(n-1);main()long s=0;int i=1;while (i=6)s=s+Func(i);i+;coutsendl;6.5 求 。void main() int k,N1=100,N2=50,N3=10; float s1=0.0,s2=0.0,s3=0.0; for(k=1;k=N1;k+)/*计算1到100的和*/ s1=s1+k; for(k=1;k=N2;k+)/*计算1到50各数平方和*/ s2=s2+k*k; for(k=

5、1;k=N3;k+) /*计算1到10各数倒数之和*/ s3=s3+1.0/k; printf(总和=%8.2fn,s1+s2+s3); 已通过int main()int k=1,i=11,j=51;float s=0.0;while(k=10)s=s+k+k*k+1.0/k;while(k=10 & i=50)s=s+i+i*i;while(i=50 & j=100)s=s+j;j+;i+;k+;6.6所谓“水仙开数”是指一个3位数,其个位数字立方和等于该数本身。 #includevoid main() int i,j,k,n; printf( 水仙花数是:n); for(n=100;n10

6、00;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(%dn,n); printf(n); 编译已通过153 370 371 4076.7一个数如果恰好等于它的因子之和,这个数就称为“完数”。编程序找出1000之内的所有完数,并按下面格式输出其因子。 #include #define M 1000 /*定义寻找范围*/ void main() int k0,k1,k2,k3,k4,k5,k6,k7,k8,k9; int i,j,n,s; for(j=2;j=M;j+) n=0; s=j; f

7、or(i=1;i1) printf(%d,%d,k0,k1); if(n2) printf(,%d,k2); if(n3) printf(,%d,k3); if(n4) printf(,%d,k4); if(n5) printf(,%d,k5); if(n6) printf(,%d,k6); if(n7) printf(,%d,k7); if(n8) printf(,%d,k8); if(n9) printf(,%d,k9); printf(n); 方法二:此题用数组方法更为简单. void main() int k10; int i,j,n,s; for(j=2;j=1000;j+) n=-

8、1; s=j; for(i=1;ij;i+) if(j%i)=0) n+; s=s-i; kn=i;/*将每个因子赋给k0,k1.k9*/ if(s= =0) printf(%d是一个完数,它的因子是:,j); for(i=0;in;i+) printf(%d,ki); printf(%dn,kn); 6.8 有一个分数序列:2/1,3/2,5/3,8/5,13/8,21/13,求出这个数列的前20项之和. 解: #include void main() int n,t,number=20; float a=2,b=1,s=0; for(n=1;n=number;n+) s=s+a/b; t=

9、a,a=a+b,b=t; printf(总和=%9.6fn,s); 编译已通过=32.6.9球反弹问题 #include void main() float sn=100.0,hn=sn/2; int n; for(n=2;n=10;n+) sn=sn+2*hn;/*第n次落地时共经过的米数*/ hn=hn/2;/*第n次反跳高度*/ printf(第10次落地时共经过%f米 n,sn); printf(第10次反弹%f米.n,hn); 编译已通过经过299.m反弹0.m6.10猴子吃桃问题#include void main() int day,x1,x2; day=9; x2=1; whi

10、le(day0) x1=(x2+1)*2; x2=x1; day-; printf(桃子总数=%dn,x1); 编译已通过=1534上面的程序是从最后一天计算,一直到第一天。当while第一次循环,既day=9的时候,X1此时计算的是第9天的桃子数。而X2既是X1前一天的桃子数。计算出第9天的桃子数后,把X1的值赋值给X2,那么X2此时X2就表示第9天的桃子数,再通过while的循环,可以逐步求出第7天,第6天.一直到第一天的桃子数. 这里X2=X1,就是一个赋值的过程,为的是求前一天的桃子数.6.11用迭代法求x= 。求平方根的迭代公式为: 要求前后两次求出的差的绝对值小于0.00001。#

11、include #include void main() float x0,x1,a; scanf(%f,&a); x1=a/2; do x0=x1;x1=(x0+a/x0)/2;while(fabs(x0-x1)=0.00001); printf(%.3fn,x1); 编译已通过6.12 用牛顿迭代法求方程在1.5附近的根。 #include void main() double x,y;x=1.5; doy=2*x*x*x-4*x*x+3*x-6; x=x-y/(6*x*x-8*x+3);while(y!=0); printf(x=%.3fn,x); 编译已通过x=2.0006.13用二分

12、法求方程在(-10,10)之间的根: #include void main()double x1,x2,y1,y2;x1=-10;x2=10; doy1=2*x1*x1*x1-4*x1*x1+3*x1-6; x1=x1-y1/(6*x1*x1-8*x1+3);while(y1!=0); do y2=2*x2*x2*x2-4*x2*x2+3*x2-6; x2=x2-y2/(6*x2*x2-8*x2+3);while(y2!=0); printf(x1=%.3f,x2=%.3fn,x1,x2); 编译已通过x1=2.000,x2=2.0006.14打印图案 #include void main()

13、 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); 编译已通过6.15乒乓比赛 #include void main() char i,j,k; /*i是a的对手;j是b的对手;k是c的对手*/for(i=x;i=z;i+) for(j=x;j=z;j+) if(i!=j) for(k=

14、x;k=z;k+) if(i!=k & j!=k) if(i!=x & k!=x & k!=z) printf(顺序为:na-%ctb-%ctc-%cn,i,j,k); 编译已通过7.1用筛选法求100之内的素数. /*用筛选法求100之内的素数*/ #include #define N 101 void main() int i,j,line,aN; for(i=2;iN;i+) ai=i; 6 for(i=2;isqrl(N);i+) for(j=i+1;jN;j+) if(ai!=0 & aj!=0) if(aj%ai=0) aj=0; 11 printf(n); for(i=2,lin

15、e=0;iN;i+) if(ai!=0) printf(%5d,ai); line+; if(line=10) printf(n); line=0; 21 6,11,21没通过7.2用选择法对10个数排序. /*选择法排序.*/ #include #define N 10 void main() int i,j,min,temp,aN; /*输入数据*/ printf(请输入十个数:n); for (i=0;iN;i+) printf(a%d=,i); scanf(%d,&ai); printf(n); for(i=0;iN;i+) printf(%5d,ai); printf(n); /*排

16、序*/ for (i=0;iN-1;i+) min=i; for(j=i+1;jaj) min=j; temp=ai; ai=amin; amin=temp; /*输出*/ printf(n排序结果如下:n); for(i=0;iN;i+) printf(%5d,ai); 编译已通过7.3对角线和: /*计算矩阵对角线元素之和*/ #include #include void main() int a33; int i,j;/i为行j为列 int sum=0; int sum1=0; /输入 for( i=0; i=2; i+) for( j=0; j=2; j+) printf ( 请输入第

17、%d行第%d列的数:, i+1, j+1); scanf (%d,&aij); printf(n); /求和 for( i=0; i=2; i+) for( j=0; j=2; j+) if(i=j) sum = sum+aij; if(i+j=2) sum1= sum1+aij; 7.4插入数据到数组 /*插入数据到数组*/ #include void main() int a11=1,3,6,9,13,15,19,27,30,80; int temp1,temp2,number,end,i,j; printf(初始数组如下:); for (i=0;iend) a10=number; els

18、e for(i=0;inumber) temp1=ai; ai=number; for(j=i+1;j11;j+) temp2=aj; aj=temp1; temp1=temp2; break; for(i=0;i11;i+) printf(%6d,ai);printf(n); 编译已通过7.5将一个数组逆序存放。 /*数组逆序存放*/#include #define N 5 void main() int aN=8,6,5,4,1,i,temp; printf(n 初始数组:n); for(i=0;iN;i+) printf(%4d,ai); for(i=0;iN/2;i+) temp=ai

19、; ai=aN-i-1; aN-i-1=temp; printf(n 交换后的数组:n); for(i=0;iN;i+) printf(%4d,ai); 无错误7.6杨辉三角 /*打印杨辉三角形*/#include #define N 10 void main() int i,j,aNN; for(i=0;iN;i+) aii=1; ai0=1; for(i=2;iN;i+) for(j=1;j=i-1;j+) aij=ai-1j-1+ai-1j; for(i=0;iN;i+) for(j=0;j=i;j+) printf(%6d,aij); printf(n); printf(n); 7.8

20、鞍点 /*查找鞍点*/ #define N 10 #define M 10 main() int i,j,k,m,n,flag1,flag2,aNM,max,maxi,maxj; printf(n输入行数n:); scanf(%d,&n); printf(n输入列数m:); scanf(%d,&m); for(i=0;in;i+) printf(第%d行?n,i); for(j=0;jm,j+); scanf(%d,&aij; for(i=0;in;i+) for(j=0;jm;j+) printf(%5d,aij); pritf(n); flag2=0; for(i=0;in;i+) max

21、=ai0; for(j=0;jmax) max=aij; maxj=j; for (k=0,flag1=1;kakmax) flag1=0; if(flag1) printf(n第%d行,第%d列的%d是鞍点n,i,maxj,max); flag2=1; if(!flag2) printf(n 矩阵中无鞍点! n); 7.9变量说明:top,bott:查找区间两端点的下标;loca:查找成功与否的开关变量. /*折半查找*/ #include #define N 15 main() int i,j,number,top,bott,min,loca,aN,flag; char c; printf

22、(输入15个数(aii-1)n); scanf(%d,&a0); i=1; while(i=ai-1) i+; esle printf(请重输入ai); printf(必须大于%dn,ai-1); printf(n); for(i=0;iN;i+) printf(%4d,ai); printf(n); flag=1; while(flag) printf(请输入查找数据:); scanf(%d,&number); loca=0; top=0; bott=N-1; if(numberaN-1) loca=-1; while(loca=0)&(top=bott) min=(bott+top)/2;

23、 if(number=amin) loca=min; printf(%d位于表中第%d个数n,number,loca+1); else if(numberamin) bott=min-1; else top=min+1; if(loca=0|loca=-1) printf(%d不在表中n,number); printf(是否继续查找?Y/N!n); c=getchar(); if(c=N|c=n) flag=0; 7.10/*统计字符数*/ #includevoid main() int i,j,uppn,lown,dign,span,othn; char text380; uppn=lown

24、=dign=span=othn=0; for(i=0;i3;i+) printf(n请输入第%d行:n,i); gets(texti); for(j=0;j=A & textij=a & textij=1 & textij=9) dign+=1; else if(textij= ) span+=1; else othn+=1; for(i=0;i3;i+) printf(%s=n,texti); printf(大写字母数:%dn,uppn); printf(小写字母数:%dn,lown); printf(数字个数:%dn,dign); printf(空格个数:%dn,span); printf

25、(其它字符:%dn,othn); 编译已通过7.11/*打印图案*/ #includevoid main() static char a5=*,*,*,*,*; int i,j,k; char space= ; for(i=0;i=5;i+) printf(n); for(j=1;j=3*i;j+) printf(%lc,space); for(k=0;k=5;k+) printf(%3c,ak); 7.12/*译电文*/ #include void main() int i,n; char ch80,tran80; printf(请输入字符:); gets(ch); printf(n密码是:

26、%s,ch); i=0; while(chi!=0) if(chi=A)&(chi=a)&(chi=z) trani=26+96-chi+1+96; else trani=chi; i+; n=i; printf(n原文是:); for(i=0;in;i+) putchar(trani);printf(n); 编译已通过7.13/*连接两个字符串(不用stract)*/ #include void main() char s180,s240; int i=0,j=0; printf(n请输入字符串1:); scanf(%s,s1); printf(请输入字符串2:); scanf(%s,s2)

27、; while(s1i!=0) i+; while(s2j!=0) s1i+=s2j+; s1i=0; printf(连接后字符串为:%sn,s1); 编译已通过7.14/*字符串比较*/ #include void main() int i,resu; char s1100,s2100; printf(请输入字符串1:); gets(s1); printf(请输入字符串2:); gets(s2); i=0; while(s1i=s2i) & (s1i!=0)i+; if(s1i=0 & s2i=0)resu=0; else resu=s1i-s2i; printf(%s与%s比较结果是%dn

28、,s1,s2,resu); 编译已通过7.15/*字符串复制*/ #include #include void main() char from80,to80; int i;printf(请输入字符串1:); scanf(%s,to);printf(请输入字符串2:); scanf(%s,from); for(i=0;i=strlen(from);i+) toi=fromi; printf(复制字符串为:%sn,to); 第8章 函数参考答案 【知识要点】 C语言的基本组成单位函数。 C是由一个且仅有一个主函数( main)和若干个子函数组成.子函数可有可无。 一个C语言源程序执行,从主函数开

29、始,以主函数结束。语言称为函数式语言,即用户可根据解决问题的算法编成一个相对独立的函数模块,然后采用调用的方法来使用函数。采用了函数模块式的结构的特点:程序的层次结构清晰,便于程序的编写、阅读和调试。语言提供了极为丰富的库函数,使用这些库函数时,在源程序的头部使用文件包含命令。如:数学函数 #include 字符函数 #include 字符串函数 #include 输入输出函数 #include 动态存储分配函数 #include #include 清屏函数 #include 日期和时间函数 #include 函数可以嵌套调用,而不可嵌套定义。函数的值: 函数的值的数据类型由函数定义时所决定的

30、。调用函数时可有返回值和无返回值两种。有返回值的函数在函数体内必有一条或多条 return 语句,无返回值的函数定义为void类型,且在函数体无return 语句。函数调用时参数的传递:主调函数和被调函数之间数据传递有两种,数值传递和地址传递。【习题参考答案】8.1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。【解析】用碾转相除法求最大公约数。最小公倍数两个整数之积/最大公约数。#include int gcf(int x,int y) /*求两整数的最大公约数*/int t,r; if (xy) t=x;x=y;y=t; whil

31、e (r=x%y)!=0) x=y; y=r; return y;int lcm(int x,int y,int h) /*求两整数的最小公倍数*/ return(x*y/h);void main ( ) int a,b,df,sc; /* df:所求的最大公约数,sc:所求的最小公倍数*/ printf(Input a,bn); scanf(“%d%d”,&a,&b); df=gcf(a,b); printf(“G.C.F=%dn”,df); sc=lcm(a,b,df); printf(“L.C.M=%dn”,sc);8.2 求方程ax2+bx+c=0的根,用3个函数分别求当b2-4ac大

32、于0,等于0和小于0时的根,并输出结果。从主函数输入a,b,c的值。# include void real_root(float a,float b,float disc) /*求方程的两个不相同的实根*/float x1,x2; x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(x1=%5.2ftx2=%5.2fn,x1,x2);void equal_root(float a,float b) /*求方程的两个相同的实根*/ float x1,x2; x1=x2=(-b)/(2*a); printf(x1=%5.2ftx2=%5

33、.2fn,x1,x2);void imaginary_root(float a,float b,float disc) /*求方程的两个不相同的虚根*/ float p,q; p=-b/(2*a); q=sqrt(disc)/(2*a); printf(x1=%5.2f+%5.2fitx2=%5.2f-%5.2fin,p,q,p,q);void main ( ) float a,b,c,disc; printf(nInput a,b,c:n); scanf(%f%f%f,&a,&b,&c); disc=b*b-4*a*c; if (disc0) real_root(a,b,disc); els

34、e if (disc=0) equal_root(a,b); else imaginary_root(a,b,disc);8.3写一个判素数的函数,在主函数输入一个整数,输出是否素数的信息。【解析】:素数(质数):只能被1和该整数本身整除的数为素数。换句话说,只有两个正因数(1和自己)的自然数即为素数。#include int prime(int n) int flag=1,i; /*flag:标识变量*/ for (i=2;i=n/2 & flag=1;i+) if (n%i=0) flag=0; return flag ;void main ( ) int n; printf(nInput an integer:); scanf(%d,&n); if (prime(n) printf(n %d is a prime.,n); else printf(n %d is not a prime.,n); 【扩展】求100以内的所有的素数。#include int prime(int n) int flag=1,i; /*flag:标识变量*/ for (i=2;i=n/2 & flag=1;i+)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁