demo.cpp
#include <iostream>
#include <iomanip>
#include <vector>
using std::cout;
using std::endl;
using std::left;
using std::setw;
using std::vector;
#include "employee.h"
#include "employee.cpp"
#include "date.cpp"
int main()
{
try
{
Date wkHd1(2011, 9, 2);
Worker wk1("w0001", wkHd1, 2000);
wk1.setWage(30);
wk1.setWkHour(8);
Date wkHd2(2014, 4, 20);
Worker wk2("w0002", wkHd2, 3000);
wk2.setWage(35);
wk2.setWkHour(8);
Date salHd1(2003, 7, 2);
Salesman sal1("s0001", salHd1, 2000);
sal1.setWage(50);
sal1.setWkHour(8);
sal1.setSales(5000);
Date salHd2(2004, 3, 21);
Salesman sal2("s0002", salHd2, 2500);
sal2.setWage(50);
sal2.setWkHour(8);
sal2.setSales(8000);
Date mgHd1(2001, 5, 10);
Manager mg1("m0001", mgHd1, 5000);
Date salMgHd(2001, 5, 15);
SalesManager salMg("s0002", salMgHd, 5000);
salMg.setWage(50);
salMg.setWkHour(8);
salMg.setSales(8000);
vector<Employee> emps = {wk1, wk2, sal1, sal2, mg1, salMg};
SalSystem sm(emps);
sm.print();
}
catch (const char *exp)
{
cout << exp << endl;
}
system("Pause");
return 0;
}
date.h
#pragma once
#include <string>
using std::string;
class Date
{
public:
Date(int, int, int);
Date();
void addDay(int);
string toString(char);
bool setYear(int year_);
int getYear() const;
bool setMon(int month_);
int getMon() const;
bool setDay(int day_);
int getDay() const;
private:
int year;
int month;
int day;
static const int maxDay[2][13];
};
date.cpp
#include <iostream>
#include <ctime>
#include <cassert>
#include "date.h"
using std::cout;
using std::endl;
const int Date::maxDay[2][13] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
Date::Date(int year_, int month_ = 1, int day_ = 1)
{
if (year_ >= 1900 && year_ <= 9999)
if (month_ >= 1 && month_ <= 12)
if (day_ >= 1 && day_ <= maxDay[(year_ % 4 == 0 && year_ % 100 != 0) || year_ % 400 == 0][month_])
{
year = year_;
month = month_;
day = day_;
}
else
throw "day is invalid";
else
throw "month is invalid!";
else
throw "year is invalid!";
}
Date::Date()
{
time_t now;
time(&now);
struct tm *t_now;
t_now = localtime(&now);
year = t_now->tm_year + 1900;
month = t_now->tm_mon + 1;
day = t_now->tm_mday;
}
void Date::addDay(int n)
{
day += n;
if (day > maxDay[(year % 4 == 0 && year % 100 != 0) || year % 400 == 0][month])
{
day %= maxDay[(year % 4 == 0 && year % 100 != 0) || year % 400 == 0][month];
month++;
if (month > 12)
{
year++;
month %= 12;
}
}
}
string Date::toString(char spor)
{
return std::to_string(year) + spor + std::to_string(month) + spor + std::to_string(day);
}
bool Date::setYear(int year_)
{
if (year_ >= 1900 && year_ <= 2120)
{
year = year_;
return true;
}
else
return false;
}
int Date::getYear() const
{
return year;
}
bool Date::setMon(int month_)
{
if (month_ >= 1 && month_ <= 12)
{
month = month_;
return true;
}
else
return false;
}
int Date::getMon() const
{
return month;
}
bool Date::setDay(int day_)
{
if (day_ >= 1 && day_ <= maxDay[(year % 4 == 0 && year % 100 != 0) || year % 400 == 0][month])
{
day = day_;
return true;
}
else
return false;
}
int Date::getDay() const
{
return day;
}
employee.h
#pragma once
#include "date.h"
#include <vector>
using std::vector;
class Employee
{
public:
Employee(string, Date, int);
string getEno() const;
virtual int getSalary() const;
protected:
int getWkYear() const;
string eno;
Date hiredate;
int bsSalary;
};
class Worker : virtual public Employee
{
public:
using Employee::Employee;
void setWage(int);
void setWkHour(int);
int getSalary() const;
protected:
float wkHour = 0;
int wage = 0;
};
class Salesman : virtual public Employee
{
public:
using Employee::Employee;
void setWage(int);
void setWkHour(int);
void setSales(int);
int getSalary() const;
protected:
float wkHour = 0;
int wage = 0;
int sales = 0;
};
class Manager : virtual public Employee
{
public:
using Employee::Employee;
int getSalary() const;
protected:
static int bsWage;
};
class SalesManager : public Salesman, public Manager
{
public:
SalesManager(string _eno, Date hdate, int bsSal);
int getSalary() const;
};
class SalSystem
{
private:
vector<Employee> emp;
public:
SalSystem(vector<Employee>);
void print();
};
employee.cpp
#include "employee.h"
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
using std::left;
using std::setw;
Employee::Employee(string eno_, Date hdate, int bsSal) : hiredate(hdate)
{
eno = eno_;
bsSalary = bsSal;
}
int Employee::getWkYear() const
{
Date today;
return today.getYear() - hiredate.getYear();
}
int Employee::getSalary() const
{
return 0;
}
string Employee::getEno() const
{
return eno;
}
void Worker::setWage(int _wage)
{
wage = _wage;
}
void Worker::setWkHour(int _hour)
{
wkHour = _hour;
}
int Worker::getSalary() const
{
int wkYear = getWkYear();
return (bsSalary + wkYear * 200) + wkHour * wage;
}
void Salesman::setWage(int _wage)
{
wage = _wage;
}
void Salesman::setWkHour(int _hour)
{
wkHour = _hour;
}
void Salesman::setSales(int _sales)
{
sales = _sales;
}
int Salesman::getSalary() const
{
int wkYear = getWkYear();
return (bsSalary + wkYear * 200) + wkHour * wage + sales;
}
int Manager::bsWage = 5000;
int Manager::getSalary() const
{
int wkYear = getWkYear();
return bsWage + (bsSalary + wkYear * 200);
}
SalesManager::SalesManager(string _eno, Date hdate, int bsSal)
: Employee(_eno, hdate, bsSal), Salesman(_eno, hdate, bsSal), Manager(_eno, hdate, bsSal)
{
}
int SalesManager::getSalary() const
{
int wkYear = Manager::getWkYear();
return bsWage + (bsSalary + wkYear * 200) + wkHour * wage + sales;
}
SalSystem::SalSystem(vector<Employee> emp_) : emp(emp_)
{
}
void SalSystem::print()
{
cout << left << setw(15) << "ENO" << setw(15) << "SALARY" << endl;
cout << "----------------------" << endl;
for (auto e : emp)
cout << left << setw(15) << e.getEno() << setw(15) << e.getSalary() << endl;
}