header
//*********************************************************
// GrossPay5.cpp
//
// Calculate and display the gross pay given the hourly
// wage and the number of hours worked.
//
// D. Searls
// Asbury College
// Aug 2003
//*********************************************************
#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>
using namespace std;

const double MAXHOURS = 40.0;
const double OT_MULTIPLIER = 1.5;
const int MAXROWS = 100;
const int MAXCOLS = 3;
const int WAGE = 0;   // Indicates wage column
const int HOURS = 1;  // Indicates hours column
const int PAY = 2;    // Indicates pay column

//*********************************************************
// getEmployeeData
//
// Out Parameters: id, data, n
//
// Returns: void
//*********************************************************
void getEmployeeData(string id[],
                     double data[][MAXCOLS], int& n)
{
    ifstream infile;
    string identity;
    double wageRate;
    double hoursWorked;
    
    infile.open("EmployeeData.txt");
    n = 0;
    infile >> identity >> wageRate >> hoursWorked;
    while (!infile.fail() && n < MAXROWS)
    {
        id[n] = identity;
        data[n][WAGE] = wageRate;
        data[n][HOURS] = hoursWorked;
        n = n+1;
        
        infile >> identity >> wageRate >> hoursWorked;
    }
    infile.close();
}

//*********************************************************
// calculateGrossPay
//
// In Parameter: n
//
// In/Out Parameter: data
//
// Returns: void
//*********************************************************
void calculateGrossPay(double data[][MAXCOLS], int n)
{
    for(int i = 0; i < n; i++)
    {
        if (data[i][HOURS] <= MAXHOURS)
        {
            data[i][PAY] = data[i][HOURS] * data[i][WAGE];
        }
        else
        {
            data[i][PAY] = MAXHOURS * data[i][WAGE]
                        + (data[i][HOURS] - MAXHOURS)
                            * OT_MULTIPLIER * data[i][WAGE];
        }
    }
}

//*********************************************************
// displayGrossPay
//
// In Parameters: id, data, n
//
// Returns: void
//*********************************************************
void displayGrossPay(const string id[],
                     const double data[][MAXCOLS], int n)
{
    ofstream outfile;
    
    outfile.open("PayrollReport5.txt");
    
    outfile << fixed << setprecision(2);
    outfile << "Employee  Gross Pay" << endl;
    outfile << "--------  ---------" << endl;
    for (int i = 0; i < n; i++)
    {
        outfile << setw(8) << id[i]
                << setw(11) << data[i][PAY] << endl;
    }
    outfile.close();
}

//**********************************************************
//              M A I N   D R I V E R
//**********************************************************
int main()
{
    int n;                          // Number of employees
    string identity[MAXROWS];       // Employee identifiers
    double data[MAXROWS][MAXCOLS];  // Employee data

    getEmployeeData(identity, data, n);
    calculateGrossPay(data, n);
    displayGrossPay(identity, data, n);
    
    cout << "Output sent to 'PayrollReport5.txt'" << endl;
    
    return 0;
}