Dick Smith
Dick Smith

Reputation: 1

Return the amount of numbers below average

I am trying to write a program that returns the amount of numbers less than the average

For example, if I have the numbers 2, 3 and 4, the average would be (2.1+3.6+4.2)/3 = 3.3 and since 2.3 is below average it would return 1 as there is one number below the average.

I am getting an error that says

Type mismatch: cannot convert from double[] to int

My code:

public static void main(String[] args) {

    double[] numbers = {2.1, 3.6, 4.2};

    System.out.println(belowaverage(numbers));
}



public static int belowaverage(double[] ba) {
    double sum = 0;
    double average = 0;

    for(int i = 0;i<ba.length;i++){
        sum = sum + ba[i];
        average = sum / ba.length;
        if(ba[i]<average){
        return ba;
    }
}

Upvotes: 0

Views: 1915

Answers (4)

Scary Wombat
Scary Wombat

Reputation: 44834

You need to work out the sum first, then compute the average and then count how many below this threshold.

try

public static int belowaverage(double[] ba) {
  double sum = 0;
  double average = 0;
  int count = 0;

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

  for(int i = 0;i<ba.length;i++){
   if (ba[i] < average) count++;
  }

  return count;

}

Upvotes: 0

Mshnik
Mshnik

Reputation: 7032

This isn't going to work using only a single for loop, because you can't possibly compare anything to the average until you've calculated it.

Try separating your calculation of the average and the counting of terms below the average into two different loops:

 public static int belowaverage(double[] ba) {
    double sum = 0;
    double average = 0;
    for(double b : ba){
        sum += b;
    }
    average = sum / ba.length;
    int count = 0;
    for(double b : ba){
        if(b < average){
            count++;
        }
    }
    return count;
}

Upvotes: 0

Raja CSP
Raja CSP

Reputation: 172

public static void main(String[] args) {
    double[] numbers = {2.1, 3.6, 4.2};
    System.out.println(belowaverage(numbers));
}

public static int belowaverage(double[] ba) {
    double sum = 0;

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

    double average = sum / length; 
    int belowAvgCount = 0;
    for (int i = 0; i < length; i++) {
        if (ba[i] < average) {
            belowAvgCount++;
        }
    }        
    return belowAvgCount;
}

Upvotes: 0

Mateusz Dymczyk
Mateusz Dymczyk

Reputation: 15141

You're trying to return the array ba which is the array holding your input data instead of the count.

You need to leave the computation of the average in your current for loop and then create a second for loop and an int count variable which you will increment each time you find a number in the ba array that is smaller than the average. Then outside of that loop you return count.

Also this line:

average = sum / ba.length;

Has to be outside of the first loop.

@Edit: others provided some code but it had either logical or compile time errors (not all of them I guess, the ones I checked) so here's a working version:

public static int belowaverage(double[] ba) {
    double sum = 0;
    double average = 0;
    int count = 0;

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

    for(int i = 0; i < ba.length; i++){
        if (ba[i] < average) {
            count++;
        }
    }
    return count;
}

You don't need to cast length to double as sum is of type double so the result will be promoted to the bigger type.

Upvotes: 2

Related Questions