//employee.h
#ifndef EMPLOYEE_H
#define EMPLOYEE_H
#include<string>
#include<iosfwd>
namespace Records{
int const kDefaultStartingSalary=30000;
class Employee
{
public:
Employee();
void promote(int inRaiseAmount=1000);
void demote(int inDemeritAmount=1000);
void hire();//Hires or rehires the employee
void fire();//Dismiss the employee
void display();//Outputs employee info
//Accessors and setters
void setFirstName(std::string inFirstName);
std::string getFirstName();
void setLastName(std::string inLastName);
std::string getLastName();
void setEmployeeNumber(int inEmployeeNumber);
int getEmployeeNumber();
void setSalary(int inNewSalary);
int getSalary();
bool getIsHired();
private:
std::string mFirstName;
std::string mLastName;
int mEmployeeNumber;
int mSalary;
bool fHired;
};
}
#endif
//employee.cpp
#include<iostream>
#include"employee.h"
#include<string>
using namespace std;
namespace Records{
Employee::Employee():mFirstName(""),
mLastName(""),
mEmployeeNumber(-1),
mSalary(kDefaultStartingSalary),
fHired(false){}
void Employee::promote(int inRaiseAmount)
{
setSalary(getSalary()+inRaiseAmount);
}
void Employee::demote(int inDemeritAmount)
{
setSalary(getSalary()-inDemeritAmount);
}
void Employee::hire()
{
fHired=true;
}
void Employee::fire()
{
fHired=false;
}
void Employee::display()
{
cout<<"Employee: "<<getLastName()<<","<<getFirstName()<<endl;
cout<<"--------------------------------"<<endl;
cout<<(fHired?"Current Employee":"Former Employee")<<endl;
cout<<"Employee Number: "<<getEmployeeNumber()<<endl;
cout<<"Salary: $"<<getSalary()<<endl;
cout<<endl;
}
//Accessors and setters
void Employee::setFirstName(string inFirstName)
{
mFirstName=inFirstName;
}
string Employee::getFirstName()
{
return mFirstName;
}
void Employee::setLastName(string inLastName)
{
mLastName=inLastName;
}
string Employee::getLastName()
{
return mLastName;
}
void Employee::setEmployeeNumber(int inEmployeeNumber)
{
mEmployeeNumber=inEmployeeNumber;
}
int Employee::getEmployeeNumber()
{
return mEmployeeNumber;
}
void Employee::setSalary(int inSalary)
{
mSalary=inSalary;
}
int Employee::getSalary()
{
return mSalary;
}
bool Employee::getIsHired()
{
return fHired;
}
}
//database.h
#ifndef DATABASE
#define DATABASE
#include<iostream>
#include"employee.h"
#include<string>
namespace Records{
int const kMaxEmployee=100;
const int kFirstEmployeeNumber=1000;
class Database
{
public:
Database();
~Database();
Employee &addEmployee(std::string inFirstName,std::string inLastName);
Employee &getEmployee(int inEmployeeNumber);
Employee &getEmployee(std::string inFirstName,std::string inLastName);
void displayAll();
void displayCurrent();
void displayFormer();
protected:
Employee mEmployees[kMaxEmployee];
int mNextSlot;
int mNextEmployeeNumber;
};
}
#endif
//database.cpp
#include<iostream>
#include<stdexcept>
#include"database.h"
using namespace std;
namespace Records
{
Database::Database()
{
mNextSlot=0;
mNextEmployeeNumber=kFirstEmployeeNumber;
}
Database::~Database(){}
Employee& Database::addEmployee(string inFirstName,string inLastName)
{
if(mNextSlot >= kMaxEmployee)
{
cerr<<"There is no more room to add the new employee";
throw exception();
}
Employee &theEmployee=mEmployees[mNextSlot++];
theEmployee.setFirstName(inFirstName);
theEmployee.setLastName(inLastName);
theEmployee.setEmployeeNumber(mNextEmployeeNumber++);
theEmployee.hire();
return theEmployee;
}
Employee &Database::getEmployee(int inEmployeeNumber)
{
for(int i=0;i<mNextSlot;++i)
{
if(mEmployees[i].getEmployeeNumber()==inEmployeeNumber)
return mEmployees[i];
}
cerr<<"No employee with employee number"<<inEmployeeNumber<<endl;
throw exception();
}
Employee &Database::getEmployee(string inFirstName,string inLastName)
{
for(int i=0;i<mNextSlot;++i)
{
if(mEmployees[i].getFirstName()==inFirstName &&
mEmployees[i].getLastName()==inLastName)
{
return mEmployees[i];
}
}
cerr<<"No match with name "<<inFirstName<<" "<<inLastName<<endl;
throw exception();
}
void Database::displayAll()
{
for(int i=0;i<mNextSlot;++i)
{
mEmployees[i].display();
}
}
void Database::displayCurrent()
{
for(int i=0;i<mNextSlot;++i)
{
if(mEmployees[i].getIsHired())
{
mEmployees[i].display();
}
}
}
void Database::displayFormer()
{
for(int i=0;i<mNextSlot;++i)
{
if(!mEmployees[i].getIsHired())
{
mEmployees[i].display();
}
}
}
}
//userInterface.cpp
#include<iostream>
#include<stdexcept>
#include"database.h"
using namespace std;
using namespace Records;
int displayMenu();
void doHire(Database &inDB);
void doFire(Database &inDB);
void doPromote(Database &inDB);
int main(int argc,char **argv)
{
Database employeeDB;
bool done=false;
while(!done)
{
int selection=displayMenu();
switch(selection)
{
case 1:
doHire(employeeDB);
break;
case 2:
doFire(employeeDB);
break;
case 3:
doPromote(employeeDB);
break;
case 4:
employeeDB.displayAll();
break;
case 5:
employeeDB.displayCurrent();
break;
case 6:
employeeDB.displayFormer();
break;
case 0:
done =true;
break;
default:
cerr<<"Unknow command."<<endl;
}
}
return 0;
}
int displayMenu()
{
int selection;
cout<<endl;
cout<<"Employee Database"<<endl;
cout<<"-----------------"<<endl;
cout<<"1) Hire a new employee"<<endl;
cout<<"2) Fire an employee"<<endl;
cout<<"3) Promote an employee"<<endl;
cout<<"4) List all employees"<<endl;
cout<<"5) List all current employees"<<endl;
cout<<"6) List all previous employees"<<endl;
cout<<"0) Quit"<<endl;
cout<<"---> "<<endl;
cin>>selection;
return selection;
}
void doHire(Database &inDB)
{
string firstName;
string lastName;
cout<<"First name?";
cin>>firstName;
cout<<"Last name?";
cin>>lastName;
try
{
inDB.addEmployee(firstName,lastName);
}
catch(std::exception ex)
{
cerr<<"unable to add new employee!"<<endl;
}
}
void doFire(Database &inDB)
{
int employeeNumber;
cout<<"Employee number? ";
cin>>employeeNumber;
try
{
Employee &emp=inDB.getEmployee(employeeNumber);
emp.fire();
cout<<"Employee "<<employeeNumber<<" has been teminated."<<endl;
}
catch(std::exception ex)
{
cerr<<"Unable to teminate employee!"<<endl;
}
}
void doPromote(Database &inDB)
{
int employeeNumber;
int raiseAmount;
cout<<"Employee number? ";
cin>>employeeNumber;
cout<<"How much of a raise? ";
cin>>raiseAmount;
try
{
Employee &emp=inDB.getEmployee(employeeNumber);
emp.promote(raiseAmount);
}
catch(std::exception)
{
cerr<<"unable to promote employee!"<<endl;
}
}