• 154.00 KB
  • 2022-04-22 11:28:00 发布

《精通C程序设计教程》二~九章习题答案.doc

  • 21页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'《精通C程序设计教程》部分习题答案 2005年4月说明:本答案没有仔细校对,如果发现错误,请自行更正;蓝色的程序经过了上机验证.第二章C源程序基本语法与顺序结构简单程序设计2.10ABEFG2.11ACFHJMNPQRT2.12(1)3(2)0(3)0(4)1(5)–1(6)160(7)4(8)4(9)8(10)8(11)1(12)2(13)1(14)0(15)6(16)0(17)29(18)3(19)1(20)12.132.52.143.52.15(1)4311(2)4222(3)32122.16(1)00(2)100100(3)22(4)11(5)2020(6)1141152.17(1)–y*y*y*y*(a*a-b*b)(2)sin(y/sqrt(x*x+y*y))(3)sqrt(1+3.14/2*tan(48.5/180*3.14))(4)a/x/(a/(a+y)+b/(a+b/(a+b/z)))(5)p*q*(r+1)*(r+1)/((r+1)*(r+1)-1)(6)fabs(3-exp(-x)*log(fabs(1+x)))2.20#include“stdio.h”voidmain(){longa;intb;doublex;floaty;scanf(“%ld%d%lf%f”,&a,&b,&x,&y);printf(“a=%lo,b=%.0f,x=%0G,y=%Lgn”,a,(float)b,x,(longdouble)y);}2.22#include“stdio.h”#include“math.h”voidmain(){doublea,b,c,p,s;printf(“Inputabc:”);scanf(“%lf%lf%lf”,&a,&b,&c);p=0.5*(a+b+c);s=sqrt(p*(p-a)*(p-b)*(p-c));printf(“s=%.4fn”,s);}2.23解:第1月开始:a   (尚未还清的借款本金)第2月开始:a(1+p)-x 第3月开始:(a(1+p)-x)(1+p)-x=a(1+p)2-x(1+p)-x第4月开始:(a(1+p)2-x(1+p)-x)(1+p)-x=a(1+p)3-x(1+p)2-x(1+p)-x…第n+1月开始:a(1+p)n-x((1+p)n-1+(1+p)n-2+…+1)=0于是#include"stdio.h"#include"math.h"voidmain(){doublea,p,x;intn;printf("Inputanp:");scanf("%lf%d%lf",&a,&n,&p);x=a*p*pow(1+p,n)/(pow(1+p,n)-1);printf("x=%.2fn",x);}输入anp为1000001200.004,输出为1050.91第三章选择结构与循环结构3.3a=2,b=1,c=23.4x=10,y=63.5BCD153.6循环体共执行了3次,输出为:1293.7abcd43.8解:a的值就是循环体被执行的次数先分析内两层循环:最内层循环次数j=11j=22……j=ii总计:1+2+…+i=由于i从1循环到n-1,因此,总的循环次数是3.9BF3.10#includemain(){charc,i,;longs=0;for(i=1;i<=10;i++); {c=getchar();if(‘1’<=c<=’9’c>=’1’&&c<=’9’)putchar(c);elseif(c==’0’)putchar(‘*’);elses+=(long)c*c;printf(“ns=%dn”,s);}printf(“ns=%ldn”,s);}3.12解:/*if语句求解*/#include“stdio.h”voidmain(){doubleI,p=0;printf(“InputI=”);scanf(“%lf”,&I);if(I>100){p+=(I-100)*0.01;I=100;}if(I>60){p+=(I-60)*0.015;I=60;}if(I>40){p+=(I-40)*0.03;I=40;}if(I>20){p+=(I-20)*0.05;I=20;}if(I>10){p+=(I-10)*0.075;I=10;}p+=I*0.1;printf(“p=%fn”,p);}/*switch语句求解*/#include“stdio.h”voidmain(){doubleI,p=0;printf(“InputI=”);scanf(“%lf”,&I);if(I>=100){p+=(I-100)*0.01;I=100;}swith((int)(I/10)){case10:case9:case8:case7:case6:p+=(I-60)*0.015;I=60;case5:case4:p+=(I-40)*0.03;I=40;case3:case2:p+=(I-20)*0.05;I=20;case1:p+=(I-10)*0.075;I=10;default:p+=I*0.1;}printf(“p=%fn”,p);}3.19解:#include“stdio.h” voidmain(){ints1,s2,s3;floatav;charlevel;while(1){printf(“Inputthreescoresofonestudent:n”);scanf(“%d%d%d”,&s1,&s2,&s3);if(s1<0||s2<0||s3<0)break;av=(s1+s2+s3)/3.0F;switch((int)(av/10)){case9:case10:level=’A’;break;case8:level=’B’;break;case7:level=’C’;break;case6:level=’D’;break;default:level=’F’;}printf(“level=%cn”,level);}}第四章基本程序设计技术4.3解:#include“stdio.h”voidmain(){doubles,a;intk,n;printf(“Inputn=”);scanf(“%d”,&n);s=0;a=1;for(k=0;k<=n;k++){s+=a;a=(n+1)*a;}printf(“s=%.0fn”,s);}4.4根据本章打印杨辉三角形例题中组合数的递推计算方法计算组合数:,要求输入n、m值,输出组合数。程序中应对输入的n、m有效性进行检查。解:1m=0=m>0#include"stdio.h"voidmain(){intn,m,k,c;printf("Inputnm=");scanf("%d%d",&n,&m);if(n-m1e-6){s+=a;k+=2;a*=-x*x/k/(k-1);}printf("sin(%.4f)=%.4fn",x,s);}4.6用公式计算π近似值,计算时取1000个因子解:#include"stdio.h"voidmain(){intn;doublepi=1;for(n=2;n<=500;n+=2)pi*=(double)n*n/(n-1)/(n+1);pi*=2;printf("pi=%fn",pi);}4.7解:令,,k=1,2,3,4,…设数列和为s,则,显然,   1   k=0        bk= k>0#include"stdio.h"voidmain(){intn,k;doublex,a,b,s=0;printf("Inputxn=");scanf("%lf%d",&x,&n);a=x*x/(1+x*x);b=1;for(k=1;k<=n+1;k++){s+=b;b*=a*(2*k)/(2*k+1);}s*=x/(1+x*x);printf("s=%fn",s);}程序输入x,n为0.5100,输出为0.4636484.8输入x值(|x|<1)。要求计算到最后一项绝对值小于10-6时停止计算解:#include"stdio.h"#include"math.h"voidmain(){floatx,s,a;intk;printf("Inputx=");scanf("%f",&x);if(x<=-1||x>=1){printf("Inputisnotcorrect.n");return;}a=x;s=0;k=1;while(fabs(a)>1e-6){s+=a/k;a*=x;k++;}printf("s=%.4fn",s);}4.10计算Fibonaui分数序列前n项之和#include"stdio.h"main(){inti,n,t;floata=2,b=1,s=0;scanf("%d",&n);for(i=1;i<=n;i++){s=s+a/b;t=a;a=a+b;b=tprintf("s=%10.2n",s);}4.13韩信点兵:有兵一队,五伍剩一,六伍剩五,七伍剩四,十一伍剩十,问兵几何?解:#include"stdio.h"voidmain(){intm; for(m=1;m<=10000;m++)if(m%5==1&&m%6==5&&m%7==4&&m%11==10)printf("m=%dn",m);}1万以内的解有4个:即2111,4421,6721,90414.14解:#include"stdio.h"voidmain(){intman,child,women;printf("%8s%8s%8sn","man","women","child");for(man=1;man<17;man++)for(women=1;women<25;women++){child=50-3*man-2*women;if(child>=1&&man+women+child==30)printf("%8d%8d%8dn",man,women,child);}}4.15将一张面值100元的人民币兑换为5元,2元,1元和5角的零钞,要求零钞总数不超过40张且每种至少1张,求所有兑换方案。(要求每输出20个解之后暂停输出,按任意键之后,继续输出)解:#include"stdio.h"#include"conio.h"voidmain(){inti5,i2,i1,i0_5,count=0;for(i5=1;i5<=20;i5++)for(i2=1;i2<37;i2++)for(i1=1;i1<37;i1++){i0_5=2*(100-5*i5-2*i2-i1);if(i0_5>=1&&i5+i2+i1+i0_5<=40){printf("%4d%4d%4d%4dn",i5,i2,i1,i0_5);count++;if(count%20==0){printf("pressanykeytocontinue...n");getch();}}}}4.16解:#include"stdio.h" voidmain(){longs;inta,b,c,d;for(a=1;a<=9;a++)for(b=1;b<=9;b++)for(c=1;c<=9;c++)for(d=1;d<=9;d++){s=100566+a*10000+(4750+b-(3049+c*100))*(106+d*10);if(s==416354)printf("%4d%4d%4d%4dn",a,b,c,d);}}4.17解:#include"stdio.h"voidmain(){inti,j,n;printf("Inputn=");scanf("%d",&n);for(i=1;i<=n;i++){for(j=1;j<=40-i;j++)putchar(32);for(j=1;j<=i;j++)printf("%d",j);for(j=i-1;j>=1;j--)printf("%d",j);putchar("n");}}4.18打印如下图形,打印行数n由用户输入。要求把图形放在屏幕中央。aabaabcbaabcdcbaabcdedcba解:#include"stdio.h"voidmain(){inti,j,n;intw=3;printf("Inputn=");scanf("%d",&n);for(i=1;i<=n;i++){printf("%*s",40-i*w,""); for(j=1;j<=i;j++)printf("%*c",w,"a"+j-1);for(j=i-1;j>=1;j--)printf("%*c",w,"a"+j-1);printf("n");}}4.19解:#include"stdio.h"voidmain(){intn,i,j;printf("Inputn=");scanf("%d",&n);if(n%2==0){printf("Inputisnotcorrect.n");return;}n=n/2+1;for(i=1;i<=n;i++){printf("%*s",n-i,"");for(j=1;j<=2*i-1;j++)putchar("*");printf("n");}n--;for(i=n;i>=1;i--){printf("%*s",n-i+1,"");for(j=1;j<=2*i-1;j++)putchar("*");printf("n");}}4.20解:#include"stdio.h"voidmain(){intn,i,j;printf("Inputn=");scanf("%d",&n);if(n%2==0){printf("Inputisnotcorrect.n");return;}n=n/2+1;for(i=1;i<=n;i++){printf("%*s",n-i,"");for(j=1;j<=2*i-1;j++)putchar(j==1||j==2*i-1?"A"+i-1:"-");printf("n");}n--;for(i=n;i>=1;i--){printf("%*s",n-i+1,"");for(j=1;j<=2*i-1;j++)putchar(j==1||j==2*i-1?"A"+i-1:"-");printf("n");}}4.21解: #include"stdio.h"voidmain(){inti,j,n,a=1,b;printf("Inputn=");scanf("%d",&n);for(i=1;i<=n;i++){b=a;for(j=1;j<=n;j++){printf("%4d",b);b+=j;}printf("n");a+=i;}}4.22解:#include"stdio.h"voidmain(){inti,j;for(i=1;i<=9;i++){printf("%*s",6*(i-1),"");for(j=i;j<=9;j++)printf("%d*%d=%-2d",i,j,i*j);printf("n");}}4.23解:#include"stdio.h"#include"math.h"#include"conio.h"voidmain(){intm,k,i,count=0;for(m=3;m<=1000;m+=2){k=(int)sqrt(m);for(i=3;i<=k;i+=2)if(m%i==0)break;if(i>k){k=(int)sqrt(m+2);for(i=3;i<=k;i+=2)if((m+2)%i==0)break;if(i>k){printf("%4d%4dn",m,m+2);count++;if(count%20==0){printf("Pressanykeytocontinue...n");getch();}}}}}4.24解:#include"stdio.h"voidmain() {intm,i,s;for(m=1;m<=1000;m++){s=1;for(i=2;i<=m/2;i++)if(m%i==0)s+=i;if(s==m){printf("%d=1",m);for(i=2;i<=m/2;i++)if(m%i==0)printf("+%d",i);printf("n");}}}4.25解:gcd(a1,a2,…,an-1,an)=gcd(gcd(a1,a2,…,an-1),an)lcm(a1,a2,…,an-1,an)=lcm(lcm(a1,a2,…,an-1),an)#include"stdio.h"voidmain(){inta,lcm=0,gcd=0,t,b;longm;printf("Inputnaturalnumbersuntilinput0:n");while(1){scanf("%d",&a);if(a<=0)break;b=a;while(gcd){t=a%gcd;a=gcd;gcd=t;}gcd=a;a=b;m=(long)a*lcm;while(lcm){t=a%lcm;a=lcm;lcm=t;}lcm=m==0?a:(int)(m/a);}printf("gcd=%d,lcm=%dn",gcd,lcm);}4.26#include"stdio.h"#include"math.h"voidmain(){longm,p;for(m=2;m<=10000;m++){p=(long)(log(m)/log(10)+1);p=(long)pow(10,p);if(m*m%p==m)printf("%ld:%ld*%ld=%ldn",m,m,m,m*m);}}4.27解:#include"stdio.h"voidmain(){inti,j,s1,s2,k,c=0;for(i=1;i<=1000;i++)for(j=i+1;j<=1000;j++) {s1=0;for(k=1;k<=i/2;k++)if(i%k==0)s1+=k;s2=0;for(k=1;k<=j/2;k++)if(j%k==0)s2+=k;if(s1==j&&s2==i)printf("%4d%4dn",i,j);}}第五章数组5.4解:/*方法1:另辟数组空间进制复制*/#include"stdio.h"#defineN8voidmain(){inta[N],b[N],i,j;printf("Input%dintegernumbers:n",N);for(i=0;iN){printf("Inputistoobig.n");return;}for(i=0;i=0)a[j++]=a[i];for(i=0;i="a"&&s[i]<="z")s[i]-=32;elseif(s[i]>="A"&&s[i]<="Z")s[i]+=32;for(--i;i>=0;i--)putchar(s[i]);printf("n");}/*指针法*/#include"stdio.h"voidmain(){chars[81],*p;printf("Inputastring:");gets(s);for(p=s;*p;p++)if(*p>="a"&&*p<="z")*p-=32;elseif(*p>="A"&&*p<="Z")*p+=32;for(--p;p>=s;p--)putchar(*p); printf("n");}6.10解:#include"stdio.h"voidmain(){chars[81],*p;intcount=0;printf("Inputastring:");gets(s);for(p=s;*p;p++)if(*p>="0"&&*p<="9")count++;printf("numberofdigits=%dn",count);}6.11解:/*下标法*/#include"stdio.h"#defineN8voidmain(){inta[N],i,j,x,m;printf("Input%dintegernumbers:n",N);for(i=0;imax)max=p[i];elseif(p[i]len1){printf("Insertpositionisnotcorrect.n");return;}if(len1+len2>MaxLen){printf("Notenoughmemorytocontainthecombinedstrings.n");return;}s1[len1+len2]="";for(i=len1-1;i>=n;i--)s1[i+len2]=s1[i];for(i=0;ilen1)if(len+len2-len1>MaxLen){printf("Notenoughspace.n");return;}elsefor(q=s+len;q>=p+len1;q--)*(q+len2-len1)=*q;if(len2=p+maxlen;q--){q1=p;q2=q;len=q2-q1+1;while(q1=q2)if(len>maxlen){maxlen=len;pmax=p;break;}}p++;if(s+strlen(s)-p<=maxlen)break;}if(maxlen>1)for(i=0;i=2;k--)n/=10;return(int)(n%10);}voidmain(){longn;intk;printf("Inputnk:");scanf("%ld%d",&n,&k);printf("%dn",digit(n,k));}7.10解:#include"stdio.h"#include"math.h"#include"conio.h"isprime(intn){intk,m;m=(int)sqrt(n+1);for(k=2;k<=m;k++)if(n%k==0)break;returnk>m;}voidmain(){intn,p,c=0;for(n=4;n<=1000;n+=2){for(p=2;p<=n/2;p++)if(isprime(p)&&isprime(n-p)){printf("%d=%d+%dn",n,p,n-p);c++;if(c%20==0){printf("Pressanykeytocontinue.n");getch();}break;}}}7.11解:/*非递归算法*/#include"stdio.h" voidtohex(unsignedlongx){charbuf[15];inti=0,c;if(x==0){printf("0");return;}while(x){c=x%16;x/=16;if(c>=10)c+=55;elsec+=48;buf[i++]=c;}for(--i;i>=0;i--)printf("%2c",buf[i]);}voidmain(){longx;printf("Inputalongintegernumber:");scanf("%ld",&x);tohex(x);printf("n");}/*递归算法*/#include"stdio.h"voidtohex(unsignedlongx){if(x==0)return;tohex(x/16);x%=16;if(x>=10)x+=55;elsex+=48;printf("%2c",(char)x);}voidmain(){longx;printf("Inputalongintegernumber:");scanf("%ld",&x);tohex(x);printf("n");}7.8解:/*非递归算法*/#include"stdio.h"#include"string.h"voidreverse(char*s){char*p,*q,t;p=s;q=s+strlen(s)-1;while(p=q)return;t=*p;*p=*q;*q=t;reverse(p+1,q-1);}voidmain(){chars[81];printf("Inputastring:n");gets(s);reverse(s,s+strlen(s)-1);printf("Reversedstringisn");puts(s);}7.8解:#include"stdio.h"voidgw(char*s,char*word){intmaxlen,len;char*pmax;maxlen=0;len=0;while(1){if(*s>="a"&&*s<="z"||*s>="A"&&*s<="Z")len++;else{if(len>maxlen){maxlen=len;pmax=s-len;}len=0;}if(*s=="")break;s++;}for(;maxlen>=1;maxlen--)*word++=*pmax++;*word="";}voidmain(){chars[256],word[32];printf("InputaEnglishsentence:n");gets(s);gw(s,word);printf("Thelongestwordisn");puts(word);}7.14解:1m=0=m>0#include"stdio.h" longcomb(longn,longm){if(m==0)return1L;return(n-m+1)*comb(n,m-1)/m;}voidmain(){longn,m;printf("Inputnm:");scanf("%ld%ld",&n,&m);printf("C(%ld,%ld)=%ldn",n,m,comb(n,m));}7.20解:#include"stdio.h"#include"ctype.h"#include"stdlib.h"intcount(char*s){intn=0;while(*s){if(isdigit(s[0])&&!isdigit(s[1]))n++;s++;}returnn;}voidchg(char*s,long*p,intn){intflag=0;intc=0;*p=0L;while(1){if(isdigit(*s)){*p=(*p)*10+(*s-48);flag=1;}elseif(flag){c++;if(c==n)break;p++;*p=0L;flag=0;}if(*s=="")break;s++;}}voidmain(){chars[256];inti,n;long*p;printf("Inputastring:n");gets(s);n=count(s);if(n==0)return;p=(long*)malloc(n*sizeof(long));if(!p){printf("Memeryallocationfailed.n");return;}chg(s,p,n);for(i=0;i32){printf("nvalueisnotcorrect.n");return;}bitout(a,n);printf("n");}7.305.57.314217.321,1,0,-13,2,1,-27,3,2,-313,4,3,-47.3313第七章 编译预处理8.1TurboC8.2158.4#defineleap(y)((y)%4==0&&(y)%100!=0||(y)%400==0)leap(inty){returny%4==0&&y%100!=0||y%400==0;}8.10#defineDUP(s,ch,n){memset((void*)(s),ch,n);*((s)+(n))=0;}第八章指针深入9.13.59.24,9,59.39669.4此题有问题(a[0]串空间不足,且结束标志字节’’没有复制)9.5ADFH9.6ADE'