答:
1)12)03)0
4.下面程序在执行时,哪些地方将发生类型转换?
程序打印的值是什么?
intf(intn,floatm){
return(m+n)/4;
}
intmain(){
floaty=3;
printf("%d\n",f(y,y+1));
return0;
}
答:
#include
intf(intn,floatm)
{
return(m+n)/4;
}
intmain(){
floaty=3;
printf("%d\n",f(y,y+1));
system("pause");
return0;
}
5.在计算机上试验本章正文中的一些程序。
对它们做一些修改,观察程序加工和运行的情
况,并对程序的行为做出解释。
答案:
略
6.定义求圆球的体积、求圆球的表面积、求圆柱体的体积、求圆柱体的表面积的函数。
答:
#include
doublef1(doubler){
doublev;
v=4.0/3.0*r*r*r*3.1415926;
returnv;
}
doublef2(doubler){
doubles;
s=4*r*r*3.1415926;
returns;
}
doublef3(doubler,doubleh){
doublev;
v=r*r*3.1415926*h;
returnv;
}
doublef4(doubler,doubleh){
doubles;
s=2*3.1415926*r*h+2*3.1415926*r*r;
returns;
}
intmain(){
printf("圆球的体积为%f\n",f1(0.15));
printf("圆球的面积为%f\n",f2(0.15));
printf("圆柱体的体积为%lf\n",f3(0.15,0.5));
printf("圆柱体的面积为%lf\n",f4(0.15,0.5));
system("pause");
return0;
}
7.1)不用函数,直接写一个主程序计算并输出直径为100毫米和150毫米的金、银、铜、
铁、锡球的重量(以kg为单位输出)。
2)重新完成上面程序,先定义一个带有两个参数的函数,它能求出直径为x的比重为
y的圆球的重量,而后在主程序里调用这个函数完成所需工作。
将这样得到的解与不用
函数的解比较,比较它们的长度、容易出错的程度。
假设现在要求修改所用圆周率的精
度,考虑用两种方式写程序的修改难度。
3)请写程序,求出边长为100毫米和150毫米的金、银、铜、铁、锡立方体的重量。
你可以利用前面的程序吗?
是否很容易修改前面程序,完成这一计算?
比较不用函数的
解法和使用函数的解法在易修改和重复使用方面的效用。
8.定义函数:
doubletmax(double,double,double),它返回三个参数中最大的
一个。
写一个主函数试验各种参数情况。
答:
#include
doubletmax(doublex,doubley,doublez){
if(x>y)
returnx>z?
x:
z;
else
returny>z?
y:
z;
}
intmain(){
printf("最大的一个为:
%f",tmax(8,3,2));
printf("最大的一个为:
%f",tmax(8,13,2));
printf("最大的一个为:
%f",tmax(8,3,22));
system("pause");
return0;
}
9.写函数,它以两个电阻的值作为参数,求出并联的电阻值。
答:
并联电阻值的计算公式为:
R1*R2/(R1+R2)
10.如果四边形四个边的长度分别为a、b、c、d,一对对角之和为2α,则其面积为:
S=(s−a)(s−b)(s−c)(s−d)−abcdcos2α
其中s=(a+b+c+d)/2。
定义一个函数计算任意四边形的面积。
设有一个四边形,其
四条边边长分别为3、4、5、5,一对对角之和为145o,写程序计算它的面积。
11.修改已知四边长求四边形面积的函数,增加对各种参数错误情况的检查和处理(如返回
值0),用各种实例数据检查你的函数否检查出所有可能的错误情况。
12.分析本章正文中给出的求二次方程根的函数,看它缺乏对哪些特殊情况的处理。
补充这
些处理,在需要时输出适当的信息,使之成为一个更完整的函数。
写一个主函数,用各
种特殊情况和一般情况测试所完成的函数。
答:
#include
#include
voidf(doublea,doubleb,doublec){
doubletemp=b*b-4*a*c;
if(a==0)printf("方程的根为:
%f",-c/b);
if(temp>0)
printf("方程的根为:
%f,%f",(-b+sqrt(temp))/2/a,(-b-sqrt(temp))/2/a);
elseif(temp==0)
printf("方程有两个相同的根为:
%f",-b/2/a);
else
printf("方程无解!
");
}
intmain(){
f(5,2,6);//可以测试不同的数据
system("pause");
return0;
}
13.写一个简单程序,它输出从1到10的整数。
14.写一个简单程序,它输出从10到-10的整数。
15.写一个两个整型参数的简单函数,它输出从第一个整数到第二个整数为止的整数序列。
16.用定义函数doublepower(doublex,intn),它求出x的n次幂。
用主函数试
验很大的n值(例如令x值为1),看看会出现什么情况;用大的x和n值,看看发生
浮点数计算溢出时会出现什么情况。
17.写一个程序,它在0~90度之间每隔5度输出一行数据,打印一个表。
每行中包括5个
项目:
角度数,以及它所对应的正弦、余弦、正切、余切函数值。
答:
#include
#include
intmain(){
doubles=0*3.1415926/180;
inti;
for(i=0;i<=90/5;i++){
printf("%f,%f,%f,%f,%f\n",s,sin(s),cos(s),tan(s),1/tan(s));
s+=5*3.1415926/180;
}
system("pause");
return0;
}18.查看有关公式,写求解并输出一元三次方程的根的函数。
19.写出求等差级数的和kak
n
=Σ1
的函数。
两种循环结构给出函数定义,再利用等差级数求和公式给出函数定义。
答:
#include
doublef1(intn,doublea){
inti;
doublesum=0;
for(i=1;i<=n;++i)
sum+=i*a;
returnsum;
}
doublef2(intn,doublea){
inti=1;
doublesum=0;
while(i<=n){
sum+=i*a;
++i;}
returnsum;
}
doublef3(intn,doublea){
returnn*(a+n*a)/2;
}
intmain(){
printf("%f\n",f1(10,2.5));
printf("%f\n",f2(10,2.5));
printf("%f\n",f3(10,2.5));
system("pause");
return0;
}
20.请到查出银行一年定期存款的利率和5年定期存款的利率。
假定现在要存入100元钱,
存款到期后立即将利息与本金一起再次存入。
请写出程序,计算按每次存一年和按照每
次存5年,总共存50年后两种存款方式的得款总额。
对两种情况都每隔5年输出一次
当时的总金额。
21.写一个程序打印出2的顺序各次幂。
让它打印出2的前30个幂,看看会出现什么情况。
用一个条件为真的循环打印2的各次幂,看看会出现什么情况。
第四章
练习
1.1)写出通过递推方式求200之内的完全平方数的程序;2)写出只使用加法的求完全平方数的程序;3)写出求1000之内的完全立方数的程序,请参考书中实例的写法和上面的两种写法,分别写出相应的求立方数的版本。
2.试验正文中乌龟旅行的实例,看看在你所用的C系统上得到什么样的结果。
从数学教科书中找出有关调和级数的理论结论,并将它与我们的试验做一个比较。
3.写一个程序,计算并输出Fibonacci序列中一系列的相邻项之比。
确定一个范围,观察输出的结果,能够得到什么结论(这个比的序列可能有极限吗?
极限是什么)。
查阅有关资料,了解有关的理论结果。
4.写函数计算1!
+2!
+...+k!
。
用主函数试验函数对一系列k值计算出的结果。
你写出的函数对1到10计算结果都正确吗?
如果出现错误,弄清楚是什么原因。
这个程序能对k=30得到正确结果吗?
(另外,你能只用一重循环完成函数的定义吗?
)
5.写函数计算:
,公式中有n层嵌套。
利用这L
答:
#include
#include
doublef(intn,doublex){
intm=0;
doublesum;
for(sum=1+1/x;m<=n;++m)
sum=1+1/sum;
returnsum;
}
intmain(){
intx;
for(x=1;x<=20;++x){
printf("%f\n",f(10,(double)x));
}
system("pause");
return0;
}
个函数打印x=1.0、2.0、…、20.0,n=10时的函数值表。
6.实现书中讨论的验证哥德巴赫猜想的程序,用不同的n对6~n的范围试验该程序。
去掉程序中的打印输出语句,增加计时功能,对不同的n运行程序,考察程序的运行时间,画出一条曲线,说明运行时间与n的关系。
7.设法(从文献中)找到其他更有效的素数判断方法并实现对应函数。
在一个数值比较大的整数区间试验书上给出的函数和你写的其他函数,利用它们打印出这一区间中的所有素数。
你所试验的几种方法在工作效率上有明显差异吗?
(为程序计时)
8.1)定义函数:
voidprt_factors(int),它对正整数实参输出其所有的因子。
2)定义函数:
voidprt_pfactors(int),它对正整数实际参数,输出其所有的素因子(多重因子重复输出);对于负参数,首先输出-1,然后输出所有因子。
9.已知
,利用该公式编程序求π的近似值,看用这个和式的前多少项求出的近似值与3.14159165的误差小于1e-5,令程序输出三项数据:
计算得到的和,由这个和求出的的近似值,求得该和所用得项数。
把1e-6\1e-7并重新试验,用计时方式总结出误差减小与执行时间之间的关系。
答:
#include
#include
#include
intmain(){
doublea=3.14159265*3.14159265/6.0;
doublex=1.0,n=2.0;
doublet;
t=clock();
while(fabs(a-x)>1e-8){
x=x+1/n/n;
++n;
}
doublepi=sqrt(6.0*x);
printf("n=%f,%f,%.32f\n",n,x,pi);
printf("%fs\n",(clock()-t)/CLOCKS_PER_SEC);
system("pause");
return0;
}
11.修改书中计算sin值的函数,使之能输出计算中循环执行的次数。
用不同的数值(一个比一个大)试验这一函数,观察出现的情况。
你看到出现溢出的情况了吗?
(为试验方便,你应该写一个适用的驱动程序)
12.已知−⋅⋅⋅⋅⋅⋅=−⋅+⋅−⋅+1123132451352467357xxxxxL−1x
sinh(x<1),写函数doubleasinh(double)计算sinh的近似值。
13.考虑不用函数(例如isprime)直接写出对6~200的偶数验证哥德巴赫猜想的程序(利用循环、条件、break语句等,不使用goto语句)。
将这样写出的程序与用定义函数的方式写出的程序比较。
例如考察两个函数的行数、字节数,其中各种控制结构的嵌套深度,控制结构使用的个数等。
14.辗转相减求最大公约数的递归定义是(其中m>0,n>0):
利用这个定义,用递归和循环方式各写出一个求最大公约数的函数。
答:
//--辗转相减求最大公约数
#include
intgcd(intm,intn){
returnm==n?
m:
(mgcd(n-m,m):
gcd(m-n,n));
}
intmain(){
printf("%d\n",gcd(96,56));
system("pause");
return0;
}
15.对一些n值试验河内塔程序,给它们计时。
据此估计你所用的计算机搬完64个金盘需要多长时间。
如果僧侣们1秒钟搬金盘1次,搬完64个金盘需要多少时间?
将这一时间与科学家对宇宙的估计寿命做个比较,据此评价僧侣们的说法。
16.一个三位的十进制整数,如果它的三个数位数字的立方和等于这个数的数值,那么它就被称为一个“水仙花数”。
定义函数判断一个整数是水仙花数,并利用这个函数打印出所有的水仙花数。
答:
//——求水仙花数
//方法一
#include
voidf(intn){
inti,j,k;
i=n/100;
j=(n-i*100)/10;
k=n-i*100-j*10;
if(i*i*i+j*j*j+k*k*k==n)
printf("%d=%d^3+%d^3+%d^3\n",n,i,j,k);
else;
}
intmain(){
inti;
for(i=100;i<=999;++i)
f(i);
system("pause");
return0;
}
//方法二
voidf(){
inti,j,k,x;
for(i=1;i<=9;++i)
for(j=0;j<=9;++j)
for(k=0;k<=9;++k)
{x=i*i*i+j*j*j+k*k*k;
if(x==i*100+j*10+k)
printf("%d=%d^3+%d^3+%d^3\n",x,i,j,k);
}
}
intmain(){
f();
system("pause");
return0;
}
17.对一个整数,如果其所有因子(包括因子1在内)之和正好等于这个数,那么就称它为“完全数”。
因子之和小于自身的数称为“亏数”;因子之和大于自身的数称为“盈数”。
写一个函数,当其参数是亏数时返回负值,是完全数时返回0,是盈数时返回正值。
利用这个函数求出1000以内的所有完全数(实际上只有1、6、28、496)。
为这个程序计时:
从100开始每隔100做一次计算,写一个循环,输出各次计算花的时间。
再从1000开始,每隔1000做一次计算直到10000为止,输出对程序执行计时的值。
利用所定义的函数对一段区间的整数做一个分类,输出其中各个数所属的类。
18.写程序由标准输入得到一系列三个一组的数,把每组数作为三角形的三边长,计算三角形的面积。
注意在程序里检查输入数据,对不能构成三角形的情况给出错误信息。
仔细
分析自己的程序,能否检查出所有不合理数据。
用不同数据运行试验。
19.写一个程序,它读入一系列整数,最后输出其中最大的两个数。
//——读入一系列数,最后输出其中最大的两个
#include
intmain(){
longx,max1=-1000000,max2=-100000;
while(scanf("%d",&x)==1){
if(x!
=max1&&x>max2)
{if(x>max1)
{max2=max1;
max1=x;}
else
max2=x;
}
}
printf("max1=%d