2012-04-04 15 views
0

私はe(e = 1 + 1/1!+1/2!+1/3!+ ...)を制限係数εに近似するプログラムを作成しようとしています。プログラムは、現在のステートメントがユーザによって入力された小さな(浮動小数点)番号であるイプシロンより小さくなるまで、用語の追加を続ける必要があります。シンプルCプログラム定数に近似

eをn番目の単語に近似したプログラムを書くことができますが、最新の単語がイプシロン未満になると停止するのに問題があります。

ご協力いただければ幸いです。

#include <stdio.h> 

int main(void) 
{ 

int i=1,l; 
float e,p,epsilon; 

printf("Enter the value of epsilon: "); 
scanf("%f", &epsilon); 

for(;;) 
{ 
    p=1; 
    for(l = 1; l < 1; l--) 
    { 
     p*=l; 
     if (1/p<epsilon) { 
      goto done; 
     } 
    } 

    e+=1/p; 
    i++; 
} 

done: 
    printf("The value of e limited by epsilon is %f\n",e); 

    return 0; 
} 
+7

あなたの内側のループのに使用します '1 <1 'が真なることはありません。一文字の変数名、特に小文字のLを使用しないでください。 – pmg

+0

階乗関数呼び出しはどこですか? –

+0

あなたはN! (N-1)から!あなたの内側のループは必要ないでしょう。これにラベルは必要ありません。 –

答えて

0

を助けるべきであるここに私のソリューションです:

double eulersNumber(double epsilon) 
{ 
    double e = 0; 
    double factorial = 1; 

    for (int i = 1; TRUE; i++) { 
     double add = 1.0/factorial; 

     if (add < epsilon) 
      break; 

     e += add; 
     factorial *= i; 
    } 

    return e; 
} 
+0

OPが_help_を要求しましたが、_solution_は要求していません。 – Jan

+0

真実ですが、ジャガイモはジャガイモだと言います。 –

+0

私はちょうど私自身でCを学んでいます。実際に見渡すための解決策を持っているのは悪いことではありません。ありがとう! – soulrain

3

これらのライン上の何かが、あなたに

double expo (double x, double epsilon) 
{ 
     double sum=0; 
     unsigned i=0; 
     double fact=0; 
     double factorial=1; 
     while (1) 
     { 
      fact=1/factorial; 
      if ((fact-epsilon) < 0.000001) /* Comparing doubles. Am I safe here? */ 
       break; 

      sum+=fact; 
      i++; 
      factorial*=i; 
     } 
     return sum; 
} 
+0

あなたは 'factorial = 1''と' factorial = i * factorial'を使うことができます。事実= 1 /階乗? – UmNyobe

+0

@UmNyobe提案していただきありがとうございます。私は私の答えを編集しました。 –

1

行くにはharmfulすることができ、それのあなたの使用は最小限にすべきです。 2番目のループは決して実行されません。これは決して1ではないことを意味します。このようなループを中断したい場合は、while構文は問題ありません。この行に沿ったもの:

while(1) 
    Do stuff until you get what you want. A second loop here should do. 
    break; 

これを使用すると、プログラムが機能するはずです。

+3

私はgotoが使わないべきだと強く反対します。もし正しく使われれば、他のコントロールシステムよりも非常に安全で簡単になるでしょう。それは理由のためにC言語の一部です。そう言えば、私はここで少し使い過ぎるgotoを使うことに同意します。 –

+0

私は同意する、私は単語の私の使用は決して少しの過言ではないと思う。私は言葉を変えます。 –

0

変数eを初期化していません。ループに入る前に、変数を初期化します。

e = 1; 

あなたはまた、おそらく内部forループでlを初期化する変数iを使用することを意味しました。ループ条件も逆になっているようです。

for(l = i; l > 0; l--) 

代わりに、決して実行しない

for(l = 1; l < 1; l--) 
+0

はい私はあなたに感謝しました! – soulrain

+0

@soulrain、投稿したコードで 'float e'を宣言して、' e + = 1/p; 'を実行して初期化されていない値にアクセスします。 – mizo