2016-02-16 3 views
0

Я пытаюсь написать программу, которая запрашивает у пользователя серию положительных значений и вычисляет среднее и стандартное отклонение тех значений, которые имеют входной стоп, когда пользователь вводит -1. Однако, похоже, у меня средняя часть. Я не могу получить стандартное отклонение.Расчет среднего и стандартного отклонения с использованием do while loop

До сих пор это то, что у меня есть.

import java.util.Scanner; 

public class HW0402 

{ 

    public static void main(String[] args) 
    { 
     Scanner input = new Scanner(System.in); 



     double x; 

     double sum = 0; 

     double average = 0; 

     double dev = 0; 

     double var = 0; 

     double sqrx = 0; 

     int n = 0; 

     do 
     { 
      System.out.println("Enter positive values, enter -1 to end"); 
      x = input.nextInt(); 
      if (x == -1) 
      { 
       break; 
      } 

      sum += x; 
      n++; 
      average = sum/n;  
      sqrx += Math.pow(x-average,2); 
      var = sqrx/(n-1); 
      dev = Math.sqrt(var); 


     } while (x != -1); 

     System.out.println("Average: " + average); 
     System.out.println("Deviation: " + dev); 

    } 
} 

я, кажется, чтобы получить странные результаты, такие как десятичные дроби, когда просто вычисление sqrx + = x- среднего

Я новичок в Java и не подался альтернативой к этой проблеме, я хотел бы его, если кто-то указал мне в правильном направлении на то, что я должен был сделать, или объяснить, что я сделал неправильно.

Извините загодя за любые ошибки, которые я совершил.

+0

Ошибка, которую вы делаете, связана с математикой, а не с программированием. Среднее значение вашего набора данных изменяется с каждым новым входом, но каждый раз вы рассчитываете новое среднее значение и добавляете квадрат разницы в 'sqrx'. Это неправильно, потому что каждый раз вы будете использовать другое значение для среднего. Переместите эти операции в _outside_ цикла. Фактически, вы не должны иметь никаких вычислений в своем цикле вообще, потому что вы не выводите результаты. Просто переместите всю математику за пределы цикла, и вы должны получить правильные результаты. – Arc676

+0

Faraz Я действительно не могу действительно ссылаться на связанный ответ, потому что мы еще не покрывали массивы. @ Arc676 для перемещения математики снаружи, где я должен ее перемещать и какие строки я перемещаю, потому что я не могу переместить сумму + = x, не получив неправильного вывода для моего среднего значения. Также для исходного кода мое среднее значение верно, поэтому это означает, что когда вы говорите мои средние изменения, как это влияет на sqrx + = Math.pow (x-average)? – STRAN

ответ

0
int n = 0; 
int K = 0; 
double Sum = 0; 
double Sum_sqr = 0; 
do { 
    System.out.println("Enter positive values, enter -1 to end"); 
    x = input.nextInt(); 
    if (x == -1) 
    { 
     break; 
    } 
    if (n == 0) K = x; 
    n++; 
    Sum += (x - K); 
    Sum_sqr += (x - K) * (x - K); 
} while (x != -1); 
double mean = K + Sum/n; 
double varPop = (Sum_sqr - (Sum*Sum)/n)/(n); 
double varSample = (Sum_sqr - (Sum*Sum)/n)/(n-1); 
double devPop = Math.sqrt(varPop); 
double devSample = Math.sqrt(varSample); 

Ссылка Wikipedia: Computing Shifted Data. Также, Population или Sample, имеет значение.

+0

Код работал, и Wiki Link является удивительным, однако не могли бы вы объяснить, почему sum и sum_sqr остались в цикле, а средний, varpop, varsample и т. Д. - нет? – STRAN

+0

Наверное, не имеет значения, где они. Выйти за пределы цикла, потому что их нужно только вычислить. Другими словами, я проверил его против массива, я не думал распечатывать результаты для каждого нового номера. Включите их в цикл всеми способами. –

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