      1  import java.util.Scanner;

      2

      3  /**

      4     This program reads inputs that contain four grades per line and displays the

      5     average grade for each input line.

      6  */

      7  public class Grades

      8  {

      9     public static void main(String[] args)

     10     {

     11        while (processLine())

     12        {

     13        }

     14     }

     15

     16     /**

     17        Processes one line of input.

     18        @return true if the sentinel was not encountered

     19     */

     20     public static boolean processLine()

     21     {

     22        System.out.print("Enter four grades or Q to quit: ");

     23        Scanner in = new Scanner(System.in);

     24

     25        // Read four grades

     26

     27        String g1 = in.next();

     28        if (g1.equals("Q")) { return false; }

     29        String g2 = in.next();

     30        String g3 = in.next();

     31        String g4 = in.next();

     32

     33        // Compute and print their average

     34

     35        double x1 = gradeToNumber(g1);

     36        double x2 = gradeToNumber(g2);

     37        double x3 = gradeToNumber(g3);

     38        double x4 = gradeToNumber(g4);

     39        double xlow = min(x1, x2, x3, x4);

     40        double avg = (x1 + x2 + x3 + x4 - xlow) / 3;

     41        System.out.println(numberToGrade(avg));

     42        return true;

     43     }

     44

     45     /**

     46        Converts a letter grade to a number.

     47        @param grade a letter grade (A+, A, A-, ..., D-, F)

     48        @return the equivalent number grade

     49     */

     50     public static double gradeToNumber(String grade)

     51     {

     52        double result = 0;

     53        String first = grade.substring(0, 1);

     54        if (first.equals("A")) { result = 4; }

     55        else if (first.equals("B")) { result = 3; }

     56        else if (first.equals("C")) { result = 2; }

     57        else if (first.equals("D")) { result = 1; }

     58        if (grade.length() > 1)

     59        {

     60           String second = grade.substring(1, 2);

     61           if (second.equals("+"))

     62           {

     63              result = result + 0.3;

     64           }

     65           else if (second.equals("-"))

     66           {

     67              result = result - 0.3;

     68           }

     69        }

     70        return result;

     71     }

     72

     73     /**

     74        Converts a number to the nearest letter grade.

     75        @param x a number between 0 and 4.3

     76        @return the nearest letter grade

     77     */

     78     public static String numberToGrade(double x)

     79     {

     80        if (x >= 4.15) { return "A+"; }

     81        if (x >= 3.85) { return "A"; }

     82        if (x >= 3.5) { return "A-"; }

     83        if (x >= 3.15) { return "B+"; }

     84        if (x >= 2.85) { return "B"; }

     85        if (x >= 2.5) { return "B-"; }

     86        if (x >= 2.15) { return "C+"; }

     87        if (x >= 1.85) { return "C"; }

     88        if (x >= 1.5) { return "C-"; }

     89        if (x >= 1.15) { return "D+"; }

     90        if (x >= 0.85) { return "D"; }

     91        if (x >= 0.5) { return "D-"; }

     92        return "F";

     93     }

     94

     95     /**

     96        Returns the smallest of four numbers.

     97        @param a a number

     98        @param b a number

     99        @param c a number

    100        @param d a number

    101        @return the smallest of a, b, c, and d

    102     */

    103     public static double min(double a, double b, double c, double d)

    104     {

    105        return Math.min(Math.min(a, b), Math.min(c, d));

    106     }

    107  }