//gpafunc.cpp

#include <iostream>
#include <iomanip>
#include <cctype>

using namespace std;

bool get_class_info (char &, int &);
int credit_pts (char, int);


int main() {

  int gpa_credits, gpa_points, class_credits, class_points;
  char grade, another_student;
  float gpa;

  do {                      // loop per student
    gpa_credits = 0;
    gpa_points = 0;

    cout << endl << "Enter class information for this student." << endl;

    while (get_class_info(grade,class_credits)) {        // loop per class

      if (grade!='S' && grade!='N') {

	gpa_credits += class_credits;

	gpa_points += credit_pts(grade,class_credits);
      }
    }

    gpa = float(gpa_points) / gpa_credits;
    cout << setprecision(2) << setiosflags(ios::fixed|ios::showpoint);
    cout << endl << "GPA: " << gpa << endl << endl;

    cout << "Another student?: (y or n) ";
    cin >> another_student;

  } while (toupper(another_student) == 'Y');
}



//***********************************************************
// Input valid grade (A, B, C, D, F, S, N) and credits (1-5)
// Return 1 if course info, 0 if end of course info

bool get_class_info (char &grade, int &credits) {

  cout << "Enter credits (1-5, or -1 to quit): ";
  cin >> credits;
  if (credits == -1)
    return false;
  else {
    while (credits < 1 || credits > 5) {
      cout << "Invalid credits value.  Must be between 1 and 5."
	     " Re-enter please.  ";
      cin >> credits;
    }
    cout << "Enter grade (A,B,C,D,F,S,N):        ";
    cin >> grade;
    grade = toupper(grade);
    while (grade!='A' && grade!='B' && grade!='C' && grade!='D' &&
	   grade!='F' && grade!='S' && grade!='N') {
      cout << "Invalid grade.  Must be A, B, C, D, F, S, or N."
	     " Please re-enter.  ";
      cin >> grade;
      grade = toupper(grade);
    }
    return true;
  }
}




//*********************************************************
// Return number of points for grade and credits

int credit_pts (char grade, int credits) {

  int points;

  switch (grade) {
  case 'A': points = credits * 4;
	    break;
  case 'B': points = credits * 3;
	    break;
  case 'C': points = credits * 2;
	    break;
  case 'D': points = credits;
	    break;
  case 'F': points = 0;
	    break;
  default:  cout << "ERROR in credits_pts.  Invalid grade: " << grade << endl;
  }

  return points;
}


