2016-10-27 19 views
0
import java.util.Scanner; 

public class AverageAndVariance { 

public static void main (String[] args) 
{ 
    System.out.println("This program computes the average and variance of all numbers entered. "); 

    boolean finished = false; 
    double total = 0.0; 
    double average = 0.0; 
    double variance = 0.0; 

    Scanner inputScanner = new Scanner (System.in); 

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

     if (inputScanner.hasNextDouble()) 
     { 
      total++; 

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

      if (total > 1) 
      { 
       double var1 = (variance * (total - 1)); 
       double var2 = (currentNum - prevAverage) * (currentNum - average); 
       variance = (var1 + var2)/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("Goodbye."); 
      inputScanner.close(); 
     } 
     else 
     { 
      System.out.println("Invalid input."); 
     } 
    } 
} 
} 

最後にエラーを処理する方法を知りたいだけで、私のelse文は無限ループですか? whileループの始めに戻すにはどうしたらいいですか?また、自分のプログラムが非常に非効率的であるように感じます。私は分散に問題を抱えていましたが、入れ子にしたifステートメントを実行すると効果がありましたか?コードをより効率的にするにはどうすればいいですか?ありがとう。エラー処理と効率性?

EDIT は、無効な入力出力を修正だけでwhileループ内でスキャナを入れていた、ちょうどこのコードは、それが今よりも任意のより効率的な可能性があれば知りたいですか? (if文と同じ機能を維持しながら、すなわち任意の私がドロップすることができますか?)

+3

効率はしません一度間違った入力を入力した偽このコードの問題。 – duffymo

+2

また、else節のスキャナのバッファから無効な入力を削除する必要があります。 – Kayaman

+1

@Kayamanが言ったことを明確にするために、 'Scanner'オブジェクトをループ内で動かさないでください。その代わりに、 'nextLine()'を呼び出すことによって、不正な入力を消去(aka * discard *)する必要があります。また、ループ内のスキャナも閉じないでください*。 – Andreas

答えて

0

を上記のコードでは、それは良いことだけどinputScanner.hasNextDouble()リターンを私たちは

import java.util.Scanner; 

public class AverageAndVariance { 

public static void main (String[] args) 
{ 
    System.out.println("This program computes the average and variance of all numbers entered. "); 

    boolean finished = false; 
    double total = 0.0; 
    double average = 0.0; 
    double variance = 0.0; 

    Scanner inputScanner = new Scanner (System.in); 

    while (!finished) 
    { 
     System.out.println("1. Enter a number "); 
     System.out.println("0. Exit "); 
     System.out.println("Enter Your Choice "); 
     try 
     { 
     int option= inputScanner.nextInt(); 

     switch(option) 
     { 
     case 1: 
      total++; 
      System.out.println("Enter your Number"); 
      double currentNum = inputScanner.nextDouble(); 
      average = (average) + (currentNum - average)/total; 
      double prevAverage = ((average * total) - currentNum)/(total - 1); 

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

      System.out.println("So far the average is: " + average 
                + "\nAnd the variance so far is: " + variance);  
      break; 
     case 0: 
      finished = true; 
      System.out.println("Goodbye."); 
      inputScanner.close(); 
      break; 
     default: 
      System.out.println("Invalid Output"); 
      break; 
     } 
     } 
     catch(Exception ex) 
     { 
      System.out.println("Error "+ex.getMessage()); 
      finished = true; 
     } 

    } 
} 
} 
関連する問題