2010-11-30 14 views
-2

さて、私は思っていたことすべてを試してみましたが、このプログラムをどうやって稼働させるのか分かりませんでした。私は主に使用されているすべての機能をテストしましたが、もしもいくつかのバグがある場合に備えてそれらを含めました。しかし確かに、私は間違いがメインであると信じています。My_sine:私の機能に何が問題なのですか?

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define PI 3.14159265359 

double int_power(double x, int e); 


int main() 
{ 
    int my_factorial(int n); 
    double my_sine_taylor(double x); 
    double my_sine(double x); 
    double mod_two_pi(double x); 
    double get_double(void); 
    void safeGetString(char arr[], int limit) 

    char arr[255]; 
    double x,y,ans; 

    printf("Enter a number: "); 
    safeGetString(arr[255],255); 
    my_sine(mod_two_pi(get_double())); 
    printf("The sine is %f \n", ans); 

    return 0; 
} 

/* 
int_power should compute x^e, where x is a double and e is an integer. 
*/ 
double int_power(double x, int e) 
{ 
    int i = 0; 
    double ans = 1; 
    while(i <= e) 
    { 
     ans = ans*x; 
     i++; 
    } 

    return ans; 
} 

/* 
my_factorial will find the factorial of n 
*/ 
int my_factorial(int n) 
{ 
    int i = n; 
    int ans = 1; 

    while(i > 0) 
    { 
     ans = ans*i; 
     i = i-1; 
    } 

    return ans; 
} 

/* 
my_sine_taylor computes the approxmiation 
of sin(x) using the taylor series up through x^11/11! 
*/ 
double my_sine_taylor(double x) 
{ 
    return x - int_power(x,3)/my_factorial(3) + int_power(x,5)/my_factorial(5) - 
    int_power(x,7)/my_factorial(7) + int_power(x,9)/my_factorial(9) - 
    int_power(x,11)/my_factorial(11); 
} 

/* 
my_sine(x) should return a very good approximation of sin(x). 
It should first reduce x mod 2pi and then map the result into the 
upper right quadrant (where the taylor approximation is quite accurate). 
Finally, it should use my_sine_taylor to compute the answer. 
*/ 

double my_sine(double x) 
{ 
    double ans; 

    if (x >= 0 && x <= PI/2){ 
     ans = my_sine_taylor(x); 
    } else if (x > PI/2 && x <= PI){ 
     x=PI-x; 
     ans = my_sine_taylor(x); 
    } else if (x > PI && x <= 3*(PI/2)){ 
     x = x-PI; 
     ans = -(my_sine_taylor(x)); 
    } else { 
     x=2*PI-x; 
     ans = -(my_sine_taylor(x)); 
    } 
} 

/* 
mod_two_pi(x) should return the remainder when x 
is divided by 2*pi. This reduces values like 
17pi/2 down to pi/2 
*/ 
double mod_two_pi(double x) 
{ 
    int y; 
    y = floor(x/(2*PI)); 
    x = x - 2*PI*y; 
    return x; 
} 

/* 
get_double and safeGetString are used to get floating point 
input from the user 
*/ 
double get_double(void) 
{ 
    double x; 
    char arr[255]; 
    x=atof(arr); 
} 

void safeGetString(char arr[], int limit) 
{ 
    int c, i; 
    i = 0; 

    c = getchar(); 
    while (c != '\n'){ 
     if (i < limit -1){ 
      arr[i] = c; 
      i++; 
     } 
     c = getchar(); 
    } 
    arr[i] = '\0'; 
} 
+1

デバッグをやり直してから、より具体的な質問に戻ってみると、より多くのヘルプが得られるはずです。クイックヒント - 'arr [255]'を 'safeGetString'に渡すのが間違っています。 –

+2

コードを選択してCtrl + Kキーを押してコードをフォーマットしてください。 – EboMike

+5

2つの 'main'関数もあります。ここで何か怪しいです。 –

答えて

6

oh my ...どこから始めるのですか? 、

my_sine(mod_two_pi(get_double())); 

は、ですから、それは何も送信していない:あなたはこのように呼んで

double get_double(void) 
{ 

    double x; 

    char arr[255]; 

    x=atof(arr); 
} 

見てみましょう...


あなたがこの機能を持っています意味のある価値を期待しています。基本的にarr[255]は初期化されていないため、ガーベッジが保持されます。あなたはこのゴミを取って、atofでフロートに変換していますが、それは何もしません。

私が推測しなければならないことは、これがあなたのプログラムを本当に壊していると言います。以下に書いた残りの部分は解説です。何らかの理由で


、あなたはあなたのmain内のこれらの機能のすべてを宣言しています。私はこれがを壊すべきではないと考えています何か、それは確かに悪いコーディングスタイルです。


my_sine_taylorは、サインの6要素テイラー近似を使用して計算します。その正確さが必要ですか? 11!はかなり大きいですし、11番目の特定の数字もかなり大きいかもしれません。これで不必要な丸め誤差やオーバーフローエラーが発生する可能性があります。

+0

なぜ宣言する関数が不適切なコーディングスタイルですか?宣言の範囲を限定することは必ずしも悪い考えではありません。もちろん、これは正しくありません: 'void safeGetString(char arr []、int limit)char arr [255];'。機能を宣言するには、 –

+1

をお勧めします。関数内でそれらを宣言するのは一般的ではありません。関数が不必要に使用される場所を制限します。 –

+0

@Nathan Fellman:コンパイラがどこでプロトタイプを知っているかだけを制限します。これらの機能は、定義されているスコープ内のどこでも使用できます(つまり、この場合はグローバル)、コンパイラはパラメータと戻り値の型について(おそらく危険な)仮定を行います。そこには、彼らが目に見える範囲の上に宣言されるべき理由があります。 – JeremyP

関連する問題