我开发了一个C程序,可以使用泰勒级数展开计算sin函数的值。我还绘制了该程序的流程图。源代码如下:
#include<stdio.h>
#include<math.h>
int fact(int n)
{
if(n==0)
{
return 1;
}
else
return n*fact(n-1);
}
int main()
{
int l,i,t=1;
float deg,rad,val=0;
printf("Enter degree of sin: ");
scanf("%f",°);
printf("Enter limit of Taylor series: ");
scanf("%d",&l);
rad = (deg*3.142857)/180;
for(i=1;i<=l;i+=2)
{
val = val + (t*pow(rad,i)/fact(i));
t = t*(-1);
}
printf("\nValue calculated by program, using Taylor Series:\n");
printf("Sin(%f) = %f\n",deg,val);
printf("\nValue calculated using library function:\n");
printf("Sin(%f) = %f\n",deg,sin(rad));
getch();
return 0;
}
以下是该计划的流程图:
这个流程图适合该程序吗?有什么错误吗?我对编程更新,而且对绘制流程图没有很好的了解。
答案 0 :(得分:4)
使用阶乘函数的风险是它很快超出int
范围。不需要幂函数或因子函数,因为泰勒级数的每个项都可以通过乘法和除法从前一项导出。
乘数是不言而喻的,只是角度的平方。
除数是i * (i - 1)
,是因子的下两个项。
您会看到我删除了您的符号更改系数t
,因为要将前一项的符号从neg更改为pos,或将pos更改为neg,您只需乘以-1
即可。但我甚至通过使用(i - 1)
来反转(1 - i)
的符号来删除它。
该系列的第一个词只是rad
所以我从那开始。
#include <stdio.h>
#include <math.h>
int main()
{
int n, i; // don't use `l` for a variable name
float deg, rad, radsq, val, term;
printf("Enter degree of sin: ");
if(scanf("%f", °) != 1) {
return 1; // or other error handling
}
printf("Enter limit of Taylor series: ");
if(scanf("%d", &n) != 1) {
return 1; // or other error handling
}
rad = deg * 3.14159265f / 180; // proper value for pi
radsq = rad * rad;
term = rad; // first term is rad
val = term; // so is series sum
for(i = 3; i <= n; i += 2) // we've done the first term
{
term *= radsq / (i * (1 - i)); // see explanation
val += term; // sum the series
}
printf("\nValue calculated by program, using Taylor Series:\n");
printf("Sin(%f) = %f\n", deg, val);
printf("\nValue calculated using library function:\n");
printf("Sin(%f) = %f\n", deg, sin(rad));
return 0;
}
答案 1 :(得分:0)
两种情况下的流程图都没有错,因为 1)for循环在main函数体中而不是在fact函数体中。 2)对于事实递归函数,正确的流程聊天将在这里:http://improvec.blogspot.in/2010/12/flow-chart-for-recursive-function-of.html
现在,我知道你知道for循环连接的基本流程图再次尝试主函数并连接两个流程图。