import java.util.Scanner;

public class Gradebook
{
  public static void main(String args[])
  {
    final int MAXSIZE = 100;
    String name[] = new String[MAXSIZE];
    String tuid[] = new String[MAXSIZE];
    double mt[] = new double[MAXSIZE];
    double finalExam[] = new double[MAXSIZE];
    double averages[] = new double[MAXSIZE];
    int numStudents = 0;
    double classAverage;

    numStudents = getData(name, tuid, mt, finalExam, MAXSIZE);
    getAverages(mt, finalExam, averages, numStudents);
    classAverage = getClassAverage(averages, numStudents); 
    sortByScore(name, tuid, mt, finalExam, averages, numStudents);
    printSummary(name, tuid, mt, finalExam, averages, classAverage, numStudents); 
  }

  public static void sortByScore(String name[], String tuid[], double mt[], double finalExam[], double averages[], int numStudents)
  {
    String stemp;
    double dtemp; 
    for(int pass = 0; pass < numStudents-1; pass++)
    {
      for(int i = 0; i < numStudents-1; i++)
      {
        if(averages[i] > averages[i+1])
        {
          stemp = name[i];
          name[i] = name[i+1];
          name[i+1] = stemp;
          stemp = tuid[i];
          tuid[i] = tuid[i+1];
          tuid[i+1] = stemp;
          dtemp = mt[i];
          mt[i] = mt[i+1];
          mt[i+1] = dtemp;
          dtemp = finalExam[i];
          finalExam[i] = finalExam[i+1];
          finalExam[i+1] = dtemp;
          dtemp = averages[i];
          averages[i] = averages[i+1];
          averages[i+1] = dtemp;
       }
     }
   } 
 }
          

  public static int getData(String names[], String tuids[], double mts[], double finals[], int max)
  {
    Scanner kb = new Scanner(System.in);
    String sentinel = "!";    
    int count = 0;
    String name;

    System.out.println("Enter a name (or ! to quit:");
    name = kb.nextLine();
    while (!name.equals(sentinel) && count < max)
    {
      names[count] = name;
      System.out.println("Enter TUID for " + names[count] + ":");
      tuids[count] = kb.nextLine();
      System.out.println("Enter mid-term score for " + names[count] + ":");
      mts[count] = kb.nextDouble();
      System.out.println("Enter final exam score for " + names[count] + ":");
      finals[count] = kb.nextDouble();
      count++;
      kb.nextLine();
      System.out.println("Enter a name (or ! to quit:");
      name = kb.nextLine();
    }
    return count;
  }

  public static void getAverages(double mts[], double finals[], double averages[], int num)
  {
    for(int i = 0; i < num; i++)
    {
      averages[i] = (mts[i] + finals[i]) / 2.0;
    }
  }

  public static double getClassAverage(double averages[], int num)
  {
    double retval = 0.0;
    for(int i = 0; i < num; i++)
    {
      retval = retval + averages[i];
    }
    retval = retval / (double)num;
    return retval;
  }

  public static void printSummary(String names[], String tuids[], double mts[], double finals[], double averages[], double classAverage, int num)
  {
    for(int i = 0; i < num; i++)
    {
      System.out.println(names[i] + " " + tuids[i] + " " + mts[i] + " " + finals[i] + " " + averages[i]); 
    }
    System.out.println();
    System.out.println("The grand average was "  + classAverage);
  }
}
