私はそれぞれのテイラー級数を計算するプログラムを作ったが、教授は最初に分けてそれを変えて欲しい。これは私のコードで、最初の部分にdivide()を使っています。私のpower()とfact()は、私の古いコードへの参照に過ぎません。 テイラー級数をCで割って最初に掛け算すると、
#include <stdio.h>
#include <math.h>
int main()
{
double x, mySin(), myCos(), myExp();
char more;
do {
printf ("\n\t\t\t\t\tInput x: ");
scanf ("%lf", &x);
printf ("\n\t\t\t\t\t\t\tLibraryResult \t MyResult");
printf ("\n\t\t\tSin(%6.2f)\t %9.6f\t\t%9.6f", x, sin(x), mySin(x));
printf ("\n\t\t\tCos(%6.2f)\t %9.6f\t\t%9.6f", x, cos(x), myCos(x));
printf ("\n\t\t\tExp(%6.2f)\t %9.6f\t\t%9.6f", x, exp(x), myExp(x));
printf ("\n\n\t\t\t\t\tDo more (Y/N) ?");
scanf ("%s", &more);
} while (more == 'y' || more == 'Y');
}
double mySin(double x)
{
double sum = 0., divide();
int i, sign = 1;
for (i = 0; i < 30; i++, sign = - sign)
sum = sum + sign * divide(x) ; //power(x, 2 * i + 1)/fact(2 * i + 1);
return sum;
}
double myCos(double x)
{
double sum = 0., divide();
int i, sign = 1;
for (i = 0; i < 30; i++, sign = - sign)
sum = sum + sign * divide(x);//power(x, 2 * i)/fact(2 * i);
return sum;
}
double myExp(double x)
{
double sum = 0., divide();
int i;
for (i= 0; i < 30; i++)
sum = sum + divide(x); //power(x, i)/fact(i);
return sum;
}
double divide(int n, double x)
{
int i;
double div = 1.;
for (i = 1; i < n; i++)
div = x/i;
return div;
}
/*double fact(int n)
{
int i;
double prod = 1.;
for (i = 1; i <= n; i++)
prod = prod * i;
return prod;
}
double power (double x, int n)
{
int i;
double prod = 1.;
for (i = 0; i < n; i++)
prod = prod * x;
return prod;
}
*/
は、私は、Xを入力したとき< nはない結果が得られていない私を使用して、分割のコードとき()をいじりてきました。しかし、私は30を使用しますが、計算は間違っています。私は自分自身でこれを理解しようとしているので、ちょうどポインタが役に立つでしょう!ありがとう!
'divide'関数では、毎回' div'の値を上書きするだけなので 'for'ループは何もしません。したがって、関数は 'return x /(n-1);'と等価です。多分あなたは 'div * = x/i;'を意味していたでしょう。 – user3386109
あなたの 'divide'は' divide(int n、double x) 'という2つの引数をとりますが、あなたは' sum = sum + sign * divide(x) 'だけでそれを呼び出すことにも注意してください。これはあなたにエラーを与えるはずですが、 'double sum = 0.、divide();'として 'ローカル'分割を宣言しましたが、コンパイラはただ一緒に進むが、xを指定するだけなので、 nとする。その余分な 'n'を渡すとより意味をなさないはずです。 – LambdaBeta
LambdaBetaが指摘した問題を回避するための一般的なヒント:関数プロトタイプを他の関数に入れず、関数プロトタイプを指定することは決してありません。標準的なプラクティスは2つあります。 1)すべての関数プロトタイプをファイルの先頭に置きます。関数定義をコピーし、ファイルの先頭に貼り付け、セミコロンを追加します。 2)関数を逆順に並べ替えます。つまり、 'divide'がファイルの先頭にあり、' myCos'、 'mySin'、' myExp'、 'main'がファイルの最後に続きます。このようにして、関数定義は関数プロトタイプとして機能し、プロトタイプのエラーを回避します。 – user3386109