这是我到目前为止所做的。我不知道代码有什么问题。理论上它应该运行得很好(或者我可能是错的),但它只是没有,它让我发疯。我是初学者BTW。
任何人都可以指出代码有什么问题吗?
# include <stdio.h>
# include <conio.h>
# include <math.h>
main()
{
int i , sum = 0 , n;
float x;
printf("Please enter the desired values for x and n (n>0): ");
scanf("%f %d",&x,&n);
for(i=1;i<=n;i++)
{
sum = sum +((pow(-1,i+1)*pow(x,2*i-1))/(factorial(2*i-1)));
}
printf("%f",sum);
}
int factorial(int n)
{
int c;
int result = 1;
for( c = 1 ; c <= n ; c++ )
result = result*c;
return ( result );
}
答案 0 :(得分:1)
主要问题:
float
类型应为double
或int
,而不是factorial(int n)
; double
必须能够返回非常大的数字,因此其返回类型也应为# include <stdio.h>
# include <math.h>
double factorial(int n)
{
if (n == 0) return 1;
return n * factorial(n-1);
}
main()
{
int n;
double x, sum = 0;
printf("Please enter the desired values for x and n (n>0): ");
scanf("%lf %d", &x, &n);
for(int i = 0; i <= n; i++)
{
sum += pow(-1, i) * pow(x, 2 * i + 1) / (factorial(2 * i + 1));
}
printf("%f", sum);
}
。可能的解决方案:
x
为了使您的正弦计算器具有防弹功能,您应该添加一些行来检查输入{{1}}的值,并在评估之前至少将其减少到域 [ - pi,pi] 系列。 查看我的答案here和here以了解原因。
答案 1 :(得分:1)
@Busy Beaver好的答案指出了OP代码中的一些失误。
但是要深入挖掘OP如何在没有 Stack Overflow 的情况下解决这个问题。
任何人都可以指出代码有什么问题吗?
不是寻求某人协助,而是首先使用您的编译器。启用所有编译器警告。一个好的编译器会抱怨下面的内容。这比在SO上发布的反馈更快。
// return type defaults to 'int'
main()
// this should be as below (amongst other possibilities)
int main(void)
// implicit declaration of function 'factorial'
sum = sum +((pow(-1,i+1)*pow(x,2*i-1))/(factorial(2*i-1)));
// factorial should be declared/defined before it it used
// conversion to 'int' from 'double' may alter its value
sum = sum +((pow(-1,i+1)*pow(x,2*i-1))/(factorial(2*i-1)));
// This is the hint that `sum` should also be a floating point.
// format '%f' expects argument of type 'double', but argument 2 has type 'int'
printf("%f",sum);
// sum is type `int`, the matching specifier is "%d"`.
通过修复这些警告,代码“工作”而无需其他更改。 factorial()
计算中仍然存在精度,范围有限,效率和溢出等问题。需要学习的经验:使用编译器来帮助解决基本问题。
Please enter the desired values for x and n (n>0): 1 5
0.841471
我现在看到这是一个旧帖子,OP可能有left the building。