Schnellster
Schnellster

Reputation: 13

Sum and Averages of an Array

I am working on an array problem for my college course and I'm trying to find the sum and the average of an array. Here's the code I have so far.

public class Module55
{
   public static void main(String args[])
   {

   //declare the array to have 10 items for 10 weeks
   //also declare sum as an int and average as a double to accommodate for decimal points

      int[] weeks = new int[10];
      int sum = 0;
      double average = 0;

   //declare the array values

      weeks[0]= 2;
      weeks[1]= 4;
      weeks[2]= 8;
      weeks[3]= 10;
      weeks[4]= 14;
      weeks[5]= 16;
      weeks[6]= 20;
      weeks[7]= 22;
      weeks[8]= 24;
      weeks[9]= 26;

   // determine sum of the array values

     for (int index = 0; index < weeks.length; index++) weeks[index] = index;
        sum = sum + weeks[index];
        System.out.println("The total miles ran in 10 weeks is " + sum);

   // determine the average of the array values

     if (weeks.length != 0)
        average = sum / weeks.length;
     else
        average = 0;

     System.out.println("The average of the miles ran in 10 weeks is " + average);
     }
}

I know that the average works but I'm stuck on the sum. The problem I'm having is I cant seem to initialize the values in the array so that I can provide a sum for them. What am I doing wrong or what am I missing?

Upvotes: 1

Views: 515

Answers (8)

Levent Divilioglu
Levent Divilioglu

Reputation: 11622

You have two problems in your code;

A) For-loop assignment

You don't need to make the first assignment, just adding sum to the week[index] is ok;

    for (int index = 0; index < weeks.length; index++)
        sum = sum + weeks[index];

B) Calculating the average

Sum is defined as an int which is a primitive integer, because of that, the division of an integer to an integer, the output is an integer which is not precise. Output of the division (45/10) is casted to integer, then assigned to double which is rounded off to 4, then casted to double again, and '4.0' became the result.

To avoid this unprecise result, cast sum to the double as below;

average = (double)sum / weeks.length;

The corrected version of your code is as below;

Demo

public class Module55 {
    public static void main(String args[]) {

        // declare the array to have 10 items for 10 weeks
        // also declare sum as an int and average as a double to accommodate for
        // decimal points

        int[] weeks = new int[10];
        int sum = 0;
        double average = 0;

        // declare the array values

        weeks[0] = 2;
        weeks[1] = 4;
        weeks[2] = 8;
        weeks[3] = 10;
        weeks[4] = 14;
        weeks[5] = 16;
        weeks[6] = 20;
        weeks[7] = 22;
        weeks[8] = 24;
        weeks[9] = 26;

        // determine sum of the array values
        for (int index = 0; index < weeks.length; index++)
            sum = sum + weeks[index];

        System.out.println("The total miles ran in 10 weeks is " + sum);

        // determine the average of the array values
        if (weeks.length != 0)
            average = (double)sum / weeks.length;
        else
            average = 0;

        System.out.println("The average of the miles ran in 10 weeks is " + average);
    }
}

Output

The total miles ran in 10 weeks is 146
The average of the miles ran in 10 weeks is 14.6

And a note for scope

And one last note about the scope, check out this code;

 for (int index = 0; index < weeks.length; index++)
    weeks[index] = index;
    sum = sum + weeks[index];
    System.out.println("The total miles ran in 10 weeks is " + sum);

In the for-loop, because that no brackets are used, only the first statement under the for-loop will be considered in the scope of the loop by the compiler. That's why, for the next line, the compiler is giving error about the index because index is defined inside the scope of the for-loop.

Upvotes: 2

sprinter
sprinter

Reputation: 27996

A very simple way to achieve this in Java 8 is to use the built in mechanisms for gathering statistics:

int[] weeks = {3, 4, 6, 9, 10};
IntSummaryStatistics stats = IntStream.of(weeks).summaryStatistics();
System.out.println("sum = " + stats.getSum() + "; average = " + stats.getAverage());

Upvotes: 2

SmashCode
SmashCode

Reputation: 761

you can find this handy with lambdas.The code looks something like this.

int weeks[] = {1,2,3,4};
List<Integer> asd = IntStream.of(weeks).boxed().collect(Collectors.toList());
//asd.forEach(System.out::println);
//this outputs average
System.out.println(asd.stream().mapToDouble(val -> val).sum()/asd.size());
//this outputs sum
System.out.println(asd.stream().mapToInt(val -> val).sum());
//another way to achieve this thanks to commenter
System.out.println(IntStream.of(asd).summaryStatistics());

Upvotes: 1

Raghu K Nair
Raghu K Nair

Reputation: 3942

The corrected code. While calculating average you have cast on of the varibale to double else you will get the average as integer

public class Mod55 {

    public static void main(String args[]) {

        //declare the array to have 10 items for 10 weeks
        //also declare sum as an int and average as a double to accommodate for decimal points
        int[] weeks = new int[]{2, 4, 8, 10, 14, 16, 20, 22, 24, 26};
        int sum = 0;
        double average = 0;

        // determine sum of the array values
        for (int index = 0; index < weeks.length; index++) {
            sum += weeks[index];
        }
        System.out.println("The total miles ran in 10 weeks is " + sum);

        // determine the average of the array values
        if (weeks.length != 0) {
            average = (double)sum / weeks.length;
        } else {
            average = 0;
        }

        System.out.println("The average of the miles ran in 10 weeks is " + average);
    }
}

Java8 You could achieve the same thing like this.

        int[] weeks = new int[]{2, 4, 8, 10, 14, 16, 20, 22, 24, 26};
        int sum = Arrays.stream(weeks)
                 .sum();
        double average = Arrays.stream(weeks).average().orElse(0);

Upvotes: 1

FredK
FredK

Reputation: 4084

Summing an array of numbers and dividing by n to get the average like this will not get the correct value - you should not compute the average using integer division. Also, this approach might work for the example shown, but not in general. For example, try using this code to find the average of these two value: (INT_MAX-6) and (INT_MAX-2).

Upvotes: 1

mahbubcsedu
mahbubcsedu

Reputation: 158

First of all, you simply don't need the line weeks[index] = index;. And for average you have to cast the sum to double if you want to get the average in double as you have declared the sum as int.

public class Module55
{
   public static void main(String args[])
   {

   //declare the array to have 10 items for 10 weeks
   //also declare sum as an int and average as a double to accommodate for decimal points

      int[] weeks = {2,4,8,10,14,16,20,22,24,26};
      int sum = 0;
      double average = 0;

   // determine sum of the array values

     for (int index = 0; index < weeks.length; index++) 
         //weeks[index] = index;
         sum = sum + weeks[index];
         System.out.println("The total miles ran in 10 weeks is " + sum);

   // determine the average of the array values

     if (weeks.length != 0)
        average = (double)sum / weeks.length;
     else
        average = 0;

     System.out.println("The average of the miles ran in 10 weeks is " + average);
     }
}

The total miles ran in 10 weeks is 146

The average of the miles ran in 10 weeks is 14.6

Upvotes: 1

Noam Hacker
Noam Hacker

Reputation: 4835

you need to use brackets in your for loop. currently your code is evaluating like this:

for (int index = 0; index < weeks.length; index++) 
{
    weeks[index] = index;
}
sum = sum + weeks[index];
System.out.println("The total miles ran in 10 weeks is " + sum);

you want your code to evaluate like this

for (int index = 0; index < weeks.length; index++) 
{
    weeks[index] = index; //logical issue, what does this line achieve?
    sum = sum + weeks[index];
}
System.out.println("The total miles ran in 10 weeks is " + sum);

This will at least solve your procedural problems but you will still need to take a look at your logic. Try using breakpoints to debug your code.

Upvotes: 2

JC97
JC97

Reputation: 1620

for (int i = 0;i < weeks.length) {
    sum += weeks[i];
}

System.out.println("Sum is:" + sum);

Upvotes: 1

Related Questions