#C语言第二谭浩强习题解答.docx
《#C语言第二谭浩强习题解答.docx》由会员分享,可在线阅读,更多相关《#C语言第二谭浩强习题解答.docx(30页珍藏版)》请在冰豆网上搜索。
#C语言第二谭浩强习题解答
《C程序设计》习题解答第一章
1.5
main(>
{printf(" ******************************\n">。
printf("\n">。
printf(" Very Good!
\n">。
printf("\n">。
printf((" ******************************\n">。
}
1.6
main(>
{inta,b,c,max。
printf("inputa,b,c:
\n">。
scanf("%d,%d,%d",&a,&b,&c>。
max=a。
if(maxmax=b。
if(maxmax=c。
printf("max=%d",max>。
}
第二章习题解略第三章
第三章要点:
1、C语言的数据类型 P38图
2、常量、变量的约定及各类数据常量、变量使用的约定。
3、运算符及表达式的约定和应用。
难点:
自加、自减的用法及其运算后的值。
逗号运算符及逗号表达式的用法
3.3
(1>、<10)10=(12>8=(a>16
(2>、<32)10=(40>8=(20>16
(3>、<75)10=<113)8=(4b>16
(4>、<-617)10=<176627)8=(fd97>16
(5>、<-111)10=(177621>8=(ff91>16
(6>、<2483)10=<4663)8=(9B3>16
(7>、(-28654>10=(110022>8=(9012>16
(8>、(21003>10=(51013>8=(520B>16
3.4略
3.5字符常量是一个字符,用单引号括起来。
字符串常量是由0个或若干个字符组合而成,用双引号把它们括起来,存储时自动在字符串最后加一个结束符号‘0’。
3.6运行结果为:
aabb cc abc
AN
3.7
main(>
{charc1=’C’,c2=’h’,c3=’i’,c4=’n’,c5=’a’。
c1+=4。
c2+=4。
c3+=4。
c4+=4。
c5+=4。
printf(“密码是%c%c%c%c%c\n”,c1,c2,c3,c4,c5>。
}
3.8可以。
因为在可输出的字符范围内,用整型和用字符型作用相同。
3.9<1)2.5<2)3.5
3.10结果为:
9,11,9,10
3.12
<1)24 <2)10 <3)60
<4)0 <5)0 <6)0
第三章
第四章要点:
1、C语句分类
2、赋值语句的用法
3、数据输入输出的语句的用法。
特别注意格式输入、输出语句的用法,要看到语句能写出输入、输出结果,给出输入、输出结果能写出语句。
4、顺序程序的概念、结构。
4.3不把输入输出作为C语言提供的语句的目的是使C语言编译系统简单,因为将语句翻译成二进制的指令是在编译阶段完成的,没有输入输出语句就是可以避免在编译阶段处理与硬件有关的问题,可以使编译系统简化,而且通用性强,可移植性好,对各种型号的计算机都适用,便于在各种计算机上实现。
4.4
main(>
{inta,b,c。
longintu,n。
floatx,y,z。
charc1,c2。
a=3。
b=4。
c=5。
x=1.2。
y=2.4。
z=-3.6。
u=51274。
n=128765。
c1=’a’。
c2=’b’。
printf(“\n”>。
printf(“a=%2db=%2dc=%2d\n”,a,b,c>。
printf(“x=%8.6f,y=%8.6f,z=%9.6f\n”,x,y,z>。
printf(“x+y=%5.2fy+z=%5.2fz+x=%5.2f\n”,x+y,y+z,,z+x>。
printf(“u=%6ldn=%9ld\n”,u,n>。
printf(“c1=’%c’or%d(ASCII>\n”,c1,c1>。
printf(“c2=’%c’or%d(ASCII>\n”,c2,c2>。
}
4.5
57
□□5□□7
67.856400,-789.124000
67.856400□,-789.124000
□□□67.86,□-789.12,67.8564,-789.1240,67.856400,-789.124000
6.785640e+01,□-7.89e+02
A,65,101,41
1234567,4553207,d687
65535,177777,ffff,-1
COMPUTER,□□COM
4.8
main(>
{floatpi,h,r,l,s,sq,vq,vz。
pi=3.14
printf(inputr,h\n”>。
scanf(“%f,%f”,&r,&h>。
l=2*pi*r。
s=r*r*pi。
sq=4*pi*r*r。
vq=3.0/4.0*pi*r*r*r。
z=pi*r*r*h。
printf(“l=%6.2f\n”,l>。
printf(“s=%6.2f\n”,s>。
printf(“sq=%6.2f\n”,sq>。
printf(“sv=%6.2f\n”,sv>。
printf(“sz=%6.2f\n”,sz>。
}
4.9
main(>
{floatc,f。
printf(“请输入一个华氏温度:
\n”>。
scanf(“%f”,&f>。
c=(5.0/9.0>*(f-32>。
printf(“摄氏温度为:
%5.2\n”,c>。
}
4.10
#include“stdio.h”
main(>
{charc1,c2。
printf(“inputc1,c2\n”>。
scanf(%c,%c”,&c1,&c2>。
putchar(c1>。
putchar(c2>。
printf(“\n”>。
printf(“%c%c\n”,c1,c2>。
}
第5章
第五章要点:
1、关系运算符和关系运算式;
2、逻辑运算符和逻辑运算式;
3、IF语句的三种形式;
4、条件运算符;
5、switch语句的用法;
5.3
<1)0 <2)1 <3)1 <4)0 <5)1
5.4
main(>
{inta,b,c,t,max。
printf(“inputa,b,c:
”>。
scanf(“%d,%d,%d”,&a,&b,&c>。
t=(a>b>?
a:
b。
max=(t>c>?
t:
c。
printf(“max=%d”,max>。
}
5.5
main(>
{floatx,y。
printf(“inputx:
”>。
scanf(“%f”,&x>。
if(x<1>
y=x。
elseif(x<10>
y=2*x-1。
else
y=3*x-11。
printf(“x=%f,y=%f\n”,x,y>。
}
}
5.6
main(>
{intscore,t,logic。
chargrade。
logie=1。
while(logic>
{printf(“inputscore:
”>。
scanf(“%d”,&score>。
if((score>100||score<0>>printf(“\error”>。
elselogic=0。
printf(“\n”>。
}
if(score==100>t=9。
elset=(int>(score/10>。
switch(t>
{case9:
grade=’A’。
break。
case8:
grade=’B’。
break。
case7:
grade=’C’。
break。
case6:
grade=’D’。
break。
case5:
case4:
case3:
case2:
case1:
case0:
grade=’E’。
}
}
}
5.8
<1)用if语句
main(>
{longi。
floatbonus,bon1,bon2,bon4,bon6,bon10。
bon1=100000*0.1。
/*利润为10万元时的奖金*/
bon2=bon1+100000*0.075。
/*利润为20万元时的奖金*/
bon4=bon2+200000*0.05。
/*利润为40万元时的奖金*/
bon6=bon4+200000*0.03。
/*利润为60万元时的奖金*/
bon10=bon6+40000*0.015。
/*利润为100万元时的奖金*/
scanf(%ld”,&i>。
if(i<1e5>bonus=i*0.1。
elseif(i<=2e5> bonus=bon1+(i-100000>*0.075。
elseif(I<=4e5> bonus=bon2+(i-200000>*0.05。
elseif(I<=6e5> bonus=bon4+(i-400000>*0.03。
elseif(I<=1e6> bonus=bon6+(i-600000>*0.015。
else bonus=bon10+(i-100000>*0.01。
printf(“bonus=%10.2f”,bonus>。
}
(2>用switch编写
main(>
{longi。
floatt,bonus,bon1,bon2,bon4,bon6,bon10。
intc。
bon1=100000*0.1。
bon2=bon1+100000*0.075。
bon4=bon2+200000*0.05。
bon6=bon4+200000*0.03。
bon10=bon6+40000*0.015。
scanf(%ld”,&i>。
c=i/100000。
if(c>10>c=10。
switch(c>
{case0:
bonus=i*0.1。
break。
case1:
bonus=bon1+(i-100000>*0.075。
break。
case2:
case3:
bonus=bon2+(i-200000>*0.05。
break。
case4:
case5:
bonus=bon4+(i-400000>*0.03。
break。
case6:
case7:
case8:
case9:
bonus=bon6+(i-600000>*0.015。
break。
case10:
bonus=bon10+(i-1000000>*0.01。
}
printf(“bonus=%10.2f”,bonus>。
}
5.9
main(>
{intt,a,b,c,d。
scanf(“%d,%d,%d,%d”,&a,&b,&c,&d>。
printf(“\na=%d,b=%d,c=%d,d=%d\n”,a,b,c,d>。
if(a>b>{t=a。
a=b。
b=t。
}
if(a>c>{t=a。
a=c。
c=t。
}
if(a>d>{t=a。
a=d。
d=t。
}
if(b>c>{t=b。
b=c。
c=t。
}
if(b>d>{t=b。
b=d。
d=t。
}
if(c>d>{t=c。
c=d。
d=t。
}
printf(“%d%d%d%d\n”,a,b,c,d>。
}
5.10
main(>
{inth=10。
floatx,y,x0=2,y0=2,d1,d2,d3,d4。
printf(“inputx,y:
”>。
scanf(“%f,%f”,&x,&y>。
d1=(x-x0>*(x-x0>+(y-y0>*(y-y0>。
d2=(x-x0>*(x-x0>+(y+y0>*(y+y0>。
d3=(x+x0>*(x+x0>+(y-y0>*(y-y0>。
d4=(x+x0>*(x+x0>+(y+y0>*(y+y0>。
if(d1>1&&d2>1&&d3>1&&d4>1>h=0。
printf(“h=%d”,h>
}
第6章
第6章要点:
1、实现循环的语句。
2、几种循环的比较
3、读程序写结果。
常见问题的程序设计。
6.1
#include
main(>
{inta,b,n1,n2,t。
printf(“inputa,b\n”>。
scanf(“%d,%d”,&n1,&n2>。
if(n1>n2>{t=n1。
n1=n2。
n2=t。
}
a=n1。
b=n2。
while(b!
=0>
{t=a%b。
a=b。
b=t。
}
printf(“最大公约数为:
%d\n”,a>。
printf(“最小公倍数为:
%d\n,n1*n2/a>。
}
6.2
#include
#include
main(>
{charc。
intletters=0,space=0,digit=0,other=0。
printf(“输入一行字符:
\n”>。
while((c=getchar(>>!
=’\n’>。
{
if(c>=’a’&&c<=’z’||c>=’A’&&c<=’Z’>letters++。
elseif(c==’’>space++。
elseif(c>=’0’&&c<=’9’>digit++。
elseother++。
}
printf(“l%d,%d,%d,%d\n”,letters,space,digit,other>。
}
6.3
#include
main(>
{inta,n,count=1,sn=0,tn=0。
scanf(“%d,%d,”,&a,&n>。
printf(“a=%dn=%d\n”,a,n>。
while(count<=n>
{tn=tn+a。
sn=sn+tn。
a=a*10。
++count。
}
printf(“a+aa+aaa+…=%d\n”,sn>。
}
6.4
#include
main(>
{floatn,s=0,t=1。
for(n=1。
n<=20。
n++>
{t=t*n。
s=s+t。
}
printf(“1!
+2!
+3!
+…+20!
=%e\n”,s>。
}
6.5
#include
main(>
{intn1=100,n2=50,n3=10。
floatk。
floats1=0,s2=0,s3=0。
for(k=1。
k<=n1。
k++>s1=s1+k。
for(k=1。
k<=n2。
k++>s2=s2+k*k。
for(k=1。
k<=n3。
k++>s3=s3+1/k。
printf(“sum=%8.2\n”,s1+s2+s3>。
}
6.6
#include
main(>
{inti,j,n。
printf(“水仙花数是:
”>。
for(n=100。
n<1000。
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(“%d”,n>。
}
printf(“\n”>。
}
6.7
#include
main(>
{staticintk[10]。
inti,j,n,s。
for(j=2。
j<=1000。
j++>
{n=0。
s=j。
for(i=1。
ii++>
if((j%i>==0>
{n++。
s=s-i。
k[n]=i。
}
if(s==0>
{printf(“%5d是个完数,它的因子是:
”,j>。
for(i=1。
i<=n。
i++>printf(“%d”,k[i]>。
printf("\n">。
}
}
}
6.8
#include
main(>
{floata=2,b=1,s=0。
intn,t,number=20。
for(n=1。
n<=number。
n++>
{s=s+a/b。
t=a。
a=a+b。
b=t。
}
printf(“sum=%9.6f\n”,s>。
}
6.9
#include
main(>
{intn。
floatsn=100,hn=sn/2。
for(n=2。
n<=10,n++>
{sn=sn+2*hn。
hn=hn/2。
}
printf(“第10次落地时共经过:
%fM\n”,sn>。
printf(“第10次反弹%fM\n”,hn>。
}
6.10
#include
main(>
{intday,x1,x2。
day=10。
x2=1。
while(day>0>
{
x1=(x2+1>*2。
/*前1天的桃子数是当天桃子数加1后的2倍*/
x2=x1。
day--。
}
printf(“桃子总数=%d\n”,x1>。
}
6.11
#include
#include
main(>
{floata,x0,x1。
printf(“inputn\n”>。
scanf(“%f”,&a>。
x0=a/2。
x1=(x0+a/x0>/2。
do{
x0=x1。
x1=(x0+a/x0>/2。
}while(fabs(x0-x1>>=1e-5>。
printf(“%5.2f的平方根=%8.5f\n”,a,x1>。
}
6.12
牛顿迭代法又称牛顿切线法。
它采用以下的方法求根:
先任意设定一个与其真实的根接近的值x0作为第一次近似根,由x0求出f(x0>,过(x0,f(x0>>点做f(x>的切线,交x轴于x1,把它作为第二次近似根;再由x1求出f(x1>,过(x1,f(x1>>点做f(x>的切线,交x轴于x2,求出f(x2>;再作切线……如此继续下去,直到足够接近真正的根x*为止。
f’(x0>=f(x0>/(x1-x0>
x1=x0-f(x0>/f’(x0>
这就是牛顿迭代公式。
#include
main(>
{floatx,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(方程的根=%6.2f\n”,x>。
}
6.13
二分法的思路如下:
先指定一个区间[x1,x2],如果函数f(x>在此区间是单调变化的,则可以根据f(x1>和f(x2>是否同号来确定方程f(x>=0在区间[x1,x2]内是否有一个实根。
若f(x1>和f(x2>不同号,则f(x>=0在[x1,x2]内必有一个<且只有一个)实根;如果f(x1>和f(x2>同号,则则f(x>=0在[x1,x2]内无实根,要重新改变x1和x2的值。
当确定f(x>在[x1,x2]内有一个实根后,可采取二分法将[x1,x2]一分为二,再判断在哪一个小区间有实根。
如此不断进行下去,直到小区间足够小为止。
#include
#include
main(>
{floatx0,x1,x2,fx0,fx1,fx2。
do{
scanf(“%f,%f”,&x1,&x2>。
fx1=x1*((2*x1-4>*x1+3>-6。
fx2=x2*((2*x2-4>*x2+3>-6
}while(fx1*fx2>0>。
do{
x0=(x1+x2>/2。
fx0=x0*((2*x0-4>*x0+3>-6。
if(fx0*fx1<0>{
x2=x0。
fx2=fx0。
}
else{
x1=x0。
fx1=fx0。
}
}while(fabs(fx0>>=1e-5>。
printf(“x=%6.2f\n”,x0>。
}
6.14
main(>
{inti,j,k。
for(i=1。
i<=4。
i++>
{for(j=1。
j<=4-i。
j++>printf(“”>。
for(k=1。
k<=2*i-1。
k++>printf(“*”>。
printf(“\n”>。
}
for(i=1。
i<=3。
i++>
{for(j=1。
j<=i。
j++>printf(“”>。
for(k=1。
k<=7-2*i。
k++>printf(“*”>。
printf(“\n”>。
}
}
6.15
开始设计程序时,并不知道A、B、C与X、Y、Z中的哪一个进行比赛,可以假设:
A与i比赛,B与j比赛,C与k比赛。
说明:
整个执行部分只有一个语句,所以只在语句的最后有一个分号。
#include
main(>
{chari,j,k。
for(i=’X’。
i<=’Z’。
i++>
for(j=’X’。
j<=’Z’。
j++>
if(i!
=j>
for(k=’X’。
k<=’Z’。
k++>
if(i!
=k&&j!
=k>
if(i!
=’X’&&k!
=’X’&&k!
=’Z’>
printf(“A--%c\tB--%c\tC--%c\n”,i,j,k>。
}
第九章指针
9.1
main(>
{intn1,n2,n3。
int*p1,*p2,*p3。
scanf("%d,%d,%d",&n1,&n2,&n3>。
p1=&n1。
p2=&n2。
p3=&n3。
if(n1>n2>swap(p1,p2>。
if(n1>n3>swap(p1,p3>。
if(n2>n3>swap(p2,p3>。
printf("%d,%d,%d\n",n1,n2,n3>。
}
swap(p1,p2>
int*p1,*p2。
{intp。
p=*p1。
*p1=*p2。
*p2=p。
}
9.2
main(>
{char*str1[20],*str2[20],*str3[20]。
charswap(>。
scanf("%s",str1>。
scanf("%s",str2>。
scanf("%s",str3>。
if(strcmp(str1,str2>>0>swap(str1,str2>。
if(strcmp(str1,str3>>0>swap(str1,str3>。
if(strcmp(str2,str3>>0>swap(str2,str3>。
printf("%s\n%s\n%s\n",str1,str2,str3>。
}
charswap(p1,p2>
char*p1,*p2。
{char*p[20]。
strcpy(p,p1>。
strcpy(p1,p2>。
strcpy(p2,p>。
}
9.3
main(>
{intnumber[10]。
input(number>。
max_min_value(number>。
output(number>。
}
input(number>
i