C语言教材课后习题参考答案_第1页
C语言教材课后习题参考答案_第2页
C语言教材课后习题参考答案_第3页
C语言教材课后习题参考答案_第4页
C语言教材课后习题参考答案_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

习题参考答案

习题1

一、选择题

1、B2、C3、B4、D5、A6、B7C

二、填空题

1、源程序文件c2、obj3、可执行文件exe

4、机器语言汇编语言高级语言

三、解答题

四、编程题

1、

main()

(

printf("Hello!WelcometoChina!");

)

2、

main()

{intx;

scanf("%d",&x);

if(x>=20&&x<1000)printf("x=%d",x)

elseprintf(uInputerror!,r);

)

习题2

一、选择题

1、c2、A3、B4、D5、A

6、D7、B8、B9、B10、D

11、D12、B13、A14、B15、C

二、填空题

1、整型、实型、字符型

2、用户标识符、关键字标识符

3、存储单元、符号地址、内存地址

4、十、十六、八

5、double(双精度型)

6、8

7、5.500000

8、a=-32768

习题参考答案

9、+0017,021,0x11

三、写程序运行结果

3257

3257

7.88,-345.12,7.8765,-345.1230

7.87654e+00,-3.5e+02

a,97,141,61

1234,2322,4d2

CHINESE,CHI

四、scanf函数的使用

a=3b=7

8.571.82

Aa

五、用scanf函数输入数据

1020Aal.5-3.75123.45,67.8

注意,其中123.45可以是任意实数,因为该值将被跳过,不用于赋值。

习题3

一、选择题

1.C2.B3.D4.D

二、填空题

基本概念题

1.2

2.2

3.1

阅读程序写出运行结果题

4.1.00

5.1,0,1

6.9,11,9,10

三、写出下面表达式运算后a的值,设原来a=12。

(I)24(2)10(3)60(4)0(5)0(6)0

习题4

一、选择题

1、B2、D3、B4、D5、A6、C

二、填空题

1、1,0,12、1,2,3

3、chl〉='A'&&chl〈二'Z'chi=ch1-32;

三、编程题

296

1、从键盘输入三个数,然后按照由小到大的顺序输出。要求,设三个数放在变量a、b、

c中,最后仍然按照a、b、c的顺序输出。

^include<stdio.h>

main()

{inta,b,c,t;

scanf("%d,%d,%d“,&a,&b,&c);

if(a>b){t=a;a=b;b=t;}

if(a>c){t=a;a=c;c=t;}

if(b>c){t=b;b=c;c=t;}

printf("%d,%d,%d\nw,a,b,c)

)

2、编写程序根据以下的函数关系,对输入的x值输出相应的y值。

Xy

2<x<=10x(x+2)

-l<x<=22x

X<=-1X-1

#include<stdio.h>

main()

{floatx,y;

scanf(“%f",&x);

if(x<=-l)

y=x-l;

elseif(x<=2)

y=2*x;

elseif(x<=10)

y=x*(x+2);

elseprintf("Error!\n");

printf(wy=%f\nw,y);

)

3、求一元二次方程ax2+bx+c=0的解。

^include<math.h>

main()

{floata,b,c,d,disc,xl,x2,realpart,imagpart;

scanf(%f,%f,”,&a,&b,&c);

if(fabs(a)<=le-6)

Printf(isnotaquadratic);

else

习题参考答案

{disc=b*b-4*a*c;

if(fabs(disc)<=le-6)

printf("hastwoequalroots:%8.4\nw,-b/(2*a));

elseif(disc>le-6)

{xl=(-b+sqrt(disc))/(2*a);

x2=(-b-sqrt(disc))/(2*a);

printf(uhasdistinctrealroots:%8.4fand%8.4f\n”,xl,x2);

)

else

{realpart=­b/(2*a);

imagpart=sqrt(-disc)/(2*a);

printf("hascomplexroots:\n");

printf(u%8.4f+%8.4fi\n”,realpart,imagpart);

printf(u%8.4f-%8.4fi\n",realpart,imagpart);

)

)

}

4、假设工资税率如下,其中s代表工资,r代表税率:

s<500r=0%

500<=s<1000r=5%

1000<=s<2000r=8%

2000<=s<3000r=10%

3000<=sr=15%

编一程序实现从键盘输入一个工资数,输出实发工资数。要求使用switch语句。

main()

{intsalarly,r,g;

scanf(“%d",&salarly);

if(salary>=3000)r=0.15;

else

{g=salary/500;

switch(g)

{1:r=0.05;

2:

3:r=0.08;

4:

5:r=0.10;

)

)

298

salary=salary*。-r);

printf(<<%d\n,?,salary);

)

习题5

一、选择题

1、A2、C3、C4、D5、A6、A

7、A8、B9、C10、B11、B12、D

二、填空题

1、continue

2、[l]n<=999或n<1000[2]n%10

3、[l]x>=0或x>=0.0[2]x<min或x<=min

4、[1]i<10[2]j%3!=0

5、[l]t=l[2]n<=i

6、[l]n[2]flag=l[3]n—

7^[1]j<i[2]1/term

8、[l]sum<k[2]j-2

三、编程题

1、

^include<stdio.h>

main()

{intm,n,p,r,temp;

printf("Pleaseinputm,n:");

do

{scanf(,&m,&n);

}while(m<=:0||n<=0);

if(n<m)

{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("最大公约数为:%d\n",n);

printf("最小公倍数为:%d\n",p/n);

)

2、

^include<stdio.h>

main()

{charc;

intletter=0,space=0,digit=O,other=0;

printf("Pleaseinputalinecharacter:;

习题参考答案

while((c=getchar())!=,\n9)

{if(c>=,&&c<=,z9||c>=,A'&&c<=,Z')letter++;

elseif(c=='')space++;

elseif(c>=,O'&&c<=,9')digit++;

elseother++;

)

printf(^Letteris%d,Spaceis%d,Digitis%d,Other

is%d,”,letter,space,digit,other);

)

3、

main()

{intm,s,i;

for(m=2;m<1000;m++)

{s=0;

for(i=l;i<m;i++)

if((m%i)=0)s=s+i;

if(s==m)

{printf("%ditsfactorsare”,m);

for(i=l;i<m;i++)

if(m%i==0)printf(“%d,”,i);

printf("\n”);

)

)

)

4、

main()

{inti,a,min,max;

scanf(,&a);

min=a;max=a;

for(i=2;i<=100;i++)

{scanf(,&a);

if(a<min)min=a;

if(a>max)max=a;

)

printf("Max=%d,Min二%d\n”,max,min);

)

5、

^include<stdio.h>

-defineN20

main()

{inti,t;

floata-2,b=l,s=0;

for(i=l;i<=N;i++)

{s=s+a/b;

300

t=a;

a=a+b;/*将前一项的分子与分母之和作为下一项的分子*/

b=t;/*将前一项的分子作为下一项的分母*/

)

printf("Sum=%f\n”,s);

)

6、问题分析:设王先生的岁数是x,他夫人的岁数是y,可得到如下方程组:

'J+>=1053

x+y2=873

这是一个非线性方程组的求解,无法手算求解,可以用穷举法求解。考虑到实际可能,

x、y可以在20—100范围内取值,逐一穷兴出x、y所有可能的取值判断是否满足上述方程

组,若满足,这一组解就是要求的解。程序如下:

main()

{intx,y;

for(x=20;x<=100;x++)

for(y=20;y<=100;y++)

if(x*x+y==1053&&x+y*y=873)

printf(“x=%dy=%d\nw,x,y);

main()

(

longintk,g,s=0;

printf(z,Pleaseinputaninteger:,z);

scanf&k);

do

{g=k%10;

printf("%2d”,g);

k=k/10;

}while(k!=0);

)

8、

(1)

main()

{inti,j;

for(i=l;i<=9;i++)

{for(j=i;j<=9;j++)

printf(n%d*%d=%2d

printf(,'\nn);

(2)

习题参考答案

main()

{inti,j,k;

for(i=l;i<==9;i++)

(

for(k=l;k<i;k++)

printf(〃”);

for(j=i;j<=9;j++)

printf(,,%d*%d=%2d〃,i,j,i*j);

printf(〃\n〃);

)

)

9、

^include<stdio.h>

main()

{inti=0;

longs,n,j,x;

for(j=100;j<=999;j++)

{s=0;x=j;

while(x>0)/*求原数j的反序数*/

{s=s*10+x%10;

x=x/10;

)

if(s=j)/*判断反序数s与原数j是否相等*/

{i++;printfj);

if(i%10==0)printf(〃\n〃);/*每行输出10个回文数*/

)

)

)

10、

#include<stdio.h>

main()

{intx,y,z;

for(x=l;x<20;x++)

for(y=l;y<33;y++)

for(z=3;z<100;z+=3)

{if((x*5+y*3+z/3)==100&&x+y+z==100)

printf("公鸡有%d只,母鸡有刎只,小鸡有%d只\n",x,y,z);

)

)

11、

#include<stdio.h>

#include<math.h>

main()

302

{intn=l;doublex,sum=0,term=l.0;

scanf("%lf",&x);

while(fabs(term)>=le-6)

{sum+=term;

term*="x*x/(n*(n+1));

n=n+2;

)

printf(acos(%lf)=%lf,%lf\nw,x,sum,cos(x));

)

12、

问题分析:

用迭代法求平方根的算法如下:

(1)设定一个x的初值xO;

(2)用上述公式求出x的下一个值xl;

(3)再将xl代入上述公式,求出x的下一个值x2;

(4)如此继续下去,直到前后两次求出的X值(XM和X。满足,用一相|<10-5。

为便于程序处理,令x的初值x0=a/2(也可以是其他值),求出XI。程序实现如下:

#include<math.h>

main()

{floata,xO,xl;

printf(uPleaseinputapositivenumber:,,);

scanfC^f\&a);/*输入a的值*/

x0=a/2;

xl=(x0+a/x0)/2;

do

{xO=xl;

xi=(x0+a/x0)/2;

}while(fabs(x1-x0)>=1e-5);

printf(4tThesquarerootof%fis%f,thetruerootis%f\n”,a,x1,sqrt(a));

)

13、

程序如下:

#include<math.h>

main()

{floatx,xO,f,fl;

x=1.5;

do

{xO=x;

f=((2*x0-4)*x0+3)*x0-6;

fl=(6*x0-8)*x0+3;

x=xO-f/fl;/*进行牛顿迭代*/

while(fabs(x-x0)>=le-5);

习题参考答案

printfC'Therootis%f\n,,,x);

)

14、

#include<stdio.h>

^include<math.h>

#defineepsilon0.00001/*定义要求的精度*/

floatf(floatx)/*求函数值*/

{return(2*x*x*x-4*x*x+3*x-6);

)

main()

{floata,b,x;

scanf&a,&b);/*输入求根区间*/

if(f(a)*f(b)>=0)/*判断是否符合二分法使用的条件*/

{printf(〃不满足二分法使用条件,退出!〃);exit(0);}

do

{x=(a+b)/2;

if(f(x)*f(b)<0)/*如果成立,则根在区间的右半部分*/

a=x;

else/*否则根在左半部分*/

b=x;}

while(fabs(b-a)>=epsilon);/*判断是否达到精度要求,如果没达到,继续循环*/

x=(b+a)/2;/*取最后的小区间中点作为根的近似值*/

printf(,zx=%f\nz,,x);/*输出函数的近似根*/

)

15、

#defineN4

main()

{inti,j,k;

for(i=0;i<N;i++)

{for(j=0;j<N-i-l;j++)printf(HM);

for(j=N;j>=N-i;j-)printf。*");

for(j=N-l;j>=N-i;j-)printf("*");

for(j=0;j<N-i-1;j++)printf("");/*本行也可以不要*/

printf(”\n”);

习题6

一、选择题

1.B2.D3.D4.D5.A6.C

二、填空题

阅读程序写出运行结果题

1.第一行:143

304

第二行:258

2.第一行:124

第二行:357

第三行:689

三、编程题

1.#include<stdio.h>

main()

(

charstri[20],str2[10];

inti=0,j=0;

gets(strl);

gets(str2)^

while(strl[i]!=,\0,)i++;

while(str2[j]!=,\0,)strl[i++]=str2[j++];

strl[i]=,\0,;

puts(strl);

)

2.#defineM3

#defineN4

#include<stdio.h>

main()

(

inti,j,m;

inta[M][N]={1,2,3,4,5,6,7,8,9,10,11,12},pp[N];

for(j=0;j<N;j++)

(

m=a[0]|jJ;/*将m值设为每一列的第一行元素的值*/

for(i=0;i<M;i++)/*找每一列的最小值,赋给m*/

if(a[i][j]<m)m=a[i][j];

pp[jl=m;/*将每一列的最小值m存入pp数组*/

)

for(j=0;j<N;j++)/*输出pp数组*/

printf(4t%d2pp[j]);

3.#include<stdio.h>

voidfind(inta[5][5])

{inti,j,row,col,suml,sum2;

for(i=0;i<5;i++)

for(j=0;j<5;j++)

{suml=sum2=0;

for(col=0;col<5;col++)

suml+=a[ij[colj;

习题参考答案

for(row=0;row<5;row++)

sum2+=a[row][j];

if(suml==sum2)

printfCta[%d][%d]:%d\n,\ij,a[i][j]);

main()

{inli,j,a[5][5]={{2,81,9,4},{5,7,l,3,0},{7」,7,5,2},{3,221,5},{0,21,6,8}};

for(i=0;i<5;i++)

{forG=O;j<5;j++)

printf("%4d”,a[i][j]);

printf("\n”);

find(a);

)

4.

#include<stdio.h>

#include<stdlib.h>

main()

{inta[3][5],x,y,i,j,k,flag=0;

intmax,min;

for(i=0;i<3;i++)

for(j=0;j<5;j++)scanf(”%d”,&a[i][j]);/**/

for(i=0;i<3;i++)

{max=a[i][0];y=0;

for(k=l;k<5;k++)if(max<a[i][k]){y=k;max=a[i][k];}

min=a[i][y];x=i;

for(k=0;k<3;k++)if(min>a[k][yj){x=k;min=a[k][y];}

if(i==x){printf(,,a[%d][%d]=%disAndian\nu,x,y,a[x][y]);flag=l;}

)

if(flag==0)printf(n\nNotfoundAndian!,1);

)

5.#include<stdio.h>

#defineN10

voidcrl(inta[J)

{inti,j,max=0,min=0,temp;

for(i=l;i<N;i++)

if(a[min]>a[i])min=i;

temp=a[min];

j=min;

while(j>0)

{a[j]=a|j-l];

306

a[O]=temp;

for(i=l;i<N;i++)

if(a[max]<a[i])max=i;

temp=a[maxl;

j=max;

while(j<N-l)

{a|j]=a[j+l];

j++;

)

a[N-l]=temp;

)

main()

{inta[N]={8,5A9,4,1,-1,7,3,2);

inti;

crl(a);

for(i=0;i<N;i++)printf("%5d”,a[i]);

printf("\n”);

)

6.#include<stdio.h>

#include<string.h>

intReplace_string(charline[],charstrl[],charstr2[])

{inti=0,j,loc;

chartemp[80];

while(i<=strlen(line)-strlen(str2))

{j=0;loc=i;

while(strl[jj==line[locj&&strl[j]!=,\0,)

{loc++;j++;}

if(strl[j]==,\O,)

{strcpy(temp,&line[loc]);

strcpy(&line[i],str2);

i+=strlen(str2);

strcpy(&line[i],temp);

return1;

)

elsei++;

)

return0;

)

习题7

一、选择题

习题参考答案

1.A2.A3.D4.C5.A

6.C7,B8.C9.B10.D

二、填空题

1.a=0,b=7

2.110

3.20

4.abc,ABC,be,BC,c,C,

5.14

6.len++p++

三、编程题

1、编写一个程序,将字符串computer赋给一个字符数组,然后从第一个字母开始间隔

地输出该字符串,请用指针完成。

main()

/z,,

{charch[20]=computer)*p=ch;

inti;

for(i=0;i<strlen(ch);i+=2)

printf(〃枇",*(p+i));

)

2、输入3个字符串,按由小到大的顺序输出。

main()

{charstrl[20],str2[20],str3[20];

charcharp[20],*pl,*p2;

printf(''Inputthreelindes:\nz,);

gets(strl);gets(str2);gets(str3);

pl=strl;p2=str2;

if(strcmp(strl,str2)>0)

{strepy(p,pl);strepy(pl,p2);strepy(p2,p);}

pl=strl;p2=str3;

if(strcmp(strl,str3)>0)

{strepy(p,pl);strepy(pl,p2);strepy(p2,p);}

pl=str2;p2=str3;

if(stremp(str2,str3)>0)

{strepy(p,pl);strepy(pl,p2);strepy(p2,p);}

printf(^Now,theorderis:\n,z);

printf(,z%s\n%s\n%s\n/z,strl,str2,str3);

)

3、求一个3X3矩阵主对角线元素之和。

main()

308

{inta[3][3],*P,i,s=0;

for(i=0;i<3;i++)

scanf(zz%d%d%d/z,&a[i][0],&a[i][l],&a[i][2]);

p=&a[0][0];

for(i=0;i<3;i++)

s=s+*(p+3*i+i);

printf("%d\n”,s);

)

4、将一个3X3矩阵转置。

main()

{inta[3][3],*p;

inti,j,t;

printf("'Inputmatrix:\nz,);

for(i=0;i<3;i++)

scanf(z,%d%d%dz,,&a[i][0],&a[i][1],&a[i][2]);

p=&a[0][0];

for(i=0;i<3;i++)

for(j=i;j<3;j++)

{t=*(p+3*i+j);

*(p+3*i+j)=*(p+3*j+i);

*(p+3*j+i)=t;

}

printf("Now,matrix:\n,z);

for(i=0;i<3;i++)

printf(z,%d%d%d\n〃,a[i][0],a[i][1],a[i]⑵);

)

5、输出给定的字符串中某一个字符前面的一串字符。如指定字符'a',则对字符串

Fortranprogram”,输出〃Fortr〃。若无指定字符,则输出相应的提示信息。

#include<stdio.h>

main()

{inti,n=0;

char*ptr,str[10],ch;

printf("Inputastring:\nz/);

scanf(〃%s〃,str);

ptr=str;

getchar();

printf("Pleaseinputacharacter\nzz);

scanf&ch);

习题参考答案

while(ch二二'\n)

{printf("Pleaseinputacharacteragain!");

scanf(〃%c〃,&ch);

)

while(*ptr!=ch)

{ptr++;n++;}

for(i=0;i<n;i++)

printfC%c",*(str+i));

}

注意:本题中getcharO的作用是吸收键入给第一个scanf函数的字符串尾部的回车符,

如果无getchar(),则将无法正确输入字符给变量cho

6、输入一行字符,计算其中大写字母、小写字母、数字、空格及其他字符的数目。

-include<stdio.h>

main()

(intupper=0,lower=0,digit=O,space=0,other=0,i=0;

char*p,s[20];

printf("Inputastring:");

while((s[i]=getchar())!=,\n)i++;

p=s;/*使p指向数组s的首地址*/

while(*p!=,\n)

{if(<>A,<=*p)&&(*p<=,Z,))

++upper;

elseif(('a'<=*p)&&(*p<='z'))

++lower;

elseif(*p='')

++space;

elseif((*p<='9')&&(*p>='O'))

++digit;

else

++other;

p++;

)

printf(/zuppercase:%dlowercase:%dz/,upper,lower);

printf(,zspace:%ddigit:%dother:%d\n,z,space,digit,other);

)

7、从一个给定的字符串中找出某一子字符串的位置(从1开始)。例如子串“efg”在

字符串“abcdefghijk”中位置为5。若字符串中没有指定的子串,则标记为0。

ttinclude<stdio.h>

310

main()

{inti,n=O;

charstr1[20],str2[20],str3[20];

char*pl=strl,*p3=str3,*p=strl;

printf("'Inputastring:\n,z);

gets(str1);

printf("Pleaseinputasubstring:\n");

gets(str2);

n=strlen(str2);

while(*pl!=,\0?)

{for(i=0;i<n;i++)/*本for循环用于生成与str2进行比较的字符串*/

{*p3=*p++;

p3++;

}

*p3='\0';/*在新生成的字符串尾添加结束符*/

if(strcmp(str3,str2)==0)/*新生成的字符串存放在str3中*/

{printf("substring'spositionis:%d\n,z,pl-strl+1);

pl=\05;

else

{pl++;/*使P指向字符串strl的下一字符*/

P=pl;

p3=str3;/*使p3重新指向数组str3首地址*/

)

if(*pl='\O')printf("Substringisnotinthestring!");

)

注意:由于gets函数可以接收带有空格的字符串,所以本题中采用gets而未采用不可

接收带空格字符串的函数scanfo

8、编程删除字符串中的所有空白字符。

main()

{charstrl[20],str2[20];

char*pl,*p2;

printf(,zPleaseinputastring:\nz,);

gets(strl);/*strl用于存放原始字符串*/

pl=strl;

p2=str2;/*str2用于存放去掉空格后的字符串,使p2指向str2*/

while(*pl!=\0?)

习题参考答案

{if(*pl!='')

{*p2=*pl++;/*将原始字符串中的字符依次赋值给str2*/

p2++;

else

P1++;/*遇空格符,只移动指针pl,而不把空格符赋值给str2*/

)

printf("Newstringis:\n%s\n”,str2);

)

9、有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3

的人退出圈子,问最后留下的是原来第几号的那位。

main()

{inti,num[20],*p,n=0,m,k;

printf("Inputthenumberofpeople:n=H);

scanf(H%d",&n);

for(i=0;i<n;i++)

num[i]=i+l;/*以1至n为序给每个人编号*/

p=num;

m=0;/*m为退出人数*/

i=0;/*i为每次循环时的计数变量*/

k=0;/*k为按1,2,3报数时的计数变量*/

while(m<n-l)当退出人数比n-1少时(未退出人数大于1时)执行循环体*/

{if(*(p+i)!=O)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("ThelastoneisNO.%d\n'r,*p);

10、有一个字符串,包含n个字符。编程实现:将此字符串中从第m个字符开始的全部

字符复制成为另一个字符串。

main()

{charstrl[20J,str2[20];

char*p=strl;

intn,m,i;

printf("Pleaseinputastring:\nH);

gets(strl);

312

n=strlen(strl);

printf(nWhichcharacterthatbegintocopy?,1);

scanf(u%d",&m);

if(n<m)

printf("inputerror!");

else

{for(i=0;i<n-m+1;i++)

*(str2+i)=*(p+m-1+i);

*(str2+i)='\0,;

)

printfC'Newstringis:\n%s\nu,str2);

习题8

一、选择题

1、C2、A3、D4、D5、A6^A7、A8、C9、A10、B

11>B12、C13、B14、C15、B16、C17>B18、D19、B20、B

二、填空题

1main2、scanfgets3、24^auto5、1,26、3235

7、5,258、159、310、6,72011、912、[l]x[2]x-f(x)/fl(x)

三、改错题

1、参考答案与分析:

分析:

第1处错误:题目中已经告诉我们“函数voiddbubble(int*f,intn)的功能是“,但在程序

的第2行定义函数时头部就与题目要求不一致,因此,第I处错误就在第2行,只要将第2

行改成"voiddbubble(int*f,intn)”即可。

第2处错误:在函数dbubble。中的第二个内循环(反向冒泡),题目要求很清楚:“从

f[n-2]开始(i=n-2),比较f[i]与若f[i]小于则交换f[i]和两个元素的值,”,

所以,其中的"if(f|j]>f]j-l])w应改成<<if(fU]<f[i-l]),,o

第3处错误:在主函数中定义数组时使用了“inta[n]={4,7,-3,2』0』7,l,6,9,-4};”这样的

形式,其中n是变量,而根据数组的定义我们知道,在定义数组时口中表示的是数组元素的

个数,必须由“常量表达式”组成,而不能是变量。因此,只要将n改成10即可。

第4处错误:在主函数中,调用函数dbubble。时调用方式不对。原调用方式是“void

dbubble(n,a);",此处有两个错误,一是以语句方式调用函数时,其前面不能有“void”,应

去掉;二是实参的顺序与函数dbubble()定义时的顺序不一致。因此,本错误应改成

“dbubble(a,n);w()

2、参考答案与分析:

分析:

第1处错误:在函数find。的头部定义出错。函数头部定义为“voidfind(inta[5][]),\

在二维数组的名字作为形参时,必须明确第二维的大小,第--维可以省略;但不能省略第二

维中的每行的元素个数。因此,可以改成“voidfind(inta[”D”或“voidfind(inta[5]L5])\

第2处错误:这处错误应在计算列元素之和的语句"for(row=0;row<5;row++)

sum2+=a|jJlrow];”中。由于要求的是列元素之和,则列下标不应该变,而变化的是行下标。

习题参考答案

因此,可以将本处错误改成ufor(row=0;row<5;row++)sum2+=a[row][j];,,o

第3处错误:在C语言中,判断两个整数是否相等用的运算符是“二=",而“二”是赋

值运算符,所以这处错误在<<if(suml=sum2)printf(”a[%d][%d]:%d\n”,i,j,a[i皿);”语句中。

应该改成aif(suml==sum2)printf(na[%d][%d]:%d\nu,i,j,a[i][j]);,,o

第4处错误:这处错误出现在主函数中,在调用find。函数时,由于定义find。函数时形

参只有一个,即二维数组的数组名,但在调用时却有两个实参,显然是错误的。应将语句

“find(a,5);"改成“find(a);”

四、编程题

1、参考答案:

#include<stdio.h>

#defineM10

main()

{intk;

intjiec(intk);/*声明函数*/

floats=0;

printff4计算代数式的值\n\n");

for(k=l;k<=M;k++)

s+=1.0/jiec(k);/*函数以表达式方式调用*/

printf(“计算结果为:s=%f\n,,,s);

)

intjiec(k)/*计算阶乘值的函数,函数名前的int表示返回值的类型*/

intk;

{ints,i;

s=l;

for(i=l;i<=k;i++)s*=i;/*计算1*2*3*…*k,并将计算结果赋值给变量s*/

return(s);/*将计算得的阶乘值返回调用函数(这里是主函数)*/

)

2、参考答案:

#include<stdio.h>

#include<math.h>

intshushu(intn)

{intj,k=0;/*计数变量k清零*/

for(j=2;j<=sqrt(n);j++)

if(n%j=0)k++;

if(k!=0)retum(O);

elsereturn(l);

)

main()

{intn,k;

printfC'Pleaseinputn:");

scanf("%d",&n);

k=shushu(n);

314

if(k==O)printf("\nNO!‘‘);

elseprintfC'XnYes!");

)

3、参考答案:

intstr_len(char*str)

{intk=0;

while(*str!=,\O,){k++;str++;}

retum(k);

)

main()

{chars[80];

printfCTleaseinputastring:,,);

gets(s);

printf(tl\nThestringlengthis:%d,,,str__len(s));

)

4、参考答案:

#include<stdio.h>

#include<string.h>

voidex(intk,charstr[])

{inta,b,c,d;

a=k/1000;b=k/100%10;c=k/10%10;d=k%10;

str[0]=,0,+a;str[l]=O+b;str[2]=,0,+c;str[3]=*0,+d;

)

main()

{inti,k;

chars[4];

do{

printf("请输入一个4位整数:");

scanf(M%dM,&k);}while(!(k>=1000&&k<=9999));

ex(k,s);

for(i=0;i<4;i++)printf(H%cu,s[iJ);

)

5、参考答案:

#include<stdio.h>

voidzhuanzhi(inta[]l3J)

{inti,j,t;

for(i=0;i<3;i++)

for(j=i+l;j<3;j++)

{t=a[i]|j];

a[i]U]=aU][i];

aUWH;

习题参考答案

main()

{intb[3][3],ij;

for(i=0;i<3;i++)

for(j=0;j<3;j++)

scanf("%dr\&b[i][j]);

zhuanzhi(b);

for(i=0;i<3;i++)

{for(j=0;j<3;j++)

printf(H%d",b[i][j]);

printf(u\nu);

)

)

6、参考答案:

#include<stdio.h>

voidduihuan(intalJ)

{intmax,min,i,j,k,temp;

max=min=a[OJ;j=k=O;

for(i=0;i<10;i++)

{if(a[i]>max){max=a[i];j=i;}

if(a[i]<min){min=a[i];k=i;}

)

if(j!=O){temp=a[jj;a[j]=a[9];a[9]=temp;}

if(k!=9){temp=a[0J;a[0]=a[k];a[k]=temp;}

)

voidinput(inta[])

{inti;

for(i=0;i<10;i++)scanf("%dn,&a[i]);

)

voidoutput(inta[J)

{inti;

printf(n\nu);

for(i=0;i<10;i++)printf(u%dM,a[i]);

)

main()

{intb[10];

input(b);

duihuan(b);

output(b);

)

7、参考答案:

#include<stdio.h>

#defineN10

316

voidsort(chars[])

{intij;

chart;

for(i=l;i<N;i++)

for(j=0;(j<N-j)&&(s[i]!='\O1);j++)

if(sU]>sU+l])

{t=s[j];s[j]=s[j+l];s[j+l]=t;}

)

main()

{charstr[8O];

printf("请输入一个字符串:");

gets(str);

sort(str);

printf(n\n排序后的字符串是:%s\str);

)

8、参考答案:

#include<stdio.h>

intletter,digit,space,other;

voidfunc(chars[])

{inti;

for(i=0;s[i]!=,\0';i++)

{if(s[i]>=,a'&&s[i]<=>z'||s[i]>=,A,&&s[i]<='Z,)letter++;

elseif(s[i]=-*)space++;

elseif(s[i]>='0,&&s[i]<=,9,)digit++;

elseother++;

)

)

main()

{charstr[8OJ;

printf("\nPleaseinputastring:");

gets(str);

letter=0;digit=0;space=0;other=0;

func(str);

printf("Letteris%d,Spaceis%d,Digitis%d,Otheris%d,",letter,space,digit,other);

)

9、参考答案:

#include<stdio.h>

voidconvert(intn)

{inti;

if((i=n/10)!=0)convert(i);

putchar(n%10+'0');

main()

习题参考答案

{intnumber;

printf("\nPleaseinputaninteger:");

scanf(M%dM,&number);

printf(,'\nOutput:u);

if(number<0)

{putchar(-');

number=-number;

)

convert(number);

)

习题9

一、选择题

1、B2、C3、A4、B

二、阅读程序题

1、575

2、第一行是H04

温馨提示

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

评论

0/150

提交评论