C课后习题参考答案.doc_第1页
C课后习题参考答案.doc_第2页
免费预览已结束,剩余33页可下载查看

下载本文档

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

文档简介

习题参考答案习 题 参 考 答 案习 题 1一、选择题1、b 2、c 3、b 4、d 5、a 6、b 7、c二、填空题1、源程序文件 c 2、obj 3、可执行文件 exe 4、机器语言 汇编语言 高级语言三、解答题略四、编程题1、 main() printf(“hello! welcome to china!”);2、 main() int x; scanf(“%d”,&x); if(x=20&x=a&ch1=z ch1=ch1-32;三、编程题1、从键盘输入三个数,然后按照由小到大的顺序输出。要求,设三个数放在变量a、b、c中,最后仍然按照a、b、c的顺序输出。#include main()int a,b,c,t; scanf(“%d,%d,%d”,&a,&b,&c); if(ab) t=a; a=b; b=t; if(ac) t=a; a=c; c=t; if(bc) t=b; b=c; c=t; printf(“%d,%d,%dn”,a,b,c);2、编写程序根据以下的函数关系,对输入的x值输出相应的y值。xy2x=10x(x+2)-1x=22xx=-1x-1#include main()float x,y; scanf(“%f”,&x); if(x=-1) y=x-1; else if(x=2) y=2*x; else if(x=10) y=x*(x+2);else printf(“error!n”); printf(“y=%fn”,y);3、求一元二次方程ax2+bx+c=0的解。#include main()float a,b,c,d,disc,x1,x2,realpart,imagpart; scanf(“%f,%f,%f”,&a,&b,&c); if(fabs(a)=1e-6) printf(is not a quadratic); else disc=b*b-4*a*c; if(fabs(disc)1e-6) x1=(-b+sqrt(disc)/(2*a); x2=(-b-sqrt(disc)/(2*a); printf(“has distinct real roots:%8.4f and %8.4fn”,x1,x2); else realpart=-b/(2*a); imagpart=sqrt(-disc)/(2*a); printf(“has complex roots:n”); printf(“%8.4f+%8.4fin”, realpart,imagpart); printf(“%8.4f-%8.4fin”, realpart,imagpart); 4、假设工资税率如下,其中s代表工资,r代表税率:s500 r=0%500=s1000 r=5%1000=s2000 r=8%2000=s3000 r=10%3000=3000) r=0.15; g=salary/500; switch(g)case 1: r=0.05; case 2: case 3: r=0.08; case 4: case 5: r=0.10; salary=salary*(1-r); printf(“%dn”,salary);习 题 5一、选择题1、a 2、c 3、c 4、d 5、a 6、a7、a 8、b 9、c 10、b 11、b 12、d二、填空题1、continue2、1n=999或n=0或x=0.0 2xmin或x=min4、1 i10 2 j%3!=05、1t=1 2n=i6、1n 2flag=1 3n7、1ji 21/term8、1sumk 2j-2三、编程题1、#include main()int m,n,p,r,temp; printf(“please input m,n:”); do scanf(“%d%d”,&m,&n); while(m=0|n=0); if(nm) temp=n; n=m; m=temp; /*确保大数放到n中*/ p=n*m; /*保留n和m的乘积到p中,以便求最小公倍数*/ while(m!=0) /*求n和m的最大公约数*/ r=n%m; n=m; m=r; printf(“最大公约数为:%dn”,n); printf(“最小公倍数为:%dn”,p/n);2、#include main()char c; int letter=0,space=0,digit=0,other=0; printf(“please input a line character:”); while(c=getchar()!=n) if(c=a&c=a&c=0&c=9) digit+; else other+; printf(“letter is %d,space is %d,digit is %d,other is %d,”,letter,space,digit,other);3、main()int m,s,i; for(m=2;m1000;m+) s=0; for(i=1; im; i+) if(m%i)=0) s=s+i; if(s=m) printf(“%d its factors are ”,m); for(i=1; im; i+) if(m%i=0) printf(“%d,”,i); printf(“n”); 4、main()int i,a,min,max; scanf(“%d”,&a); min=a;max=a; for(i=2;i=100;i+) scanf(“%d”,&a); if(amax) max=a; printf(“max=%d,min=%dn”,max,min);5、#include #define n 20main()int i,t; float a=2,b=1,s=0; for(i=1;i=n;i+) s=s+a/b; t=a; a=a+b; /*将前一项的分子与分母之和作为下一项的分子*/ b=t; /*将前一项的分子作为下一项的分母*/ printf(“sum=%fn”,s);6、问题分析:设王先生的岁数是x,他夫人的岁数是y,可得到如下方程组:这是一个非线性方程组的求解,无法手算求解,可以用穷举法求解。考虑到实际可能,x、y可以在20100范围内取值,逐一穷兴出x、y所有可能的取值判断是否满足上述方程组,若满足,这一组解就是要求的解。程序如下:main()int x,y; for(x=20;x=100;x+) for(y=20;y=100;y+) if(x*x+y=1053&x+y*y=873) printf(“x=%d y=%dn”,x,y);7、 main() long int k,g,s=0; printf(please input an integer:); scanf(%ld,&k); do g=k%10; printf(%2d,g); k=k/10; while(k!=0); 8、(1)main() int i,j; for(i=1;i=9;i+) for(j=i;j=9;j+) printf(%d*%d=%2d ,i,j,i*j); printf(n); (2)main() int i,j,k; for(i=1;i=9;i+) for(k=1;ki;k+) printf( ); for(j=i;j=9;j+) printf(%d*%d=%2d ,i,j,i*j); printf(n); 9、#include main() int i=0; long s,n,j,x; for(j=100;j0) /*求原数j的反序数*/ s=s*10+x%10; x=x/10; if(s=j) /*判断反序数s与原数j是否相等*/ i+; printf(%4ld,j); if(i%10=0) printf(n); /*每行输出10个回文数*/ 10、#include main()int x,y,z; for(x=1;x20;x+) for(y=1;y33;y+) for(z=3;z100;z+=3) if(x*5+y*3+z/3)=100&x+y+z=100) printf(“公鸡有%d只,母鸡有%d只,小鸡有%d只n”,x,y,z); 11、#include #include main()int n=1; double x,sum=0,term=1.0; scanf(“%lf”,&x); while(fabs(term)=1e-6) sum+=term; term*=-x*x/(n*(n+1); n=n+2; printf(“cos(%lf)=%lf ,%lf n”,x,sum,cos(x);12、问题分析:用迭代法求平方根的算法如下: (1)设定一个x的初值x0; (2)用上述公式求出x的下一个值x1; (3)再将x1代入上述公式,求出x的下一个值x2; (4)如此继续下去,直到前后两次求出的x值(xn+1和xn)满足。为便于程序处理,令x的初值x0=a/2(也可以是其他值),求出x1。程序实现如下:#include main()float a,x0,x1; printf(“please input a positive number:”); scanf(“%f”,&a); /*输入a的值*/ x0=a/2; x1=(x0+a/x0)/2; do x0=x1; x1=(x0+a/x0)/2; while(fabs(x1-x0)=1e-5); printf(“the square root of %f is %f, the true root is %fn”,a,x1,sqrt(a); 13、程序如下:#include main()float x,x0,f,f1; x=1.5; do x0=x; f=(2*x0-4)*x0+3)*x0-6; f1=(6*x0-8)*x0+3; x=x0-f/f1; /*进行牛顿迭代*/ while(fabs(x-x0)=1e-5); printf(“the root is %fn”,x);14、#include #include #define epsilon 0.00001 /*定义要求的精度*/float f(float x) /*求函数值*/return(2*x*x*x-4*x*x+3*x-6);main()float a,b,x; scanf(%f%f,&a,&b); /*输入求根区间*/ if(f(a)*f(b)=0) /*判断是否符合二分法使用的条件*/ printf(不满足二分法使用条件,退出!);exit(0); do x=(a+b)/2; if(f(x)*f(b)=epsilon); /*判断是否达到精度要求,如果没达到,继续循环*/ x=(b+a)/2; /*取最后的小区间中点作为根的近似值*/ printf(x=%fn,x); /*输出函数的近似根*/15、#define n 4main()int i,j,k;for(i=0;in;i+) for(j=0;j=n-i;j-) printf(*); for(j=n-1;j=n-i;j-) printf(*); for(j=0;jn-i-1;j+) printf( );/*本行也可以不要*/ printf(n); 习 题 6一、选择题1b2d3d4d5a6c二、填空题阅读程序写出运行结果题1第一行:1 4 3第二行:2 5 82第一行:124第二行:357第三行:689三、编程题1# include main()char str120, str210;int i=0,j=0;gets(str1);gets(str2)while(str1i!=0) i+;while(str2j!=0) str1i+=str2j+;str1i=0;puts(str1);2 # define m 3# define n 4# include main()int i, j, m;int amn=1,2,3,4,5,6,7,8,9,10,11,12, ppn;for (j=0; jn; j+)m=a0j; /*将m值设为每一列的第一行元素的值*/for (i=0; im; i+) /*找每一列的最小值,赋给m*/if (aij m)m=aij;ppj=m; /*将每一列的最小值m存入pp数组*/for (j=0; jn; j+) /*输出pp数组*/printf(“%d ”, ppj);3# include void find (int a55)int i, j, row, col, sum1, sum2;for (i=0;i5;i+)for (j=0;j5;j+)sum1=sum2=0;for (col=0;col5;col+)sum1+=aicol;for (row=0;row5;row+)sum2+=arowj;if (sum1= =sum2)printf(“a%d%d:%dn”, i, j, aij);main()int i, j, a55=2,8,1,9,4,5,7,1,3,0,7,1,7,5,2,3,2,2,1,5,0,2,1,6,8;for (i=0;i5;i+)for (j=0;j5;j+)printf(“%4d”, aij);printf(“n”);find(a);4#include #include main() int a35,x,y,i,j,k,flag=0;int max,min;for(i=0;i3;i+)for(j=0;j5;j+) scanf(%d,&aij); /*/for(i=0;i3;i+) max=ai0;y=0;for(k=1;k5;k+) if(maxaik) y=k;max=aik;min=aiy;x=i;for(k=0;kaky) x=k;min=aky;if(i=x) printf(a%d%d=%d is andiann,x,y,axy);flag=1; if(flag=0) printf(nnot found andian!);5# include # define n 10void crl (int a )int i, j, max=0, min=0, temp;for (i=1; iai) min=i;temp=amin;j=min;while (j0)aj=aj-1;j-;a0=temp;for (i=1; in; i+)if (amaxai) max=i;temp=amax;j=max;while (jn-1)aj=aj+1;j+;an-1=temp;main()int an=8,5,6,9,4,1,-1,7,3,2;int i;crl(a);for (i=0; in; i+) printf(“%5d”,ai);printf(“n”);6# include # include int replace_string(char line , char str1 , char str2 )int i=0, j, loc;char temp80;while(i=strlen(line)-strlen(str2)j=0; loc=i;while(str1j= =lineloc&str1j!=0)loc+; j+; if (str1j= =0)strcpy(temp, &lineloc);strcpy(&linei, str2);i+=strlen(str2);strcpy(&linei, temp);return 1;else i+;return 0;习 题 7 一、选择题1.a 2.a 3. d 4.c 5. a6.c 7.b 8.c 9.b10.d二、填空题1a=0,b=7 21103204abc,abc,bc,bc,c,c,51 46. len+ p+三、编程题1、编写一个程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔地输出该字符串,请用指针完成。main()char ch20=computer,*p=ch; int i; for(i=0;i0) strcpy(p,p1);strcpy(p1,p2); strcpy(p2,p); p1=str1;p2=str3; if(strcmp(str1,str3)0) strcpy(p,p1);strcpy(p1,p2); strcpy(p2,p); p1=str2;p2=str3; if(strcmp(str2,str3)0) strcpy(p,p1);strcpy(p1,p2); strcpy(p2,p); printf(now,the order is:n); printf(%sn%sn%sn,str1,str2,str3);3、求一个33矩阵主对角线元素之和。main()int a33,*p,i,s=0; for(i=0;i3;i+) scanf(%d%d%d,&ai0,&ai1,&ai2); p=&a00; for(i=0;i3;i+) s=s+*(p+3*i+i); printf(%dn,s);4、将一个33矩阵转置。main()int a33,*p; int i,j,t; printf(input matrix:n); for(i=0;i3;i+) scanf(%d%d%d,&ai0,&ai1,&ai2); p=&a00; for(i=0;i3;i+) for(j=i;j3;j+) t=*(p+3*i+j); *(p+3*i+j)=*(p+3*j+i); *(p+3*j+i)=t; printf(now,matrix:n); for(i=0;i3;i+) printf(%d %d %dn,ai0,ai1,ai2);5、输出给定的字符串中某一个字符前面的一串字符。如指定字符a,则对字符串fortran program,输出fortr。若无指定字符,则输出相应的提示信息。#includemain()int i,n=0; char *ptr,str10,ch; printf(input a string:n); scanf(%s,str); ptr=str; getchar(); printf(please input a charactern); scanf(%c,&ch); while(ch=n) printf(please input a character again!); scanf(%c,&ch); while(*ptr!=ch) ptr+;n+; for(i=0;in;i+) printf(%c,*(str+i);注意:本题中getchar()的作用是吸收键入给第一个scanf函数的字符串尾部的回车符,如果无getchar(),则将无法正确输入字符给变量ch。6、输入一行字符,计算其中大写字母、小写字母、数字、空格及其他字符的数目。#include main()int upper=0,lower=0,digit=0,space=0,other=0,i=0; char *p,s20; printf(input a string:); while(si=getchar()!=n) i+; p=s;/*使p指向数组s的首地址*/ while(*p!=n) if(a=*p)&(*p=z) +upper; else if(a=*p)&(*p=z) +lower; else if(*p= ) +space; else if(*p=0) +digit; else +other; p+; printf(upper case:%d lower case:%d ,upper,lower); printf(space:%d digit:%d other:%dn,space ,digit,other);7、从一个给定的字符串中找出某一子字符串的位置(从1开始)。例如子串“efg”在字符串“abcdefghijk”中位置为5。若字符串中没有指定的子串,则标记为0。#includemain()int i,n=0; char str120,str220,str320; char *p1=str1,*p3=str3,*p=str1; printf(input a string:n); gets(str1); printf(please input a substring:n); gets(str2); n=strlen(str2); while(*p1!=0) for(i=0;in;i+)/*本for循环用于生成与str2进行比较的字符串*/ *p3=*p+;p3+; *p3=0;/* 在新生成的字符串尾添加结束符 */ if(strcmp(str3,str2)=0)/*新生成的字符串存放在str3中*/ printf(substrings position is:%dn,p1-str1+1); p1=0; else p1+;/*使p指向字符串str1的下一字符*/ p=p1; p3=str3;/*使p3重新指向数组str3首地址*/ if(*p1=0) printf(substring is not in the string!);注意:由于gets函数可以接收带有空格的字符串,所以本题中采用gets而未采用不可接收带空格字符串的函数scanf。8、编程删除字符串中的所有空白字符。main()char str120,str220; char *p1,*p2; printf(please input a string:n); gets(str1); /*str1用于存放原始字符串*/ p1=str1; p2=str2; /*str2用于存放去掉空格后的字符串,使p2指向str2*/ while(*p1!=0) if(*p1!= ) *p2=*p1+;/*将原始字符串中的字符依次赋值给str2*/p2+; else p1+; /* 遇空格符,只移动指针p1,而不把空格符赋值给str2 */ printf(new string is:n%sn,str2);9、有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。main() int i,num20,*p,n=0,m,k; printf(input the number of people:n=); scanf(%d,&n); for(i=0;in;i+) numi=i+1;/*以1至n为序给每个人编号*/ p=num; m=0;/* m为退出人数*/ i=0; /* i为每次循环时的计数变量*/ k=0;/* k为按1,2,3报数时的计数变量*/ while(mn-1)/*当退出人数比n-1少时(未退出人数大于1时)执行循环体*/ if(*(p+i)!=0) k+; if(k=3)/*本if分支对退出的人的编号赋值为0*/ *(p+i)=0; k=0;/*重新从1到3报数*/ m+;/*退出人数加1*/ i+; if(i=n) i=0;/*报数到一圈人的尾部时,i恢复为0,也即使人围成一圈*/ while(*p=0) p+; printf(the last one is no.%dn,*p);10、有一个字符串,包含n个字符。编程实现:将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。main() char str120,str220; char *p=str1; int n,m,i; printf(please input a string:n); gets(str1); n=strlen(str1); printf(which character that begin to copy?); scanf(%d,&m); if(nm) printf(input error!); else for(i=0;ifj-1)”应改成“if(fjfj-1)”。第3处错误:在主函数中定义数组时使用了“int an=4,7,-3,2,10,17,1,6,9,-4;”这样的形式,其中n是变量,而根据数组的定义我们知道,在定义数组时中表示的是数组元素的个数,必须由“常量表达式”组成,而不能是变量。因此,只要将n改成10即可。第4处错误:在主函数中,调用函数dbubble()时调用方式不对。原调用方式是“void dbubble(n,a);”,此处有两个错误,一是以语句方式调用函数时,其前面不能有“void”,应去掉;二是实参的顺序与函数dbubble()定义时的顺序不一致。因此,本错误应改成“dbubble(a,n);”。2、参考答案与分析:分析:第1处错误:在函数find()的头部定义出错。函数头部定义为“void find(int a5)”,在二维数组的名字作为形参时,必须明确第二维的大小,第一维可以省略;但不能省略第二维中的每行的元素个数。因此,可以改成“void find(int a5)”或“void find(int a55)”。第2处错误: 这处错误应在计算列元素之和的语句“for(row=0;row5;row+) sum2+=ajrow;”中。由于要求的是列元素之和,则列下标不应该变,而变化的是行下标。因此,可以将本处错误改成“for(row=0;row5;row+) sum2+=arowj;”。第3处错误: 在c语言中,判断两个整数是否相等用的运算符是“=”,而“=”是赋值运算符,所以这处错误在“if(sum1=sum2) printf(a%d%d: %dn,i,j,aij);”语句中。应该改成“if(sum1=sum2) printf(a%d%d: %dn,i,j,aij);”。第4处错误:这处错误出现在主函数中,在调用find()函数时,由于定义find()函数时形参只有一个,即二维数组的数组名,但在调用时却有两个实参,显然是错误的。应将语句“find(a,5);”改成“find(a);”四、编程题1、参考答案:#include #define m 10main() int k; int jiec(int k); /*声明函数*/ float s=0; printf(“ 计算代数式的值nn”); for(k=1;k=m;k+) s+= 1.0/jiec(k); /*函数以表达式方式调用*/ printf(“计算结果为:s=%fn”,s); int jiec(k) /*计算阶乘值的函数,函数名前的int表示返回值的类型*/int k; int s,i; s=1; for(i=1;i=k;i+) s*=i; /*计算1*2*3*k,并将计算结果赋值给变量s*/ return(s); /*将计算得的阶乘值返回调用函数(这里是主函数)*/ 2、参考答案:#include #include int shushu(int n) int j,k=0; /*计数变量k清零*/for(j=2;j=sqrt(n);j+)if(n%j=0) k+; if(k!=0) return(0); else return(1); main() int n,k; printf(“please input n:”); scanf(“%d”,&n); k=shushu(n); if(k=0) printf(“nno!”); else printf(“nyes!”);3、参考答案:int str_len(char *str)int k=0; while(*str!=0) k+; str+; return(k);main() char s80; printf(“please input a string:”); gets(s); printf(“nthe string length is : %d”,str_len(s);4、参考答案:#include #include void ex(int k,char str) int a,b,c,d; a=k/1000; b=k/100%10; c=k/10%10; d=k%10; str0=0+a; str1=0+b; str2=0+c; str3=0+d; main() int i,k; char s4; do printf(请输入一个4位整数:)

温馨提示

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

评论

0/150

提交评论