import java.io.*; import java.util.StringTokenizer; /*--------------------------------------------------------------------------------------------- CS100 P3: Q3 Asks user for the number of students in a classroom. Then queries for each student the name, whether the student is taking it for letter, and the 6 grades for the 6 assignments of each student. Calculates a final grade for each student based on a weighting scheme. Offers a menu of options to the user (described below). After each choice except quit, the menu is shown again. There are two classes in this file: Modified Classroom and ClassroomTools. Not shown, but implied, are the Student class and PassFail and Letter subclasses of Student. Author : Alan Renaud (ajr5@cornell.edu) Date : 23 July 1999 ------------------------------------------------------------------------------------------------*/ class ModifiedClassroom { final static int NUMASSIGNS = 6; final static double[] WEIGHTS = {0.1, 0.1, 0.25, 0.2, 0.05, 0.3}; final static TokenReader IN = new TokenReader(System.in); static ClassroomTools forMyClass = new ClassroomTools(); public static void main(String[] args) { Student[] roster = forMyClass.takeRollCall(NUMASSIGNS, WEIGHTS); int val = makeChoice(); while (val !=5) { doChoice(val, roster); val = makeChoice(); } bye(); } /*--------------------------------------------------------------------------------------------- makeChoice input : none return : value input by user ------------------------------------------------------------------------------------------------*/ private static int makeChoice() { System.out.println("\n\n\n"); System.out.println("Which of the following tasks would you like to perform: \n"); System.out.println("1.\tSearch for a particular name and view that person's grades."); System.out.println("2.\tView the max, min and avg grades for the class."); System.out.println("3.\tView the names and grades of students taking it for letter."); System.out.println("4.\tView the entire list of students."); System.out.println("5.\tQuit\n"); System.out.print("Your selection is: "); System.out.flush(); int ans = IN.readInt(); return ans; } /*--------------------------------------------------------------------------------------------- doChoice input : value input by user return : none Executes appropriate method based on user output from makeChoice method. ------------------------------------------------------------------------------------------------*/ private static void doChoice(int num, Student[] r) { switch (num) { case 1: forMyClass.findStudent(r); break; case 2: forMyClass.showClassStats(r); break; case 3: forMyClass.showLetterStudents(r); break; case 4: forMyClass.printClassData(r); case 5: break; default: System.out.println("\nInvalid selection."); } IN.waitUntilEnter(); } /*--------------------------------------------------------------------------------------------- bye Prints goodbye message when user elects to quit. -----------------------------------------------------------------------------------------------*/ private static void bye() { System.out.println("\n\nThanks for playing. Have a nice day!" ); IN.waitUntilEnter(); } } // end ModifiedClassroom class ClassroomTools { static TokenReader in = new TokenReader(System.in); /*--------------------------------------------------------------------------------------------- takeRollCall input : none return : array of students Prompts user for number of students then proceeds to construct an array of Letter and PassFail Student objects, each prompted for and initialized by the user. -----------------------------------------------------------------------------------------------*/ public Student[] takeRollCall(int numAssigns, double[] weights) { int n = getInteger("Enter number of students: "); Student[] r = new Student[n]; for (int count=0; count < n; count++) { String name = getString("Student "+ (count+1)+ "'s name: "); boolean forLetter = isForLetter("Is the student taking it for grade? "); double[] scores = readScores(numAssigns); r[count] = (forLetter ? (Student) new LetterGrade(name, scores, weights) : (Student) new PassFail(name, scores, weights)); } return r; } /*--------------------------------------------------------------------------------------------- findStudent input : array of students return : none Prompts user for the name of a student, then searches the array to find him. Prints to screen the names and grades of the student if found; an error message otherwise. -----------------------------------------------------------------------------------------------*/ public void findStudent(Student[] r) { String n = getString("\nEnter the person's name: "); int index=0; prompt("Searching....."); while ((index < (r.length-1))&&(!r[index].name.equals(n))) { index++; } if (!r[index].name.equals(n)) System.out.println("\n\nWe're sorry but " + n + " is not in this class."); else { System.out.print("\n\nGrades for " + n + ": "); for (int count = 0; count < r[index].scores.length; count++) { System.out.print(r[index].scores[count] + " "); } System.out.println("\n"); } } /*--------------------------------------------------------------------------------------------- showClassStats input : array of students return : none Prints to screen the lowest and highest grades, and the "classroom" average. ------------------------------------------------------------------------------------------------*/ public void showClassStats(Student[] r) { double sum, avg, max, min; sum = 0; max = min = r[0].grade; for (int i=0; i<r.length; i++) { sum += r[i].grade; if (r[i].grade > max) max = r[i].grade; if (r[i].grade < min) min = r[i].grade; } avg = sum/r.length; System.out.println("\n\nThe highest grade in the class is " + max); System.out.println("The lowest grade in the class is " + min); System.out.println("The average for the class is " + Math.floor(avg)) ; } /*--------------------------------------------------------------------------------------------- showLetterStudents input : array of students return : none Prints to the screen the names and grades of each Letter student. ------------------------------------------------------------------------------------------------*/ public void showLetterStudents(Student[] r) { System.out.println("\n\n"); for(int index=0; index < r.length; index++) { if (r[index] instanceof LetterGrade) System.out.println(r[index].name + " " + r[index].finalGrade()); } } /*--------------------------------------------------------------------------------------------- printClassData input : array of students return : none Prints to screen the names and grades of each student. ------------------------------------------------------------------------------------------------*/ public void printClassData(Student[] r) { System.out.println("\n\n"); for (int counter=0; counter < r.length; counter++) r[counter].printData(); } /*--------------------------------------------------------------------------------------------- readScores input : number of assignments return : array representing the scores for each assignment ------------------------------------------------------------------------------------------------*/ private double[] readScores(int n) { prompt("Enter the student's scores: "); String grInput = in.readLine(); StringTokenizer gr = new StringTokenizer(grInput); double[] s = new double[n]; if (gr.countTokens() != n) System.out.println("\nToo few or too many scores. Surplus set to 0.\n"); String hold; for (int index=0; index < n; index ++) { hold = (gr.hasMoreTokens() ? gr.nextToken() : "0"); s[index] = Double.valueOf(hold).doubleValue(); } return s; } /*--------------------------------------------------------------------------------------------- isForLetter input : message string return : true IF student is taking class for letter ------------------------------------------------------------------------------------------------*/ private boolean isForLetter(String message) { String typ = getString(message); while ((!typ.toLowerCase().startsWith("y")) && (!typ.toLowerCase().startsWith("n"))) { typ = getString("yes or no? "); } return (typ.toLowerCase().startsWith("y")); } /*--------------------------------------------------------------------------------------------- getString input : message string return : string message input by user Returns string input by user. ------------------------------------------------------------------------------------------------*/ private String getString(String message) { prompt(message); return in.readString(); } /*--------------------------------------------------------------------------------------------- getInteger input : message string return : value input by user Returns value of user's input if it is positive. ------------------------------------------------------------------------------------------------*/ private int getInteger(String message) { prompt(message); int val = in.readInt(); while (val<0) { prompt("Enter a positive number: "); val = in.readInt(); } return val; } /*--------------------------------------------------------------------------------------------- prompt input : message string return : none Prints message prompt ------------------------------------------------------------------------------------------------*/ private void prompt(String message) { System.out.print(message); System.out.flush(); } } // end ClassroomTools