/*------------------------------------------------------------------------------
Description:  CourseClass for Assignment 1
Author: Chris Huyler
Language: C++
Name: Course.h
Date: February 2, 2000
------------------------------------------------------------------------------*/
#include <cstring.h>
#include <conio.h>

class Course {
	public:
	 Course();                                   // NULL constructor
    void PrintCourseGradeReport();					//Prints out grade report line
    void PrintCourseTranscript();					//Prints out transcript line

    void Calcquality_pts();                     //Calculates quality pts

	 void SetInitCourse();								//Sets all atributes of course
    void Setdept(); 										//Sets the dept number
    void Setcourse_id(); 								//Sets the course id
    void Setcourse_name(); 							//Sets the course name
    void Setcredits(); 									//Sets the credits
    void Setgrade();										//Sets the grade
    void SetPF();											//Sets the pass/fail bool
    void SetLA();											//Sets the LA/NLA bool
    void SetWD();		   								//Sets drop class bool
    void Setdistribution();							//Sets the distibution
    void Setinstructor();								//Sets the instructor

    int& Getdept();										//Returns dept
    int& Getcourse_id();								//Returns course_id
    string& Getcourse_name();							//Returns course_name
    float& Getcredits();								//Returns credits
    void Printgrade();                          //Since Grade is an enum it prints instead of returning it
    float& Getquality_pts();							//Returns quality_pts
    bool& GetPF();										//Returns PF bool
    bool& GetLA();										//Returns LA/NLA bool
    bool& GetWD();                              //Returns drop class bool
    string& Getdistribution();						//Returns distribution
    string& Getinstructor();							//Returns instructor

	private:
 	 int dept;
 	 int course_id;
 	 string course_name;
 	 float credits;
    enum gradeDef{A1,A2,A3,B1,B2,B3,C1,C2,C3,D1,D2,D3,F,P,W}; //definition of grade
    gradeDef grade;
    float quality_pts;
    bool PF;
    bool LA;
    bool WD;
    string distribution;
    string instructor;
};

Course::Course() {
	 dept = 0;
    course_id = 0;
    course_name = "noname";
    credits = 0;
    grade = P;
    PF = false;
    LA = false;
    WD = false;
    distribution = "N/A";
    instructor = "staff";
}

void Course::PrintCourseGradeReport() {
	cout << "\n\n\t" << dept << " ";
   cout << course_id << "\t";
   cout << course_name << "\t";
   for(int i=course_name.length();i<25;i++) cout << " ";
   cout << credits << "\t";
   Printgrade();
}

void Course::PrintCourseTranscript() {
	cout << "\n\n" << course_name;
   for(int i=course_name.length();i<30;i++) cout << " ";
   cout << distribution;
   for(int i=distribution.length();i<9;i++) cout << " ";
   if(LA)
   	cout << "L  ";
   else
   	cout << "   ";
   cout << dept << " ";
   cout << course_id << "  ";
   cout << credits << "  ";
   Printgrade();
}
void Course::Printgrade(){
	switch(grade){
   	case A1: cout << "A+"; break;
      case A2: cout << "A "; break;
      case A3: cout << "A-"; break;
      case B1: cout << "B+"; break;
      case B2: cout << "B "; break;
      case B3: cout << "B-"; break;
      case C1: cout << "C+"; break;
      case C2: cout << "C "; break;
      case C3: cout << "C-"; break;
      case D1: cout << "D+"; break;
      case D2: cout << "D "; break;
      case D3: cout << "D-"; break;
      case F: cout << "F "; break;
      case P: cout << "P "; break;
      case W: cout << "W "; break;
	}
}
void Course::SetInitCourse(){
   clrscr();
   cout << "Enter the data for new course...\n";
   Setdept();
   Setcourse_id();
   Setcourse_name();
   Setcredits();
   Setgrade();
   SetPF();
   SetLA();
   Setdistribution();
   Setinstructor();
}
void Course::Setdept(){
   cout << "\nEnter the department number: ";
	cin >> dept;
}
void Course::Setcourse_id(){
	cout << "\nEnter the course ID number: ";
   cin >> course_id;
}
void Course::Setcourse_name(){
	cout << "\nEnter the course name: ";
   cin >> course_name;
}
void Course::Setcredits(){
	cout << "\nEnter the number of credits: ";
   cin >> credits;
}
void Course::Setgrade(){
   int number;
	cout  << "\nEnter the grade - "
         << "\n  1)A+      4)B+      7)C+      10)D+       13)F"
   		<< "\n  2)A       5)B       8)C       11)D        14)P"
         << "\n  3)A-      6)B-      9)C-      12)D-"
         << "\nEnter choice:";
   cin >> number;
   switch(number){
   	case 1: grade = A1; break;
      case 2: grade = A2; break;
      case 3: grade = A3; break;
      case 4: grade = B1; break;
      case 5: grade = B2; break;
      case 6: grade = B3; break;
      case 7: grade = C1; break;
      case 8: grade = C2; break;
      case 9: grade = C3; break;
      case 10: grade = D1; break;
      case 11: grade = D2; break;
      case 12: grade = D3; break;
      case 13: grade = F; break;
      case 14: grade = P; break;
	}
}
void Course::SetPF(){
	char ans;
   cout << "\nIs this course Pass/Fail (y/n)?: ";
   cin >> ans;
   if(ans == 'y')
   	PF = true;
   else
   	PF = false;
}
void Course::SetLA(){
   char ans;
	cout << "\nLiberal Arts(y/n)?: ";
   cin >> ans;
   if(ans == 'y')
   	LA = true;
   else
   	LA = false;
}
void Course::SetWD(){
	char ans;
   cout << "\nAre you sure you want to withdraw from the class(y/n)";
   cin >> ans;
   if(ans == 'y'){
   	WD = true;
      grade = W;
   }
}
void Course::Setdistribution(){
	cout << "\nEnter the course distribution: ";
   cin >> distribution;
}
void Course::Setinstructor(){
	cout << "\nEnter the course instructor: ";
   cin >> instructor;
}

int& Course::Getdept() {
	return(dept);
}
int& Course::Getcourse_id() {
	return(course_id);
}
string& Course::Getcourse_name() {
	return(course_name);
}
float& Course::Getcredits() {
	return(credits);
}
float& Course::Getquality_pts(){
	Calcquality_pts();
   return(quality_pts);
}
bool& Course::GetPF(){
	return(PF);
}
bool& Course::GetLA() {
	return(LA);
}
bool& Course::GetWD() {
	return(WD);
}
string& Course::Getdistribution() {
	return(distribution);
}
string& Course::Getinstructor() {
	return(instructor);
}
void Course::Calcquality_pts(){
   quality_pts = 0;
   if(!PF && !WD){
		switch(grade){
     		case A1 : quality_pts = 4.3; break;
         case A2 : quality_pts = 4.0; break;
         case A3 : quality_pts = 3.7; break;
         case B1 : quality_pts = 3.3; break;
         case B2 : quality_pts = 3.0; break;
         case B3 : quality_pts = 2.7; break;
         case C1 : quality_pts = 2.3; break;
         case C2 : quality_pts = 2.0; break;
         case C3 : quality_pts = 1.7; break;
         case D1 : quality_pts = 1.3; break;
         case D2 : quality_pts = 1.0; break;
         case D3 : quality_pts = 0.7; break;
     }
     quality_pts *= credits;
   }
}



