header
//*********************************************************
// GrossPay10.cpp
//
// Calculate and display the gross pay given the hourly
// wage and the number of hours worked.
//
// This version uses an array of pointers to employee 
// structures.
//
// D. Searls
// Asbury College
// Dec 2009
//*********************************************************
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;

const double MAXHOURS = 40.0;
const double OT_MULTIPLIER = 1.5;
const int MAXSIZE = 100;

struct employeeRecord
{
    string identity;
    double hours;
    double wageRate;
    double grossPay;
};

void getEmployeeData(employeeRecord*[], int&);
void calculateGrossPay(employeeRecord*[], int);
void displayGrossPay(employeeRecord*[], int);
void clearList(employeeRecord*[], int&);

//*********************************************************
//            M A I N   D R I V E R
//*********************************************************

int main()
{
    int n;              // Number of employees
    employeeRecord* empPtr[MAXSIZE];

    getEmployeeData(empPtr, n);
    calculateGrossPay(empPtr, n);
    displayGrossPay(empPtr, n);
    clearList(empPtr, n);
    
    return 0;
}

//*********************************************************
// getEmployeeData
//
// Out Parameters: dataPtr, n
//
// Returns: void
//*********************************************************
void getEmployeeData(employeeRecord* dataPtr[], int& n)
{
    ifstream infile;
    string identity;
    double wageRate;
    double hours;
    
    infile.open("EmployeeData.txt");
    n = 0;
    infile >> identity >> wageRate >> hours;
    while (!infile.fail() && n < MAXSIZE)
    {
        dataPtr[n] = new (nothrow) employeeRecord;
        dataPtr[n]->identity = identity;
        dataPtr[n]->hours = hours;
        dataPtr[n]->wageRate = wageRate;
        n = n+1;
        
        infile >> identity >> wageRate >> hours;
    }
    infile.close();
}

//*********************************************************
// calculateGrossPay
//
// In Parameter: n
//
// In/Out Parameter: dataPtr
//
// Returns: void
//*********************************************************
void calculateGrossPay(employeeRecord* dataPtr[], int n)
{
    for(int i = 0; i < n; i++)
    {
        if (dataPtr[i]->hours <= MAXHOURS)
        {
            dataPtr[i]->grossPay = dataPtr[i]->hours * dataPtr[i]->wageRate;
        }
        else
        {
            dataPtr[i]->grossPay = MAXHOURS * dataPtr[i]->wageRate
                               + (dataPtr[i]->hours - MAXHOURS)
                               * OT_MULTIPLIER * dataPtr[i]->wageRate;
        }
    }
}

//*********************************************************
// displayGrossPay
//
// In Parameters: dataPtr, n
//
// Returns: void
//*********************************************************
void displayGrossPay(employeeRecord* dataPtr[], int n)
{
    cout << fixed << setprecision(2);
    cout << "Employee  Gross Pay" << endl;
    cout << "--------  ---------" << endl;
    for (int i = 0; i < n; i++)
    {
        cout << setw(8) << dataPtr[i]->identity
             << setw(11) << dataPtr[i]->grossPay << endl;
    }
}

//*********************************************************
// clearList
//
// In/Out Parameters: dataPtr, n
//
// Return the memory allocated for the employee records
// back to the operating system and set n to 0.
//*********************************************************
void clearList(employeeRecord* dataPtr[], int& n)
{
    for (int i = 0; i < n; i++)
    {
        delete dataPtr[i];
    }
    n = 0;
}
//*********************************************************
// GrossPay11.cpp
//
// Calculate and display the gross pay given the hourly
// wage and the number of hours worked.
//
// This version uses an array of pointers to employee 
// objects.
//
// D. Searls
// Asbury College
// Dec 2009
//*********************************************************
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;

const int MAXSIZE = 100;

class employeeRecord
{
private:

// Data members

    string id;        // Employee identifier
    double hours;     // Hours worked
    double wage;      // Hourly wage
  
public:

// Class constructors

    //-----------------------------------------------------
    // Default Constructor
    //
    // Construct a new employee whose identifier is the
    // empty string and whose hours and hourly wage are
    // both zero.
    //-----------------------------------------------------
    employeeRecord()
    {
        id = "";
        hours = 0.0;
        wage = 0.0;
    }
    
    //-----------------------------------------------------
    // Initialization Constructor
    //
    // Preconditions: empHours >= 0
    //                empWage  >= 0
    //
    // Construct a new employee with the specified
    // identifier, hours, and hourly wage. If the specified
    // hours is negative, the employee's hours will be set
    // to zero. If the specified hourly wage is negative,
    // the employee's hourly wage will be set to zero.
    //
    // In Parameters: empId, empHours, empWage
    //-----------------------------------------------------
    employeeRecord(string empId, double empHours, double empWage)
    {
        id = empId;
        
        if (empHours >= 0.0)
        {
            hours = empHours;
        }
        else
        {
            hours = 0.0;
        }
        
        if (empWage >= 0.0)
        {
            wage = empWage;
        }
        else
        {
            wage = 0.0;
        }
    }
    
    //-----------------------------------------------------
    // Copy Constructor
    //
    // Construct a new employee having the same state as
    // the specified employee.
    //
    // In Parameter: emp
    //-----------------------------------------------------
    employeeRecord(const employeeRecord& emp)
    {
        id = emp.id;
        hours = emp.hours;
        wage = emp.wage;
    }

// Member functions

    //-----------------------------------------------------
    // setIdentifier
    //
    // Set the employee's identifier to the specifed value.
    //-----------------------------------------------------
    void setIdentifier(string newId)
    {
        id = newId;
    }
    
    //-----------------------------------------------------
    // setHours
    //
    // Precondition: newHours >= 0
    //
    // Set the employee's hours worked to the specifed
    // value. If the specified value is negative, the
    // employee's hours will not be changed.
    //-----------------------------------------------------
    void setHours(double newHours)
    {
        if (newHours >= 0.0)
        {
            hours = newHours;
        }
    }
    
    //-----------------------------------------------------
    // setWage
    //
    // Precondition: newWage >= 0
    //
    // Set the employee's hourly wage to the specifed value.
    // If the specified value is negative, the employee's
    // wage will not be changed.
    //-----------------------------------------------------
    void setWage(double newWage)
    {
        if (newWage >= 0)
        {
            wage = newWage;
        }
    }
    
    //-----------------------------------------------------
    // getIdentifier
    //
    // Get the employee's identifier.
    //-----------------------------------------------------
    string getIdentifier() const
    {
        return id;
    }

    //-----------------------------------------------------
    // getHours
    //
    // Get the employee's hours worked.
    //-----------------------------------------------------
    double getHours() const
    {
        return hours;
    }

    //-----------------------------------------------------
    // getWage
    //
    // Get the employee's hourly wage.
    //-----------------------------------------------------
    double getWage() const
    {
        return wage;
    }
    
    //-----------------------------------------------------
    // getGrossPay
    //
    // Get the employee's gross pay.
    //-----------------------------------------------------
    double getGrossPay() const
    {
       const double MAXHOURS = 40.0;
       const double OT_MULTIPLIER = 1.5; 
       double grossPay;
        
        if (hours <= MAXHOURS)
        {
            grossPay = hours * wage;
        }
        else
        {
            grossPay = MAXHOURS * wage
                       + (hours - MAXHOURS)
                         * OT_MULTIPLIER * wage;
        }
        return grossPay;
    }      
};

void getEmployeeData(employeeRecord*[], int&);
void calculateGrossPay(employeeRecord*[], int);
void displayGrossPay(employeeRecord*[], int);
void clearList(employeeRecord*[], int&);

//*********************************************************
//            M A I N   D R I V E R
//*********************************************************

int main()
{
    int n;              // Number of employees
    employeeRecord* empPtr[MAXSIZE];

    getEmployeeData(empPtr, n);
    displayGrossPay(empPtr, n);
    clearList(empPtr, n);
    
    return 0;
}

//*********************************************************
// getEmployeeData
//
// Out Parameters: dataPtr, n
//
// Returns: void
//*********************************************************
void getEmployeeData(employeeRecord* dataPtr[], int& n)
{
    ifstream infile;
    string identity;
    double wageRate;
    double hours;
    
    infile.open("EmployeeData.txt");
    n = 0;
    infile >> identity >> wageRate >> hours;
    while (!infile.fail() && n < MAXSIZE)
    {
        dataPtr[n] = new (nothrow) employeeRecord;
        dataPtr[n]->setIdentifier(identity);
        dataPtr[n]->setHours(hours);
        dataPtr[n]->setWage(wageRate);
        n = n+1;
        
        infile >> identity >> wageRate >> hours;
    }
    infile.close();
}

//*********************************************************
// displayGrossPay
//
// In Parameters: dataPtr, n
//
// Returns: void
//*********************************************************
void displayGrossPay(employeeRecord* dataPtr[], int n)
{
    cout << fixed << setprecision(2);
    cout << "Employee  Gross Pay" << endl;
    cout << "--------  ---------" << endl;
    for (int i = 0; i < n; i++)
    {
        cout << setw(8) << dataPtr[i]->getIdentifier()
             << setw(11) << dataPtr[i]->getGrossPay() << endl;
    }
}

//*********************************************************
// clearList
//
// In/Out Parameters: dataPtr, n
//
// Return the memory allocated for the employee records
// back to the operating system and set n to 0.
//*********************************************************
void clearList(employeeRecord* dataPtr[], int& n)
{
    for (int i = 0; i < n; i++)
    {
        delete dataPtr[i];
    }
    n = 0;
}