StudentGrades.java
//********************************************************************
//
// StudentGrades.java
// Program Title: Student Grade File Processing
//
//********************************************************************
//
// Program Description:
// -------------------
//
//	This is a program that updates a student's cumulative grade data after new grades 
//	for the most recent quarter have been recorded and prints out the new updated results and
//	the results for the information on the most recently completed quarter
//      
//
// Input Requirements:
// ------------------
//
//	A text file contains grade data for many students. Data for each student is stored on 
//	three lines of the file. This is called a record. There may be any number of records in 
//	a file, including zero. Data values on each line are separated from each other by white 
//	space. However, the Student Name field may contain embedded blanks. The description of 
//	the data fields in a record for one student is: 
//
//	First Line: Student identification data 
//		1. Student ID#: student's ID #: 9 decimal digits (with no dashes between the digits) 
//		2. Student name: student's last name, first name, and initial(s): 
//		There will be blank spaces within the name separating each part of the name. The 
//		number of parts of a name can be different for each student (some names may be 1 or 2 
//		words and others as many as 4 or 5 words).
//
//	Second Line: Cumulative grade data 
//		1. Cumulative number of quarters completed: the number of quarters the student has 
//		completed to date (not including the current quarter): an integer in the range 0-40 
//		2. Cumulative credits: the number of credits the student has completed to date (not 
//		including the current quarter): an integer in the range 0-300 
//		3. Overall GPA: the student's grade point average to date (not including the current 
//		quarter): a floating point number in the range 0.00-4.00 with two decimal places 
//
//	Third Line: Current quarter grade data 
//		1. Count of courses taken in the current quarter: 
//		an integer between 2 and 6 (each student may have a different count) 
//		2. Credit and grade data for each course (same number of credits and grades as the 
//		count value): 
//		This data appears in the order: # credits 1st course, grade for 1st course, # credits 
//		2nd course, grade for 2nd course, ... 
//		Each credit value is an integer in the range 2-5 and each grade value is a floating 
//		point number in the range 0.0 to 4.0.
//	
//	Last Line: 
//		1. The end of the input data is signaled by a sentinel value of zero as a student ID#. 
//		There is no other data after the zero.
//      
//
// Output Requirements:
// -------------------      
// 
//	The output includes three lines of text for each student. The output for each student is: 
//
//	First Line: Student identification data -- same as the input 
//		1. Student ID# 
//		2. Student name 
//		
//	Second Line: Cumulative grade data -- same as the input except quarters completed, credit 
//	units, and GPA are the new updated values. 
//		1. Cumulative number of quarters completed 
//		2. Cumulative credits 
//		3. Overall GPA 
//
//	Third Line: Current quarter grade data 
//		1. Count of courses current quarter (same as input file) 
//		2. Total credits current quarter: an integer 
//		3. Quality points current quarter: a floating point number with one decimal place 
//		4. GPA current quarter: a floating point number with two decimal places 
//		5. Letter grade current quarter: a single character, A, B, C, D, or F 
//		(no + and - grades are computed in this program)
//
//	Last Line: 
//		The end of the output is signaled by a sentinel value of zero as a student ID#. There 
//		is no other output after the zero     
//
// Problem Solution Discussion:
// ---------------------------
//	
//		This Program first reads the value of the ID number. if it is not equal to zero, it
//	enters the loop. Then, it inputs the name of sudent, cumulative number of quarters,
//	cumulative number of credits, overall GPA prior to this quarter, and number of courses in 
//	this quarter. It then runs another loop for the amount of times as the number of courses
//	the student is taking. In the loop, it inputs the amount of credits and grade for each
//	course taken in the quarter and takes the sum of each. To get the quality points for the
//	current quarter, the product of the grade and number of credits of each course are all
//  summed up. the total credits taken that quarter is also the sum of the credits of each 
//	course. exit loop. To get the quality points for the prior quarters, we multiply the 
//	cumulative number of credits prior to this quarter with the GPA prior to this quarter.
//	Then to get the average GPA for this quarter, the quality points of the quarter is divided
//	by the total credits taken this quarter. The cumulative number of quarters is incremented 
//	by one. The new cumulative credits is the cumulative credits before this quarter plus the
//	total credits taken this quarter. the new overall GPA is the sum of the quality points 
//	prior to this quarter and the quality points of this quarter all divided by the cumulative
//	amount of credits. The letter grade for the quarter is derived by the following:
//		if GPA current quarter >= 3.67, then A 
//		if current quarter GPA < 3.67 and >= 3.0, then B 
//		if current quarter GPA < 3.0 and >= 2.0, then C 
//		if current quarter GPA < 2.0 and >= 1.0, then D 
//		if current quarter GPA < 1.0, then F 
//	exit loop.
//
// Data Structures:
// ---------------
//
//		Name          Data Type      Description
//		---------     ---------      -----------------------------
//		IDNum,	 	   integer		student ID number
//		cumQuarters    integer		cumulative number of quarters completed
//		cumCredits     integer		cumulative number of credits completed
//		curNumCourses  integer		number of courses in current quarter
//		curCredits     integer		number of credits in course in current quarter
//		curTotCredits  integer		total number of credits in current quarter
//		count     	   integer		used to define amount of times to run loop		
//	    oldGPA		   float		overall GPA prior to current quarter
//    	curGrade	   float		grade in specific course taken this quarter
//     	curGPA		   float		GPA of current quarter
//     	curQualPts	   float		quality points in current quarter
//     	oldQualPts	   float		quality points prior to current quarter
//     	newGPA		   float		overall GPA after current quarter
//      name		   String		student name
//    	letterGrade	   String		average letter grade for current quarter
//
//
// Problem Solution Design Steps:
// -----------------------------
//
//input IDnum (priming read)
//run loop while IDnum not equal to zero (sentinel)
//	enter loop
//	
//		input name
//		input cumQuarters
//		input cumCredits
//		input oldGPA
//		input curNumCourses
//		set count equal to curNumCourses
//		run loop while count > 0
//		
//		enter loop
//			input curCredits
//			input curGrade
//			set curQualPts equal to curQualPts + {curCredits * curGrade)
//			set curTotCredits equal to curTotCredits + curCredits
//			reduce count by increment of 1
//      exit loop
//
//      set oldQualPts equal to (cumCredits * oldGPA)
//      set curGPA equal to (curQualPts / curTotCredits)
//      cumQuarters up by 1
//      set cumCredits equal to (cumCredits + curTotCredits)
//      set newGPA equal to ((oldQualPts + curQualPts) / cumCredits)
//
//    	if curGPA >= 3.67, then letterGrade = A 
//		if curGPA < 3.67 and >= 3.0, then letterGrade = B 
//		if curGPA < 3.0 and >= 2.0, then letterGrade = C 
//		if curGPA < 2.0 and >= 1.0, then letterGrade = D 
//		if curGPA < 1.0, then letterGrade = F 
//
//      print IDNum and name on same line
//      print cumQuarters, cumCredits, and newGPA (extended to 2 decimal places) on same line   
//      print curNumCourses, curCredits, curQualPts (extended to one decimal place), 
//      curGPA(extended to 2 decimal places), and letterGrade  on same line
//      input IDNum
//      	
//	exit loop
//    
//print 0     
//
//end
//********************************************************************

import cs1.Keyboard;			//textbook's Keyboard input class
import java.text.DecimalFormat;	//class to extend number out to # decimal places

public class StudentGrades
{
   
   //-----------------------------------------------------------------
   //  The class main method
   //-----------------------------------------------------------------
   public static void main (String[] args)
   {
   	
	int IDNum,	 		//student ID number
		cumQuarters,	//cumulative number of quarters completed
		cumCredits, 	//cumulative number of credits completed
		curNumCourses,	//number of courses in current quarter
		curCredits=0,	//number of credits in course in current quarter
		curTotCredits,	//total number of credits in current quarter
		count;			//used to define amount of times to run loop
		
	float oldGPA,		//overall GPA prior to current quarter
      	  curGrade,		//grade in specific course taken this quarter
      	  curGPA,		//GPA of current quarter
      	  curQualPts,	//quality points in current quarter
      	  oldQualPts,	//quality points prior to current quarter
      	  newGPA;		//overall GPA after current quarter
      	  
    String name,				//student name
    	   letterGrade = "";	//average letter grade for current quarter
    	   
    	   
    DecimalFormat fmtGPA = new DecimalFormat ("0.00");
    DecimalFormat fmtPts = new DecimalFormat ("#.0");
      	  
	//input IDnum (priming read)
	IDNum = Keyboard.readInt();
	
	//run loop while IDnum not equal to zero (sentinel)
	while (IDNum != 0)
	{	
		//initialize all necessary values to zero so program doesnt include prior student's stats as well
		cumQuarters = 0;
		cumCredits = 0;
		curNumCourses = 0;
		curTotCredits = 0;
		oldGPA = 0;
		curGrade = 0;
		curQualPts = 0;
		oldQualPts = 0;
		newGPA = 0;
		letterGrade = "";
		
		//input name
		name = Keyboard.readString();
		
		//input cumQuarters
		cumQuarters = Keyboard.readInt();
		
		//input cumCredits
		cumCredits = Keyboard.readInt();
		
		//input oldGPA
		oldGPA = Keyboard.readFloat();
		
		//input curNumCourses
		curNumCourses = Keyboard.readInt();
		
		//set count equal to curNumCourses
		//run loop while count > 0
		//reduce count by increment of 1
		for (count=curNumCourses; count > 0; count--)		
		{	
			//input curCredits
			curCredits = Keyboard.readInt();
			
			//input curGrade
			curGrade = Keyboard.readFloat();
			
			//set curQualPts equal to curQualPts + (curCredits * curGrade)
			curQualPts += (curCredits * curGrade);
			
			//set curTotCredits equal to curTotCredits + curCredits
			curTotCredits += curCredits;
      	}
      	
      	//set oldQualPts equal to (cumCredits * oldGPA)
      	oldQualPts = (cumCredits * oldGPA);
      	
      	//set curGPA equal to (curQualPts / curTotCredits)
      	curGPA = (curQualPts / curTotCredits);
      	
      	//cumQuarters up by 1
      	cumQuarters ++;
      	
      	//set cumCredits equal to (cumCredits + curTotCredits)
      	cumCredits += curTotCredits;
      	
      	//set newGPA equal to ((oldQualPts + curQualPts) / cumCredits)
      	newGPA = ((oldQualPts + curQualPts) / cumCredits);
      	//if curGPA >= 3.67, then letterGrade = A 
      	if (curGPA >= 3.67)
      		letterGrade = "A" ;
      		
		//if curGPA < 3.67 and >= 3.0, then letterGrade = B 
		else if (curGPA < 3.67 && curGPA >= 3.0)
			letterGrade = "B" ;
			
		//if curGPA < 3.0 and >= 2.0, then letterGrade = C 
		else if (curGPA < 3.0 && curGPA >= 2.0)
			letterGrade = "C"; 
			
		//if curGPA < 2.0 and >= 1.0, then letterGrade = D 
		else if (curGPA < 2.0 && curGPA >= 1.0)
			letterGrade = "D" ;
			
		//if curGPA < 1.0, then letterGrade = F 
  		else if (curGPA < 1.0)
  			letterGrade = "F"; 
      	
      	
      	//print IDNum and name on same line
      	System.out.println (IDNum + " " + name);
      	
      	//print cumQuarters, cumCredits, and newGPA (extended to 2 decimal places) on same line   
      	System.out.println (cumQuarters + " " + cumCredits + " " + fmtGPA.format(newGPA));
      	
      	//print curNumCourses, curTotCredits, curQualPts (extended to one decimal place), curGPA(extended to 2 decimal places), and letterGrade  on same line
      	System.out.println (curNumCourses + " " + curTotCredits + " " + fmtPts.format(curQualPts) + " " + fmtGPA.format(curGPA) + " " + letterGrade);
      	
      	//input IDNum
      	IDNum = Keyboard.readInt();
    }
    
    //print 0
    System.out.println (0);
    	
   } //end main

} // end class StudentGrades