2016-10-27 5 views
0
System.out.print("This program computes the average and variance of all numbers entered. "); 

    boolean finished = false; 
    int total = 0; 

    Scanner inputScanner = new Scanner (System.in); 
    double average = inputScanner.nextDouble(); 
    double variance = inputScanner.nextDouble(); 

    while (!finished) 
    { 
     System.out.println("Enter a number (or type 'exit'): "); 

     if (inputScanner.hasNextDouble()) 
     { 

      total++; 
      System.out.println(total); 
      double currentNum = inputScanner.nextDouble(); 
      average = (average) + (currentNum - average)/total; 
      double prevAverage = ((average * total) - currentNum)/(total - 1); 
      variance = ((variance * (total - 1)) + (currentNum - prevAverage) 
                  * (currentNum - average))/total; 

      System.out.println("So far the average is: " + average 
              + "\nAnd the variance so far is: " + variance); 

     } 
     else if (inputScanner.hasNext("exit")) 
     { 
      finished = true; 
      System.out.println("Thanks for using this program."); 
      inputScanner.close(); 

数字を入力する前に2つの入力を入れなければならない理由がわかりません。また、分散式はNaNとして出てきます。なぜ私はその理由がわかりません。どんな助けでも感謝します、ありがとう。スキャナーは2つの出力までスキャンしませんか?

EDIT

double var1 = (variance * (total - 1)); 
      double var2 = (currentNum - prevAverage) * (currentNum -   average); 
      variance = (var1 + var2)/total; 

これが今の分散のための私の計算です。どうすれば修正できますか?私が '1'を入力した場合、var2はNaNで、2を入力するとvar1はNanです。

+0

私は入力スキャナの全体を固定しましたが、今は分散を取得する方法を知りましたか? –

+0

明示的にそうでないと明示しないと、Javaはすべての中間結果を 'int'にキャストします。私はあなたの計算を分割して、それぞれの部分を別々の 'double'変数に割り当て、次にそれらの部分を組み合わせることをお勧めします。 –

答えて

0

ループに入る前に、inputScanner.nextDouble()を2回呼び出します。 これを続行するには、2つの値が必要です。 「(またはタイプ 『終了』)番号を入力してください。」文を以下の行の前のように: ダブルcurrentNum = inputScanner

私はあなたがあなたの前に2つの入力を入力する必要が

double variance = 0.0; 
+0

私は入力スキャナの全体を修正しましたが、今は分散を取得する方法を知りましたか? –

+0

まあ、コードを書いたのですか、それとも単にコピーしましたか?あなたはそれをデバッグしようとしましたか?あなたは[分散を計算する方法](http://www.mathsisfun.com/data/standard-deviation.html)を知っていますか? – neuhaus

+0

私はそれを自分で書いた、デバッグしていない、私はそれをやろうとします、そして、私たちはそれのための公式を与えられていません –

0

に変更し示唆しています。 nextDouble();

次の行を使用しているユーザーから2つのdouble値を受け取ります。 double average = inputScanner.nextDouble(); double variance = inputScanner.nextDouble();

上記の2行を削除して、変数を宣言/初期化するだけで問題が解決されます。

あなたがループ内++総やっている下記式 以前のようにあなたはので、次の行に合計-1が0になり、ゾロによって何かをdevide値1 に評価されるがNaN

なり、分散にはNaNを取得しています

double prevAverage =((平均*合計) - currentNum)/(合計 - 1)。 //ループの前にこれを行うことによりNaNを

+0

入力スキャナ全体を修正しましたが、今は分散を取得する方法を知りましたか? –

0

次のようになります...

double average = inputScanner.nextDouble(); 
double variance = inputScanner.nextDouble(); 

ユーザーは2つのdouble値を入力するまであなたがブロックしている

EDIT:分散計算(私はありませんチェックそれはところでセマンティクスです)このような

double totalVar = variance * (double) (total - 1); 
double currentNumMinusPreviousAvg = currentNum - prevAverage; 
double currentNumMinusAvg = currentNum - average;  
variance = (totalVar + currentNumMinusPreviousAvg * currentNumMinusAvg)/total; 

何かが中間表現をintにunintededキャストを避け、approriate変数名と目を作る必要がありますより多くのreadble計算も。

+0

入力スキャナ全体を修正しましたが、今は分散を取得する方法を知りましたか? –

0

あなたは常にユーザーに質問しています。ループの最初でそれを行い、変数に格納してif-elseステートメントで使用するようにしてください。それは文字列にすることができるので、文字列を要求し、後でそれを二重に解析しましょう。あなたは正確に小数を使用する場合

boolean finished = false; 
int total = 0; 

Scanner inputScanner = new Scanner (System.in); 
double average = inputScanner.nextDouble(); 
double variance = inputScanner.nextDouble(); 

while (!finished) { 
    System.out.println("Enter a number (or type 'exit'): "); 
    String input = inputScanner.nextLine(); 


    if(input.equals("exit")) { 
     finished = true; 
     System.out.println("Thanks for using this program."); 
     inputScanner.close(); 
    } 
    else { 
     try { 
      double nextDouble = Double.parseDouble(input); 

      //If an exception is trown it won't get past here, so 
      //it won't count 
      total++; 
      System.out.println(total); 

      double currentNum = nextDouble; 
      average = (average) + (currentNum - average)/total; 
      double prevAverage = ((average * total) - currentNum)/(total - 1); 
      variance = ((variance * (total - 1)) + (currentNum - prevAverage) 
        * (currentNum - average))/total; 

      System.out.println("So far the average is: " + average 
        + "\nAnd the variance so far is: " + variance); 
     } 
     catch (NumberFormatException ex) { 
      System.out.println("The number is badly writen"); 
      //It can throw NumberFormatException exception if the 
      //number is badly writen. 
     } 
    } 

} 

また、私はBigDecimalクラスを使用することをアドバイス。

私は助けてくれることを願っています。

よろしくお願いいたします。:)

関連する問題