/*************************************************/
// R. A. Hillyard
// stuRecord03.cpp
// November 2001
//
// class with constructors
// private member function and friend function
/*************************************************/

#include<iostream>
#include<string>
#include<cctype>

using namespace std;

class StuRecord
  {
  public:
    //notice that the "equal" member function is overloaded and
    //both functions accomplish the same thing. The friend function
    //is not a member function but has access to private data members
    //best to use a friend function when more than one object is involved
    friend bool equal(StuRecord n1, StuRecord n2);
    bool equal(StuRecord n1);

    StuRecord();                                    //default constructor
    StuRecord(int id, string fname, string lname);  //3 arg constructor

    void input();
    void output();
    int    getidNum();
    string getFirst();
    string getLast();
  private:
    int idNum;
    string first;
    string last;
    //private member function to Normalize a string
    string normal(string s1);
  };
/*************************************************/
//friend function equal - compares two StuRecord to see if
//the first and last name are the same. Note the direct access
//to the member data using the dot notation
/*************************************************/
bool equal (StuRecord n1, StuRecord n2)
  {  return (n1.first == n2.first && n1.last == n2.last);  }
/*************************************************/
bool StuRecord::equal (StuRecord n1)
  {  return (first == n1.getFirst() && last == n1.getLast());  }
/*************************************************/
StuRecord::StuRecord()
  {
  cout << "In default Constructor\n";
  idNum = -6666;
  first = "";
  last = "";
  }
/*************************************************/
StuRecord::StuRecord(int id, string fname, string lname)
  {
  cout << "In 3 arg Constructor\n";
  idNum = id;
  first = normal(fname);
  last = normal(lname);
  }
/*************************************************/
void StuRecord::input()
  {
  cout << "enter id number, first name and last name: ";
  cin >> idNum >> first >> last;
  first = normal(first);
  last = normal(last);
  }
/*************************************************/
void StuRecord::output()
  {  cout << idNum << " " + first + " " + last << endl;  }
/*************************************************/
int StuRecord::getidNum()
  {  return idNum;  }
/*************************************************/
string StuRecord::getFirst()
  {  return first;  }
/*************************************************/
string StuRecord::getLast()
  {  return last;  }
/*************************************************/
string StuRecord::normal(string s1)
  {
  string temp = s1;
  temp[0] = toupper(temp[0]);
  for(int i = 1; i < temp.length(); i++)
    temp[i] = tolower(temp[i]);
  return temp;
  }
/*************************************************/

/*************************************************/
int main()
  {
  StuRecord name1;
  StuRecord name2(1234, "Roger", "craft");
  StuRecord name3(3456, "merry", "Christmas");
  StuRecord name4;

  name1.input();
  name4 = StuRecord(9345, "Happy", "Birthday");

  //calling equal as a member function
  if(name1.equal(name4))
    cout << "you guessed the secret word\n";
  else
    cout << "you did not guess the secret word\n";

  //calling equal as a friend function
  if(equal(name1,name4))
    cout << "Repeat you guessed the secret word\n";
  else
    cout << "Repeat you did not guess the secret word\n";

  name1.output();
  name2.output();
  name3.output();
  name4.output();
  return 0;
  }//end main
/***************Program Output*******************
//first run
In default Constructor
In 3 arg Constructor
In 3 arg Constructor
In default Constructor
enter id number, first name and last name: 1234 haPPY birthDAy
In 3 arg Constructor
you guessed the secret word
Repeat you guessed the secret word
1234 Happy Birthday
1234 Roger Craft
3456 Merry Christmas
9345 Happy Birthday

//second run
In default Constructor
In 3 arg Constructor
In 3 arg Constructor
In default Constructor
enter id number, first name and last name: 5555 happy trails
In 3 arg Constructor
you did not guess the secret word
Repeat you did not guess the secret word
5555 Happy Trails
1234 Roger Craft
3456 Merry Christmas
9345 Happy Birthday
*/