c语言纠错!『高分请教』

来源:百度知道 编辑:UC知道 时间:2024/07/14 03:52:54
定义函数cal(x,e)计算s=x+x^2/2!+x^3/3!+x^4/4!......,直到最后一项的绝对值小于e,函数形参x和e的类型都是double,函数类型是double。要求调用自定义函数fact(n)计算n的阶乘,调用库函数pow(x,n)计算x的n次幂。
下面是我自己编的,不知错在哪里?能运行,但计算时出现TempFile.exe已停止工作。为啥???
#include <stdio.h>
#include <math.h>
double fact(int n)
{ double k;
if(n<=1)
k=1;
else
k=n*fact(n-1); /*使用了递归的方法,好聪明*/
return k;
}

double cal(double x,double e)
{
double s=0;
int i,n;
printf("请输入n的值:");
scanf("%d",&n);
for(i=1;1<=n;i++)
if(pow(x,i)/fact(i)>=fabs(e))
s+=pow(x,i)/fact(i);
return s;
}

void main()
{ double a,b;
printf("请输入cal(x,e):");
scanf("%f %f",&a,&b);
printf("s=%f",cal(a,b));
}

你怎么设计的在cal(double x, double e)里还需要自己去输入n呢?应该让程序自己来找到n.

两处需要修改:

1. main函数里, double 的格式化应该用%lf, 而不是%f, 不改的话,scanf得到的值可能是不对的。

scanf("%f %f",&a,&b);// 应该更改为 scanf("%lf %lf",&a,&b);
printf("s=%f",cal(a,b)); // 应该更改为 printf("s=%lf",cal(a,b));

2. 我把整个double cal(double x, double e)修改如下(因为效率问题,不使用while(1)做循环):

double cal(double x,double e)
{
double s=0, jj = 0;
int i;

for(i=1;;i++) {
double ff = fact(i);
jj = pow(x,i) / ff;

if(jj >= fabs(e)) {
s += jj;
printf("n = %d, f(%d) = %lf, x^4/n! = ((%lf)^%d/%d!) = %lf\n", i, i, ff, x, i, i, jj);
} else {
printf("n = %d, f(%d) = %lf, x^4/n! = ((%lf)^%d/%d!) = %lf\n", i, i, ff, x, i, i, jj);
break;
}
}
return s;
}

只需要更改这些, 其他的都不用变,这样就可以了