C程序设计4谭浩强完整版课后习题答案Word格式.docx
《C程序设计4谭浩强完整版课后习题答案Word格式.docx》由会员分享,可在线阅读,更多相关《C程序设计4谭浩强完整版课后习题答案Word格式.docx(107页珍藏版)》请在冰豆网上搜索。
y)
z=x;
else
z=y;
return(z);
//z作为整个程序的出口值,赋给主函数中的c.
P0150.6三个数的大小.(数字0表示课后练习题)
inta,b,c,d;
//d是用于存储最大值的.
intmax(intx,inty,intz);
//测试可知,在VS2008中,可以不预先声明.
Pleaseinput3numbers:
\n"
%d%d%d"
b,&
c);
d=max(a,b,c);
//调用函数中有三个形参,这里需要传入三个实参,才可运算.
Themaxis:
%d.\n"
d);
//d可以换成max(a,b,c).
intmax(intx,inty,intz)
intm;
y&
&
x>
z)//求三者之大的一种方法.
m=x;
if(y>
x&
y>
z)
m=y;
if(z>
z>
x)
m=z;
return(m);
//返回值m给主函数中的d.
C程序设计(第四版)(谭浩强)第2章课后习题答案
算法——程序的灵魂
P0172.1计算机1-5相乘的积.
inti,s=1;
//在执行数值操作前一定要先有个初值.
for(i=1;
i<
6;
i++)//这里是到6.
s=s*i;
//相乘
}
s);
//作出要求:
换成1到11间奇数相乘.
12;
i++)//这里是到,但题目要求的是取单数.也可以是i=i+2
if(i%2!
=0)//i对取模,值为非为奇数;
为则为偶数.
s=s*i;
else
continue;
//跳过这个for循环的这一次,执行下一次.
P0192.2按要求输出80分以上的学生信息.
暂时没法做.
P0192.3判断2000-2500年中的闰年,并输出.
年的概念是地球围绕太阳一周的时间(所谓公转周期)称为一年,这个周期是相当稳定的,很长时间也不会变动1秒,但是真正的一年是365.2423天(目前)。
所以,如果每年定义为365天的话,1年就会多出0.2423天,4年就会多出0.9692天,非常接近1天,这样闰年就出现了,也就是每4年要有1年设置为366天,来抵消这多出的1天。
规则为:
·
1)如果年份能被4整除,则该年计为闰年;
可是,假如不做调整的话,当400年的时候,累计才多出96.92天,接近于多出97天,闰年的设置却多出来100天,所以要在400年内,再撤销3个闰年。
怎么撤销呢?
就有了下面这个规则:
2)如果年份能被100整除,则不计为闰年;
问题又来了,400年里有4个100年吧,去掉后四个100年后,又少了一个,所以再加一个规则就是:
3)如果年份能被400整除,则计为闰年。
简单说来每400年里设置了97个闰年,也就是400里的前3个100年不设置闰年,误差被调整到400年仅有0.08天。
inti;
for(i=2000;
=2200;
i++)
if((i%4==0&
i%100!
=0)||i%400==0)//闰年的经典判断条件.
printf("
%disaleapyear!
i);
%disnotaleapyear!
P0202.4求
(1)-(1/2)+(1/3)……+(1/99)-(1/100)的值.
floatsign=1,sum=0,deno,term;
//关于有小数的计算应该用float.
for(deno=1;
deno<
=100;
deno++)
term=sign*(1/deno);
//term临时值,sing符号,deno为分母.
sum=sum+term;
//第一次总全存储.
sign=(-1)*sign;
//换号.
Thesumofdeno(指定值)is%f.\n"
//若是到100的话,结果为0.68172
P0212.5得到一个大于3的数,并判断是否为素数.
intmain()
inti,num,n;
//像13,37,这样只能让和它本身除以外,没有其它除数的叫素数.
Pleaseinputanumber:
//获取一个数值
%d"
num);
for(i=2;
num;
i++)//在到此数值间进行循环除,如果除得尽,就不满足素数要求.
if(num%i==0)//除得尽,则不是.
{
n=1;
break;
//设置跳出,才不会执行多次.
}
n=0;
//按程序走的话,这里会执行多次,不能用printf语句,会输出多次.
if(n==0)//单出口问题,虽然n=0执行多次,但仍然是n=0,这样才会只输出一次.
printf("
Itisdoaprimenumber!
"
//如果是100-200可以加个”%d”,nmu进去.
Itisnotaprimenumber!
2.6-2.10要求用流程图表示上列算法.
2.11-2.16要求用N-S图表示上列算法.
…………还要伪代码
P0360.1调换二个参数的值.
chara='
a'
b='
b'
c;
c=a;
a=b;
b=c;
anowis%c,bnowis%c!
a,b);
P0360.2输入10个数,并输出最大的那一个数.
inti,a[10],s=0;
Pleaseinput10numbers:
for(i=0;
=9;
scanf("
a[i]);
if(s<
a[i])s=a[i];
%disthebiggestnumber!
P0360.3按大小顺序输出一些数.
inti,j,a[4],s=0;
Pleaseinput5numbers:
//此处要回车.
for(i=0;
i<
=4;
i++)
//这是取多个数的代码,可以用while控制取到\n符为止.
=3;
i++)//双重循环,先一个外循,再轮所有小循,轮完后再下一个大循.
for(j=i+1;
j<
j++)//第一个循环是至n-1,第二个循环是到n.
if(a[i]>
a[j])//如果成立,则对换,小于号表示降序排列,大于号表示升序排列.
s=a[i];
a[i]=a[j];
a[j]=s;
i++)//重新定义循环输出数组中新排列的数.
%d-"
a[i]);
P0360.4求1至100的总合.
inti,sum=0;
//这是一个简单的程序.
101;
sum=sum+i;
Thesumofonetoonehundredis%d!
P0360.5判断一个数能否同时被3和5整除.
intn;
n);
if(n%3==0&
n%5==0)//关键句,用"
并"
的符号.
printf("
Canbedevideby3and5!
Cannotbedevideby3and5!
P0360.6输出100-200间的素数.
//********************第一种方法.
#include<
//网络版本,采用调用函数和求根取素.
math.h>
//下面用到sqrt,所以需要包含数据函数.sqrt是求根,属数学函数.
intmain()//学会一个程序采用”主函数+被调用函数”的方式,会比较规范.
for(i=100;
=200;
i++)//为了书写规范,最好加上{},以示清范围.
if(prime_number(i)==1)//i是实参.
%d"
intprime_number(doublem)//m是形参.
intj,k;
k=(int)sqrt(m);
//求根,(int)是强制转换,求根里要是浮点型.
for(j=2;
j<
=k;
j++)
if(m%j==0)
return0;
//此值返回给主函数中的实参.
return1;
//********************第二种方法.
for(i=100;
i++)//指定至间.
if(prime(i)==1)//这里i为实参,传入形参j中进行运算,然后再由形参j带出返回.
printf("
%distheprimenumber!
intprime(intj)//j是形参,用于接收实参i给的值.
intm,n;
m=(int)sqrt(j);
for(n=2;
n<
=m;
n++)
if(j%n==0)
//返回值,0为不是素数,1是素数.
请仿照2.5来写.
P0360.7最大公约数和最小公倍数.
//最大公约数用累除法,除到无余数时的被除数是最大公约数.
main()
intm,n,c,d;
intgcd();
//这是最大公约数的缩写,此处调用函数,可以不写里面的实参.
intlcm();
//这是最小公倍数的缩写,此处调用函数,可以不写里面的实参.
Pleaseinputtwonumber:
%d%d"
m,&
c=gcd(m,n);
//c获取最大公约数
d=lcm(m,n);
//d获取最小公倍数
TheGCDof%dand%dis:
%d!
m,n,c);
TheLCMof%dand%dis:
m,n,d);
intgcd(intx,inty)//最大公约数GreatestCommonDivisor
inttemp;
while(x%y!
=0)
temp=y;
//y在下一轮中作为除数,即是下一轮中的X,所以先闪一边去.
y=x%y;
//x,y的余数作为下一轮中的Y,由x%y来取得.
x=temp;
//刚才temp中存储了y的值,现在拿出来作为下一轮中的X使用.
returny;
//这是每一轮中的被除数,按原理来,这就是最大公约数,即累除法的原理.
intlcm(intx,inty)//最小公倍数LowestCommonMultiple
inti,temp;
if(x<
y)//保证二者大的数在X上,小的数在Y上.小于号降序,大于号升序.
{//以下为经典三行码,实现两个数的互换.
temp=x;
x=y;
y=temp;
=y;
i++)//设定一个区间,从1至小的数之间的循环.
if(!
((x*i)%y))//除得尽为零,非零为真,则成立并返回.
{//如此往复,直到取模无余数,那么小的数X乘以区间当前的I值,就是最小公倍数.returnx*i;
最简单的C程序设计——顺序程序设计
P0373.1把华氏温度转化为摄氏表示法.
floatF_to_C(floatinput_fah)//代表华转摄,input_fah是局部变量.
floatoutput_cen;
//这里也是局部变量.
output_cen=(5.0/9)*(input_fah-32);
//函数的功能体.
returnoutput_cen;
//返回值,注意,返回值的数据类型应该和函数一致.
floatC_to_F(floatinput_cen)
floatoutput_fah;
output_fah=(9.0/5)*input_cen+32;
//转换过程.
returnoutput_fah;
intchoice;
floatinput_fah,input_cen,output_fah,output_cen;
//局部变量的调用及参数传递.
F_to_Cpress<
1>
andC_to_Fpress<
2>
!
choice);
if(choice==1)
{
Pleaseinputfahrenheit:
%f"
input_fah);
//这个是主函数定义的变量,虽然和调用函数同名.
output_cen=F_to_C(input_fah);
The华氏is%d,摄氏is%d."
(int)input_fah,(int)output_cen);
if(choice==2)
Pleaseinputcentigrade:
input_cen);
output_fah=C_to_F(input_cen);
TheCentigradeis%d,andtheFahrenheitis%d."
(int)input_cen,(int)output_fah);
P0383.2计算存款利息(关于精度问题).
floatp0=1000,r1=0.0036,r2=0.0225,r3=0.0198,p1,p2,p3;
p1=p0*(1+r1);
p2=p0*(1+r2);
p3=p0*(1+r3/2)*(1+r3/2);
p1=%f\np2=%f\np3=%f\n"
p1,p2,p3);
P0553.3大写转换成小写
intmain()//小写范围是97-122,大写范围是65-90,大写加上即得小写.26个字母.
charc1,c2;
c1='
A'
;
c2=c1+32;
%c%d"
c2,c2);
P0593.4给出三角形边长,算出面积.
doublea=3.67,b=5.43,c=6.21,s,area;
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
areais%f\n"
area);
//默认可以组成三角形.
P0653.5求一无二次等式的根,默认两个不同根.
doublea,b,c,disc,x1,x2,p,q;
%lf%lf%lf"
disc=b*b-4*a*c;
p=-b/(2.0*a);
q=sqrt(disc)/(2.0*a);
x1=p+q;
x2=p-q;
x1=%7.2f\nx2=%7.2f"
x1,x2);
P0713.6用%f输出实数,只能得到六位小数.
doublea=1.0;
//1是整型,1.0是浮点型,默认是double.可以是float.
%.9f\n"
a/3);
P0723.7float型数据的有效位数.
floata;
//输出的结果是.333252,float精度6位,所以第七位后不可信.
a=10000/3.0;
%f\n"
a);
P0783.8使用putchar函数输出.
B'
O'
c='
Y'
putchar(a);
putchar(b);
putchar(c);
putchar('
\n'
putchar(101);
//101是A的ASCII代码的缩写,因为此函数只能输出字符.
putchar(66);
P0793.9使用getchar得到字符.
chara,b,c;
a=getchar();
b=getchar();
c=getchar();
//这也是基本回显的C程序代码.
P0813.10getchar得到大写,putchar输出小写.
chara,b;
b=a+32;
P0820.1国民生产总值10年后的增长倍数.
doublep,r=0.09,n=10;
p=pow((1+r),n);
//这是数学函数,pow(x,y)计算x的y次方.
Pis