Notes From Special Session, 11/5/96
The code below for solving the payroll problem was developed on-the-fly
during the special session. This code should not be construed to be
the best OOP implementation although it is a reasonable one. Later,
I will put up a better solution.
#include < fstream.h >
#include < iostream.h >
#include < stdlib.h >
#include < stdio.h >
#include < string.h >
class Employee
{
public:
Employee(void *e, char *nm, Employee *n, float (* p)(int, void *), void (* d)(void *))
{
employee = e;
next = n;
getPay = p;
dispfn = d;
strncpy(name, nm, 28);
}
float pay (int m) { return (getPay)(m, employee); }
Employee *getNext() { return next; }
char *getName() { return name; }
void display()
{
cout << " Employee: " << name << " ";
(dispfn)(employee);
}
private:
char name[30];
void *employee;
Employee *next;
float (* getPay)(int, void *);
void (* dispfn)(void *);
};
class Manager
{
public:
Manager (float s) { monthly_salary = s; }
float getPay (int m) { return monthly_salary; }
void display()
{
cout << "\tManager,\tMonthly Salary: " << monthly_salary << "\n";
}
private:
float monthly_salary;
};
class Programmer
{
public:
Programmer (float r)
{
rate = r;
for (int i=0 ; i < 12 ; i++) hours[i] = 0;
}
void setHours (int m, int h) { hours[m] = h; }
float getPay(int m) { return hours[m]*rate; }
void display()
{
cout << "\tProgrammer,\tRate: " << rate << "\n";
}
private:
int hours[12];
float rate;
};
class Agent
{
public:
Agent (float c, float b)
{
commission = c;
base_pay = b;
for (int i=0 ; i < 12 ; i++) sales[i] = 0;
}
void setSales (int m, float s) { sales[m] = s; }
float getPay(int m) { return commission*sales[m] + base_pay; }
void display()
{
cout << "\tIns. Agent,\tBase pay: " << base_pay
<< "\tCommission: " << commission << "\n";
}
private:
float commission;
float base_pay;
float sales[12];
};
float man(int m, void *o) { return ((Manager *)(o))->getPay(m); }
float prog(int m, void *o) { return ((Programmer *)(o))->getPay(m); }
float agent(int m, void *o) { return ((Agent *)(o))->getPay(m); }
void manDisplay(void *o) { ((Manager *)(o))->display(); }
void progDisplay(void *o) { ((Programmer *)(o))->display(); }
void agentDisplay(void *o) { ((Agent *)(o))->display(); }
void setHours(Employee *e, char *name, int mn, int hrs)
{
for (Employee *f = e ; f != NULL ; f = f->getNext())
{
if (!strcmp(f->getName(), name))
{
((Programmer *)(f))->setHours(mn, hrs);
break;
}
}
}
void setSales(Employee *e, char *name, int mn, float sales)
{
for (Employee *f = e ; f != NULL ; f = f->getNext())
{
if (!strcmp(f->getName(), name))
{
((Agent *)(f))->setSales(mn, sales);
break;
}
}
}
float payroll(Employee *e, int mn)
{
float total=0;
for (Employee *f = e ; f != NULL ; f = f->getNext()) total += f->pay(mn);
return total;
}
void display(Employee *e)
{
for (Employee *f=e ; f != NULL ; f = f->getNext()) f->display();
}
void main()
{
char *month[] = { "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November",
"December" };
Employee *e;
e = new Employee(new Manager(10000), "John", NULL, man, manDisplay);
e = new Employee(new Manager(5000), "Jim", e, man, manDisplay);
e = new Employee(new Manager(4000), "Joan", e, man, manDisplay);
e = new Employee(new Programmer(7), "Jill", e, prog, progDisplay);
e = new Employee(new Programmer(5), "Jack", e, prog, progDisplay);
e = new Employee(new Programmer(4), "Judy", e, prog, progDisplay);
e = new Employee(new Agent(0.06, 500), "Jerry", e, agent, agentDisplay);
e = new Employee(new Agent(0.04, 600), "Jory", e, agent, agentDisplay);
e = new Employee(new Agent(0.03, 700), "Suzanne", e, agent, agentDisplay);
display(e);
setHours(e, "Jill", 0, 82);
setHours(e, "Jack", 0, 64);
setHours(e, "Judy", 0, 72);
setSales(e, "Jerry", 0, 3000);
setSales(e, "Jory", 0, 4000);
setSales(e, "Suzanne", 0, 4500);
cout << "\nPayroll for " << month[0] << " is " << payroll(e, 0) << "\n";
}