我在编码方面很陌生,并试图为uni编写一个罪恶进展
作为一个公式,它看起来像这样:
所以我试着编码......不知怎的,它计算的是弧度而不是正弦......出了什么问题?
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
double n, a;
int fakultaet(double a = 2 * n + 1)
{
if (a == 0)
return 1;
else
return (a * fakultaet(a - 1));
}
int _tmain(int argc, _TCHAR* argv[])
{
double sin, y, f; // sin = Sinus, y= angle, n=index
printf("please insert the angle \n");
scanf("%lf", &y);
double x = y * 3.14159265359 * 1 / 180; // x = radian measure
while (n < 5)
{
sin = pow(-1, n) * pow(x, 2 * n + 1) / fakultaet(a);
}
printf("The sinus is %lf\n", sin);
system("Pause");
return 0;
}
答案 0 :(得分:1)
你没有增加罪,或n。同样硬编码阶乘的入门值并不好。 看起来应该更像这样:
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
int fakultaet(double a)
{
if (a == 0)
return 1;
else
return (a * fakultaet(a - 1));
}
int main()
{
double sin = 0, y, f; // sin = Sinus, y= angle, n=index
printf("please insert the angle \n");
scanf("%lf", &y);
double x = y * 3.14159265359 * 1 / 180; // x = radian measure
for (int n = 0; n < 5; ++n)
{
sin += pow(-1, n) * pow(x, 2 * n + 1) / fakultaet(2 * n + 1);
}
printf("The sinus is %lf\n", sin);
system("Pause");
return 0;
}
我做了几次编辑。我改变了阶乘函数:
int fakultaet(double a = 2 * n + 1)
进入非硬编码版本:
int fakultaet(double a)
添加了sin初始化:
double sin = 0
更改了你的while循环:
while (n < 5)
进入包含缺失增量的for:
for (int n = 0; n < 5; ++n)
也改变了罪的计算:
sin = pow(-1, n) * pow(x, 2 * n + 1) / fakultaet(a);
总结为:
sin += pow(-1, n) * pow(x, 2 * n + 1) / fakultaet(2 * n + 1);
答案 1 :(得分:0)
通过观察,您可以获得更整洁,更有效的结果 总和中的相邻项是相关的。我们可以将此表示为重复:
T_n = - T_{n-1} x^2 /((2n+1) (2n))
T_0 = x
这更好,因为它避免了对pow
的调用以及需要进行任何明确的因子计算(fakultaet
)。
代码类似于:
int main() {
...
double T = x;
double sin = T;
for(int i=1 ; i<5; ++i) {
T *= -(x*x) / ((2*i+1)*(2*i));
sin += T;
}
...
}