2016-10-27 3 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(); 

Не знаете, почему я должен поставить два ввода до того, как он попросит меня ввести число? Кроме того, формула дисперсии выводится как NaN, и я не знаю, почему. Любая помощь будет оценена, спасибо.Сканер не сканирует до двух выходов?

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() дважды перед входом в цикл. Для этого требуется два значения.

Я предлагаю вам изменить его

double variance = 0.0; 
+0

Я исправил всю вещь сканера ввода, теперь мне просто интересно, как заставить дисперсию работать? –

+0

Ну, ты написал код или просто скопировал его? Вы пытались отладить его? Вы знаете [как рассчитать отклонение] (http://www.mathsisfun.com/data/standard-deviation.html)? – neuhaus

+0

Я сам написал это, не отлаживал. Я постараюсь это сделать, и нам не дали формулу для него. –

0

Вы должны ввести два входа, прежде чем «Введите номер (или типа„выход“):» заявление как до линии ниже: двойной currentNum = inputScanner. nextDouble();

Вы принимаете два двойных значения от пользователя, используя следующие строки: double average = inputScanner.nextDouble(); double variance = inputScanner.nextDouble();

удалить выше двух строк и только объявить/инициализировать переменную, решит вашу проблему.

Вы получаете NaN в дисперсии, как и до следующей формулы вы делаете общее ++ внутри цикла, которая будет оценивать значение 1 так и в следующей строке полного 1 будет 0, и разделит ничего от Зоро будет NaN

double prevAverage = ((средний * всего) - currentNum)/(всего - 1); // будет NaN

+0

Я исправил всю вещь сканера ввода, теперь мне просто интересно, как заставить дисперсию работать? –

0

Делая это перед циклом:

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

Вы блокирующим, пока пользователь не введет две двойные значения ...

EDIT: вычисление отклонений (я не проверка это семантика BTW)

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

что-то вроде этого следует избегать uninteded слепков с int для промежуточных выражений и с именами переменных вывоза мебели делает тыс e вычисление больше readble тоже.

+0

Я исправил всю вещь сканера ввода, теперь мне просто интересно, как заставить дисперсию работать? –

0

Вы постоянно запрашиваете пользователя, и вы должны делать это только в начале цикла и хранить его в переменной, чтобы использовать его в инструкции if-else. Так как это может быть строка, давайте попросим строку и проанализируем ее позже в double.

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 класс.

Надеюсь, я помог.

Имейте славный день.:)

Смежные вопросы