The Nth Dimension

It's not uncommon for our data to be more than a simple list. Instead, we often find our data is most naturally expressed as a table. For example, the table of numbers below might represent the grades of the students in a class, where the rows are students and the columns are assignments:
100  95  90  95  80  95
 90  85  95 100  88  95
 85  70  75  80  85  90
Here we have three students and six grades for each student.

C provides us with the ability to define such two-dimensional arrays. For example, the declaration:

int grades[30][10] ;
would create an array with 30 rows of 10 integers each for a total of 300 integers. (This form of declaration generalizes to more than two dimensions. In fact, C puts no limit on the number of dimensions that we have in an array. Here, we'll only look at one and two-dimensional arrays.) Given this declaration of an array and assuming that we have a variable called num_stud that tells us how many students we have and another called num_grades that tells us how many grades each student has, we can do something like this:

for( i = 0; i < num_stud; ++i ) {
   sum = 0 ;
   for( j = 0; j < num_grades; ++j )
      sum += grades[i][j] ;
   printf( "%d\n", sum / num_grades ) ;
}

This code fragment will compute each student's average and print it out. Notice that we have one loop inside of another. The way to think about this is as in the following algorithm:

For each student, i,
   Set the sum to 0
   For each grade, j, of student i,
      add student i's grade j to the sum
   Print out the value of the sum divided by the number of grades

This algorithm illustrates one particularly important way of thinking about loops. Namely, a loop is executed once for each something. Determining what that something is will will often help in designing the loop. Here we have two loops. The first is done once for each student and for each student we will have another loop that is done once for each grade. Also notice that we need to reset the sum to zero for each student so that the previous student's sum is not added to the current one.

If the code fragment above is executed on the array of grades given at the top, what will be the set of numbers printed?

91 83 86 91 84 93
92 83 87 92 84 93
555 553 485
93 92 81
92 92 80