#include <stdio.h>

// constants
#define SIZE 5
#define STD_HOURS 40.0
#define OT_RATE 1.5

// employee structure type
struct employee
{
    long int clockNumber;
    float wageRate;
    float hours;
    float overtimeHrs;
    float grossPay;
};

// functions
float getHours(long int clockNumber);
float calcOT(float hours);
float calcGross(float wageRate, float hours, float overtimeHrs);
void printHeader(void);
void printEmp(long int clockNumber, float wageRate, float hours, float overtimeHrs, float grossPay);

int main(void)
{
    // employee information
    struct employee employeeData[SIZE] = {
        { 98401, 10.60, 0.0, 0.0, 0.0 },
        { 526488, 9.75,  0.0, 0.0, 0.0 },
        { 765349, 10.50, 0.0, 0.0, 0.0 },
        { 34645,  12.25, 0.0, 0.0, 0.0 },
        { 127615, 8.35,  0.0, 0.0, 0.0 }
    };

    int i; 

    // hours worked, calculate overtime, and calculate gross pay for each employee
    for (i = 0; i < SIZE; ++i)
    {
        employeeData[i].hours = getHours(employeeData[i].clockNumber);
        employeeData[i].overtimeHrs = calcOT(employeeData[i].hours);
        employeeData[i].grossPay = calcGross(employeeData[i].wageRate, employeeData[i].hours, employeeData[i].overtimeHrs);
    }

    // header
    printHeader();

    // each employee's data formated
    for (i = 0; i < SIZE; ++i)
    {
        printEmp(employeeData[i].clockNumber,
                 employeeData[i].wageRate,
                 employeeData[i].hours,
                 employeeData[i].overtimeHrs,
                 employeeData[i].grossPay);
    }

    return 0; 
}

// function: getHours
float getHours(long int clockNumber)
{
    float hoursWorked; 

    printf("Enter number of hours worked for employee %06li: ", clockNumber);
    scanf("%f", &hoursWorked);

    return hoursWorked;
} 

// function: calcOT
float calcOT(float hours)
{
    float overtime; 

    if (hours > STD_HOURS)
    {
        overtime = hours - STD_HOURS;
    }
    else
    {
        overtime = 0.0;
    }

    return overtime;
} 

// function: calcGross
float calcGross(float wageRate, float hours, float overtimeHrs)
{
    float normalPay;   
    float overtimePay; 
    float totalGross;  

    if (hours > STD_HOURS)
    {
        normalPay = STD_HOURS * wageRate;
        overtimePay = overtimeHrs * wageRate * OT_RATE;
    }
    else
    {
        normalPay = hours * wageRate;
        overtimePay = 0.0;
    }

    totalGross = normalPay + overtimePay;

    return totalGross;
} 

// function: printHeader
void printHeader(void)
{
    printf("\n");
    printf("Clock#   Wage   Hours    OT    Gross\n");
    printf("------------------------------------\n");
} 

// function: printEmp data
void printEmp(long int clockNumber, float wageRate, float hours, float overtimeHrs, float grossPay)
{
    printf("%06ld %6.2f %5.1f %5.1f %8.2f\n",
           clockNumber, wageRate, hours, overtimeHrs, grossPay);
} 
   