C语言初学者请教!编程求sinx近似值,已写程序,求改错!

题目:编写程序,从键盘输入x,利用幂级数展开计算sinx近似值,要求误差小于10^(-6)
sinx=x-x^3/3!+x^5/5!-x^7/7!+…+

我写的程序如下:
#include<stdio.h>
#include<math.h>
main()
{ float x,sinx,sum,s;
int i,j; //j为-1的次方变量
printf("Please inter x: \n");
scanf("%f",&x);
i=1;s=1;j=-1;
sum=0;
sinx=(float)sin(x);
for(i=1;fabs(sum-sinx)<=0.000001;i=i+2)
{ s=s*i;
sum+=(float)pow(j,i+1)*(pow(x,i)/s);
}
printf("sin x=%f\n",sum);

}

编译连接都没错,运行时出来的结果都是0.000000。希望回答者不要给别人写好的程序而是修改我的程序,如果我的程序有重大错误再给其他写好的程序,谢谢!

#include<stdio.h> /*以下代码运行通过*/
#include<math.h>
main()
{
float sum,sinx,x,s;
int i,j; /*j为-1的次方变量*/
printf("Please inter x: \n");
scanf("%f",&x);
i=1;s=1;j=-1;
sum=0;
sinx=sin(x);
printf("%f\n",sinx);
for(i=1;(fabs(sum-sinx))>=0.000001;i=i++) /*你的程序中这句判断有错,应该是大于该精度内的sum值执行for内循环语句。*/
{ s=s*i;
if(i%2!=0) /*当i为奇数时,才执行,把偶数跳过,但s的值仍变化,这样除以的就是阶乘。*/
{ j=-j; /*用j来控制正负号*/
sum+=(double)(pow(x,i)/s)*j;
}
}
printf("sinx=%f\n",sum);

}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-26
For条件错误改为大于且把精度变大一点,否则永远为真。你那个变号也不能实现总为正,可用J乘负一实现。最后你那阶乘也求错了,最好在加个变量直接不断加一来求阶乘, 手机回答不便写代码,自己好好改下吧,那样效果较好。
第2个回答  2011-04-26
#include<stdio.h>
#include<math.h>
main()
{
double x,sum=0,sinx;
int i,flag=1,s=1,j; //j为-1的次方变量
printf("Please inter x: ");
scanf("%lf",&x);
sinx=(float)sin(x);
for(i=1,j=1;fabs(sum-sinx)>=0.000001;i=i+2)
{
while(j<=i)s*=j++;//求阶乘
sum+=flag*(pow(x,i)/s);
flag*=-1;//符号
}
printf("sin x=%lf\n",sum);
}
第3个回答  2011-04-26
没有改出来,只发现这里有错
for(i=1;fabs(sum-sinx)<=0.000001;i=i+2)
{ s=s*i; // 这里的s并不是接乘
sum+=(float)pow(j,i+1)*(pow(x,i)/s);
}
printf("sin x=%f\n",sum);

}
第4个回答  2011-04-26
#include<stdio.h>
#include<math.h>
void main()
{ float x,sinx,sum,s;
int i,j; //j为-1的次方变量
printf("Please inter x: \n");
scanf("%f",&x);
s=1;j=1;
sum=0;
sinx=(float)sin(x);
for(i=1;fabs(sum-sinx)>=0.000001;i=i+2)
{ s=i==1?1:s*i*(i-1);
sum+=(float)j*(pow(x,i)/s);
j=-j;
}
printf("sinx=%f\n",sum);

}
相似回答