#include<iostream>

#include<string>

using namespace std;


class Course

{

       string code;

       string name;

public:

       Course()

       {

              code = "\0";

              name = "\0";

       }

       Course(string c, string n)

       {

              code = c;

              name = n;

       }

       string getCode()

       {

              return code;

       }

       string getName()

       {

              return name;

       }

};


class Name

{

       string firstName;

       string lastName;

public:

       Name()

       {

              firstName = '\0';

              lastName = '\0';

       }

       Name(string first, string last)

       {

              firstName = first;

              lastName = last;

       }

       friend ostream& operator<<(ostream& out,Name& name)

       {

              cout <<name.firstName << " " << name.lastName;

              return out;

       }

};



class Student:public Name

{

       Name name;

       Course course[5];

public:

       //Constructor to initialize the member variables

       Student(Name n, Course* co)

       {

              name=n;

             

              for (int i = 0;i < 5;i++)

              {

                    

                           course[i] = co[i];

                    

              }

       }



       
       bool addCourse(Course co)

       {

              int count=0;

              for (int i = 0;i < 5;i++)

              {

                     if (course[i].getCode() == "\0")

                           break;

                     else

                           count++;

              }            

              if (count == 3)

              {

                     return false;

              }

              for (int i = 0;i < 5;i++)

              {

                     if (course[i].getCode() == co.getCode())

                     {

                           return false;

                     }                   

              }

              if (count == 0)

              {

                     course[0] = co;

              }

              else

                     course[count] = co;

              return true;

       }

       string getRegisteredCourses()

       {

              string result="\0";

              if (course[0].getCode() == "\0")

                     result="None";

              else

                     for (int i = 0;i < 5;i++)

                     {

                           if (course[i].getCode() == "\0")

                                  break;

                           else

                           {

                                 

                                  result+= " "+ course[i].getName();

                            }

                     }

              return result;

       }

       friend ostream& operator<<(ostream& out,Student stud)

       {

              cout << stud.name;

              cout << " Registered Courses: " << stud.getRegisteredCourses();

              return out;

       }

      

};



int main()

{

       Course courses[5] = { Course("0101", "Cryptography"), Course("0234","Programming"),Course("1234","Calculus"),Course("2356","History"),Course("3658","Geography")};

       Course cours[5];

       Name studName("Arif", "Ariffin");

       Student stud(studName, cours);

       //cout << stud;

       cout << "\n\n" << stud;

       stud.addCourse(courses[0]);

       stud.addCourse(courses[1]);

       cout << "\n\n\n" << stud;

       if (stud.addCourse(courses[0]) == 0)

       {

              cout << "\n\n Registration failed";

       }

       else

       {

              cout << "\n\n Registration Successsful";

       }

      

       if (stud.addCourse(courses[4]) == 0)

       {

              cout << "\n\n Registration failed";

       }

       else

       {

              cout << "\n\n Registration Successsful";

       }

       cout << "\n\n" << stud<<endl;

       return 0;

}
