// Fig. 5.18: DoubleArray.java
// Double-subscripted array example
import java.awt.Graphics;
import java.applet.Applet;

public class DoubleArray extends Applet {
   int grades[][] = { { 77, 68, 86, 73 }, 
                      { 96, 87, 89, 81 },
                      { 70, 90, 86, 81 } };
   int students, exams;
   int xPosition, yPosition;  

   // initialize instance variables
   public void init()
   {
      students = grades.length;
      exams = grades[ 0 ].length;
   }

   // paint the applet
   public void paint( Graphics g )
   { 
      xPosition = 25;
      yPosition = 25;

      g.drawString( "The array is:", xPosition, yPosition );
      yPosition += 15;
      printArray( g );
      xPosition = 25;
      yPosition += 30;      
      g.drawString( "Lowest grade:", xPosition, yPosition );
      int min = minimum();
      g.drawString( String.valueOf( min ),
                    xPosition + 85, yPosition );
      yPosition += 15;
      g.drawString( "Highest grade:", xPosition, yPosition );
      int max = maximum();
      g.drawString( String.valueOf( max ),
                    xPosition + 85, yPosition );
      yPosition += 15;

      for ( int i = 0; i < students; i++ ) {
         g.drawString( "Average for student " + i + " is ",
                       25, yPosition );
         double ave = average( grades[ i ] );
         g.drawString( String.valueOf( ave ), 165, yPosition );
         yPosition += 15;
      }
   }

   // find the minimum grade
   public int minimum()
   { 
      int lowGrade = 100;

      for ( int i = 0; i < students; i++ ) 
         for ( int j = 0; j < exams; j++ ) 
            if ( grades[ i ][ j ] < lowGrade )
               lowGrade = grades[ i ][ j ];

      return lowGrade;
   }

   // find the maximum grade
   public int maximum()
   { 
      int highGrade = 0;

      for ( int i = 0; i < students; i++ ) 
         for ( int j = 0; j < exams; j++ ) 
            if ( grades[ i ][ j ] > highGrade )
               highGrade = grades[ i ][ j ];

      return highGrade;
   }

   // determine the average grade for a particular
   // student (or set of grades)
   public double average( int setOfGrades[] )
   {
      int total = 0;
 
      for ( int i = 0; i < setOfGrades.length; i++ )
         total += setOfGrades[ i ];

      return ( double ) total / setOfGrades.length;
   }

   // print the array
   public void printArray( Graphics g )
   {
      xPosition = 80;

      for ( int i = 0; i < exams; i++ ) {
         g.drawString( "[" + i + "]", xPosition, yPosition );
         xPosition += 30;
      }

      for ( int i = 0; i < students; i++ ) {
         xPosition = 25;
         yPosition += 15;
         g.drawString( "grades[" + i + "]",
                       xPosition, yPosition );
         xPosition = 80;

         for ( int j = 0; j < exams; j++ )  {
            g.drawString( String.valueOf( grades[ i ][ j ] ),
                          xPosition, yPosition );
            xPosition += 30;
         }
      }
   }
}
