1
votes

My assignment is to take numbers, one per line and calculate the mean and median and variance and Standard Deviation. The while loop stops when null is entered or 500 numbers have been entered. I calculated the median and Standard Deviation but for some reason my output for the variance and mean are wrong. Also if you could help me with my parameters for while loop to also end when 500 numbers are entered.

My input:

0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 5.0, 6.0, 6.0, 6.0, 6.0, 7.0, 7.0, 7.0, 7.0, 7.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 8.0, 9.0, 9.0, 9.0, 9.0, 9.0, 9.0, 9.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 11.0, 11.0, 11.0, 11.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 12.0, 13.0, 13.0, 13.0, 13.0, 13.0, 13.0, 13.0, 13.0, 14.0, 14.0, 14.0, 14.0, 14.0, 14.0, 15.0, 15.0, 15.0, 15.0, 15.0, 15.0, 15.0, 16.0, 16.0, 16.0, 17.0, 17.0, 17.0, 17.0, 18.0, 18.0, 18.0, 18.0, 18.0, 18.0, 18.0, 19.0, 19.0, 19.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 20.0, 21.0, 21.0, 21.0, 21.0, 21.0, 21.0, 21.0, 21.0, 22.0, 22.0, 22.0, 22.0, 22.0, 22.0, 22.0, 23.0, 23.0, 23.0, 23.0, 23.0, 24.0, 24.0, 24.0, 24.0, 24.0, 25.0, 25.0, 25.0, 25.0, 25.0, 25.0, 26.0, 26.0, 26.0, 26.0, 26.0, 26.0, 26.0, 26.0, 27.0, 27.0, 27.0, 28.0, 28.0, 28.0, 29.0, 29.0, 29.0, 29.0, 29.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 31.0, 31.0, 31.0, 31.0, 33.0, 33.0, 33.0, 33.0, 33.0, 34.0, 34.0, 34.0, 34.0, 34.0, 34.0, 34.0, 35.0, 35.0, 35.0, 35.0, 35.0, 36.0, 36.0, 36.0, 37.0, 37.0, 37.0, 38.0, 38.0, 38.0, 38.0, 39.0, 39.0, 39.0, 39.0, 39.0, 39.0, 39.0, 40.0, 40.0, 40.0, 41.0, 41.0, 41.0, 41.0, 41.0, 42.0, 42.0, 42.0, 42.0, 43.0, 43.0, 43.0, 43.0, 44.0, 44.0, 44.0, 45.0, 45.0, 45.0, 45.0, 45.0, 46.0, 46.0, 46.0, 46.0, 46.0, 46.0, 47.0, 47.0, 47.0, 47.0, 47.0, 49.0, 49.0, 49.0, 49.0, 49.0, 50.0, 50.0, 51.0, 51.0, 51.0, 51.0, 51.0, 52.0, 52.0, 52.0, 52.0, 52.0, 53.0, 53.0, 53.0, 53.0, 54.0, 54.0, 54.0, 55.0, 55.0, 55.0, 56.0, 56.0, 56.0, 56.0, 56.0, 56.0, 57.0, 57.0, 58.0, 58.0, 58.0, 58.0, 58.0, 59.0, 59.0, 59.0, 59.0, 59.0, 59.0, 60.0, 60.0, 60.0, 60.0, 60.0, 60.0, 61.0, 61.0, 61.0, 61.0, 61.0, 61.0, 61.0, 61.0, 62.0, 62.0, 62.0, 62.0, 63.0, 63.0, 63.0, 64.0, 64.0, 64.0, 64.0, 64.0, 64.0, 64.0, 64.0, 65.0, 65.0, 65.0, 65.0, 65.0, 65.0, 66.0, 66.0, 66.0, 66.0, 66.0, 66.0, 67.0, 67.0, 67.0, 68.0, 68.0, 68.0, 68.0, 68.0, 68.0, 68.0, 68.0, 68.0, 69.0, 69.0, 69.0, 69.0, 69.0, 69.0, 70.0, 70.0, 70.0, 70.0, 70.0, 70.0, 70.0, 71.0, 71.0, 71.0, 71.0, 71.0, 71.0, 71.0, 72.0, 72.0, 72.0, 72.0, 72.0, 72.0, 72.0, 72.0, 72.0, 73.0, 73.0, 73.0, 73.0, 74.0, 74.0, 75.0, 75.0, 75.0, 75.0, 76.0, 76.0, 76.0, 76.0, 76.0, 77.0, 77.0, 77.0, 77.0, 77.0, 77.0, 77.0, 78.0, 78.0, 78.0, 79.0, 79.0, 79.0, 79.0, 79.0, 79.0, 79.0, 79.0, 79.0, 80.0, 80.0, 80.0, 80.0, 81.0, 81.0, 81.0, 82.0, 82.0, 82.0, 82.0, 82.0, 82.0, 83.0, 83.0, 83.0, 83.0, 84.0, 84.0, 84.0, 84.0, 84.0, 85.0, 85.0, 85.0, 85.0, 85.0, 85.0, 85.0, 86.0, 86.0, 87.0, 87.0, 87.0, 87.0, 87.0, 87.0, 88.0, 88.0, 88.0, 88.0, 88.0, 89.0, 89.0, 89.0, 89.0, 90.0, 90.0, 90.0, 91.0, 91.0, 91.0, 91.0, 92.0, 92.0, 92.0, 93.0, 93.0, 93.0, 93.0, 94.0, 94.0, 94.0, 94.0, 94.0, 95.0, 95.0, 95.0, 96.0, 96.0, 96.0, 96.0, 96.0, 97.0, 97.0, 97.0, 98.0, 98.0, 98.0, 98.0, 99.0, 99.0, 99.0, 100.0, 100.0

null

My output:

Mean: 47.21
Median: 47.00
Variance: 857.34 Standard Deviation: 29.28

Expected Output:

Mean: 47.27
Variance: 856.71
Standard Deviation: 29.27

BufferedReader stdin =
                    new BufferedReader (new InputStreamReader (System.in));
            NumberFormat nf = new DecimalFormat ("0.00");
            nf.setMinimumFractionDigits (2);//Sets Min digits
            nf.setMaximumFractionDigits (2);//Sets Max digits
            String inputValue;
            double sum = 0;
            double counter = 0;
            double median = 0;
            double variance = 0;
            double varianceCounter = 0;






            List<String> input = new ArrayList<String>();
            List<Double> numbers = new ArrayList<Double>();


            while((inputValue = stdin.readLine()) != null && !inputValue.equals("")){
                input.add(inputValue);
                numbers.add (Double.parseDouble(inputValue));        
            }
                 for(int i = 0; i < input.size(); i++){
                    sum += (numbers.get(i));
                    counter++;  
                }

            Collections.sort(numbers);
            for(int i = 0; i < numbers.size(); i++){
            if  (numbers.size() % 2 == 0){
                median = (numbers.get(numbers.size()/2-1) + numbers.get(numbers.size()/2))/2;
            }
            else {
                median = (numbers.get((numbers.size())/2));
            }
            }
            for(int i = 0; i < input.size(); i++){
                    variance += numbers.get(i) * numbers.get(i);
                    varianceCounter++;
            }






            System.out.println ("Mean: " + (nf.format(sum/counter)));
            System.out.println ("Median: " + (nf.format(median)));
            System.out.println ("Variance: " + (nf.format((variance/varianceCounter)-(sum*sum)/(varianceCounter*varianceCounter))));    
    System.out.println ("Standard Deviation: " + (nf.format(Math.sqrt((variance/varianceCounter)-(sum*sum)/(varianceCounter*varianceCounter)))));           
    }
    }
1

1 Answers

1
votes

This is where using the formatter in your IDE (if not your debugger) helps.

The problem you have is you are summing all the values on every input.

while ((inputValue = stdin.readLine()) != null && !inputValue.equals("")){
    input.add(inputValue);
    numbers.add (Double.parseDouble(inputValue));        
    // sum all the values on every input i.e. 1 1 2 1 2 3 1 2 3 4
    for (int i = 0; i < input.size(); i++){
        sum += (numbers.get(i));
        counter++;  
    }

What you should be doing is reading all the input and only then summing all the values.

while ((inputValue = stdin.readLine()) != null && !inputValue.equals("")){
    input.add(inputValue);
    numbers.add (Double.parseDouble(inputValue));        
}
// sum all the values AFTER all the input. i.e. 1 2 3 4
for (int i = 0; i < input.size(); i++){
    sum += (numbers.get(i));
    counter++;  
}

BTW The counter should always be the input.size()