2D Array Average of each row and ignoring single values

#1

Hey,
I’ve got an assignment about 2D Arrays in which the array is supposed to be an ozon meter and the values are hourly measurements per day, with the value = 0 meaning the meter was defect.
We need to get the average, minimum and maximum of each day and ignore the defect values.

So far my code looks like this:

int[][] measurements = {
  {7, 40, 42, 45, 51, 59, 67, 110, 0, 150, 190, 209, 232, 245, 250, 249, 240, 230, 208, 180, 160, 110, 89, 70 }, 
  {0, 0, 0, 0, 0, 0, 0, 0}, 
  {0, 1}
};
float sum = 0;
float defect = 0;
for (int day= 0; day < measurements.length; day++)
{
  println("Measurements on day: " + (day+1)+ ": ");

  for (int hour= 0; hour < measurements[day].length; hour++)
  {
    sum= (float) sum+measurements [day][hour];
    print (measurements[day][hour] + " ");
  }
  float average = (float) sum/measurements[day].length; 
  float min = min (measurements[day]);
  float max = max (measurements[day]);
  println();
  println ("Daily Average: " +average);
  if (max > defect) {
    println ("Max: " +max);
  } else {
    println ("Defect Meter");
  }
  if (min > defect) { 
    println ("Min: " +min);
  }
}


With the print being this:

Measurements on day: 1: 
7 40 42 45 51 59 67 110 0 150 190 209 232 245 250 249 240 230 208 180 160 110 89 70 
Daily Average: 134.70833
Max: 250.0
Measurements on day: 2: 
0 0 0 0 0 0 0 0 
Daily Average: 404.125
Defect Meter
Measurements on day: 3: 
0 1 
Daily Average: 1617.0
Max: 1.0

1.) Obviously the daily average is completly wrong.On the first day there’s one 0 that messes it up aswell as the other two days being completly false. I figure I have to somehow set the value of “average” to 0 after each day, but don’t know how.

2.) On the first day the Min should be 7, but due the aforementioned 0 it doesn’t show a minimum for that day (if there are any lines of code that are unnecessarily complicated, I’m just a beginner and have basically no idea what I’m doing, so please tell me).

3.)There’s another part to the assignment in which we have to draw a bar chart out of this with defect values being shown differently and values over 180 in red. But that we got another week and never actually talked about this so I guess we will do this (in part) in class.

Thanks for your help!

1 Like
#2

1. point

Imho:

This

 sum= (float) sum+measurements [day][hour];

won’t work.
You need to check if the value is != 0 before adding (and we need this if-clause later).

Similarly

 float average = (float) sum/measurements[day].length; 

won’t work since

measurements[day].length; 

is too high. It includes the zero measurements.

Instead after this line (but inside the if-clause!)

sum= (float) sum+measurements [day][hour];

count the valid measurements: validMeasurements++;

And use validMeasurements in the average formula.

Point 2

 float min = min (measurements[day]);

is of course wrong and will return zero.

Instead
after sum= (float) sum+measurements [day][hour];
check if the value measurements [day][hour]; is smaller than your own minValue and if so

minValue = measurements [day][hour];

Chrisir

1 Like
#3

Thanks for the reply.
I do understand the theory behind what I have (using if to check if any value is 0), but whenever I try something like

if (measurements [day] !=0) {
 sum= (float) sum+measurements [day][hour];

    print (measurements[day][hour] + " ");
  }

I get

“Incompatible operand types int[] and int”

and have no idea what to do about that.

#4
measurements [day][hour] != 0