//Mark Brightenfield
//Intro to Java Period 5
//Objective: Input student names and tests, grade them, output grade,
//			 letter grade, class average, and students who failed.

import java.io.*;
import java.util.*;

class TrueFalseTest
{
	static         Scanner   console  = new Scanner(System.in);
	public static  Student[] students = new Student[50];

	static String keyStr      = "";
	static int    numStudents = 0;
	static double classAvg;

	public static void main(String[] args)throws IOException,
											FileNotFoundException
	{
		Scanner infile = new Scanner (new FileReader("quizzes.txt"));
		char[]  key    = new char[20];

		setObject();

		getInfo(infile);

		for(int x = 0; x<20; x++)
			key[x] = keyStr.charAt(x);

		gradeTests(key);

		calcLetterGrade();

		classAvg = classAverage();

		alphaSort();

		output();

		gradeSort();

		output();
	}
	//#######################################################
	//Methods
	public static void setObject()
	{
		for(int x = 0; x<students.length; x++)
			students[x] = new Student();
	}
	//-------------------------------------------------------
	public static void getInfo(Scanner infile)throws IOException,
												FileNotFoundException
	{
		String studentTst = "";
		char[] studentTest = new char[20];

		keyStr = infile.nextLine();
		while(infile.hasNext())
		{
			students[numStudents].setName(infile.useDelimiter(" ").next());
			studentTst = infile.useDelimiter("\n").nextLine();

			if(studentTst.length() < 20)
			{
				int difference = 20 - studentTst.length();
				for(int x = 0; x<=difference; x++)
					studentTst += " ";
			}

			for(int x = 0; x<20; x++)
				studentTest[x] = studentTst.charAt(x+1);

			students[numStudents].setTest(studentTest);
			numStudents++;
		}

		infile.close();
	}
	//-------------------------------------------------------
	public static void gradeTests(char[] key)
	{
		for(int x = 0; x<numStudents; x++)
		{
			int grade = 0;

			for(int y = 0; y<20; y++)
				if(students[x].getTest(y) == key[y])
					grade++;
			students[x].setGrade(grade*5);
		}
	}
	//-------------------------------------------------------
	public static void calcLetterGrade()
	{
		for(int x = 0; x<numStudents; x++)
		{
			int grade = students[x].getGrade();

			if(grade >= 90)
				students[x].setLetterGrade("A");
			else if(grade >= 80 && grade < 90)
				students[x].setLetterGrade("B");
			else if(grade >= 70 && grade < 80)
				students[x].setLetterGrade("C");
			else if(grade >= 65 && grade < 70)
				students[x].setLetterGrade("D");
			else
				students[x].setLetterGrade("F");
		}
	}
	//-------------------------------------------------------
	public static void output()
	{
		boolean failed = false;
		System.out.printf("%-20s", "Name");
		System.out.printf("%-10s", "Grade");
		System.out.printf("%-5s", "Letter Grade\n");

		for(int x = 0; x<=41; x++)
			System.out.print("-");
		System.out.println("");

		for(int x = 0; x<numStudents; x++)
		{
			System.out.printf("%-20s", students[x].getName());
			System.out.printf("%-10s",students[x].getGrade());
			System.out.printf("%-5s %n",students[x].getLetterGrade());
		}
		System.out.println();

		System.out.println("Students who failed:");

		for(int x = 0; x<numStudents; x++)
		{
			if(students[x].getGrade() < 65)
			{
				failed = true;
				System.out.printf("%-20s", students[x].getName());
				System.out.printf("%-10s",students[x].getGrade());
				System.out.printf("%-5s %n",students[x].getLetterGrade());
			}
		}
		if(!failed)
			System.out.println("None");

		System.out.printf("\nClass Average: %.1f %n", classAvg);
		for(int x = 0; x<=41; x++)
			System.out.print("-");
		System.out.println("\n");
	}
	//-------------------------------------------------------
	public static double classAverage()
	{
		int    sum = 0;
		double avg = 0.0;

		for(int x = 0; x<numStudents; x++)
			sum += students[x].getGrade();

		avg = (double)sum / numStudents;

		return avg;
	}
	//-------------------------------------------------------
	public static void alphaSort()
	{
		Student replace = new Student();

		for(int x = 0; x<numStudents; x++)
		{
			for(int y = 0; y<numStudents-x-1; y++)
			{
				if(students[y].getName().compareTo(students[y+1].getName()) > 0)
				{
					replace = students[y];
					students[y] = students[y+1];
					students[y+1] = replace;
				}
			}
		}
	}
	//-------------------------------------------------------
	public static void gradeSort()
	{
		Student replace = new Student();

		for(int x = 0; x<numStudents; x++)
		{
			for(int y = 0; y<numStudents-x-1; y++)
			{
				if(students[y].getGrade() < students[y+1].getGrade())
				{
					replace = students[y];
					students[y] = students[y+1];
					students[y+1] = replace;
				}
			}
		}
	}
	//-------------------------------------------------------
}