//********************************************************
//
// Assignment 8 - Structures and Strings and Pointers
//
// Name: <replace with your name>
//
// Class: C Programming, <replace with Semester and Year>
//
// Date: <replace with the current date>
//
// Description: Program which determines overtime and
// gross pay for a set of employees with outputs sent
// to standard output (the screen).
//
// This assignment also adds the employee name, their tax state,
// and calculates the state tax, federal tax, and net pay. It
// also calculates totals, averages, minimum, and maximum values.
//
// Array and Structure references are to be replaced with
// pointer references to speed up the processing of this code.
//
// Call by Reference design (using pointers)
//
//********************************************************
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define NUM_EMPL 5
#define OVERTIME_HOURS 40
#define OVERTIME_RATE 1.5
// Structure for employee information
struct employee {
char name[20];
char state[3];
int clockNum;
float wage;
};
// Structure for totals
struct totals {
float hours;
float regular;
float overtime;
float grossPay;
float stateTax;
float fedTax;
float netPay;
};
// Structure for min and max values
struct min_max {
float minWage;
float maxWage;
float minHours;
float maxHours;
float minOT;
float maxOT;
float minGross;
float maxGross;
float minState;
float maxState;
float minFed;
float maxFed;
float minNet;
float maxNet;
};
// Function prototypes
void getHours(struct employee *emp_ptr, struct totals *emp_totals_ptr);
void calcPay(struct employee *emp_ptr, struct totals *emp_totals_ptr);
void printPay(struct employee *emp_ptr, struct totals *emp_totals_ptr, struct min_max *emp_minMax_ptr);
void calculateTotals(struct totals *emp_totals_ptr);
void calculateAverages(struct totals *emp_totals_ptr);
void findMinMax(struct totals *emp_totals_ptr, struct min_max *emp_minMax_ptr);
int main() {
// Set up an array of structures to store the employee information
// Initialize the name, tax state, clock number, and wage rate
struct employee employeeData[NUM_EMPL] = {
{ "Connie Cobol", "MA", 98401, 10.60},
{ "Mary Apl", "NH", 526488, 9.75 },
{ "Frank Fortran", "VT", 765349, 10.50 },
{ "Jeff Ada", "NY", 34645, 12.25 },
{ "Anton Pascal","CA",127615, 8.35 }
};
// Pointer to the array of employee structures
struct employee *emp_ptr = employeeData;
// Set up structure to store totals and initialize all to zero
struct totals employeeTotals = {0,0,0,0,0,0,0};
// Pointer to the employeeTotals structure
struct totals *emp_totals_ptr = &employeeTotals;
// Set up structure to store min and max values and initialize all to zero
struct min_max employeeMinMax = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// Pointer to the employeeMinMax structure
struct min_max *emp_minMax_ptr = &employeeMinMax;
// Function calls
getHours(emp_ptr, emp_totals_ptr);
calcPay(emp_ptr, emp_totals_ptr);
calculateTotals(emp_totals_ptr);
calculateAverages(emp_totals_ptr);
findMinMax(emp_totals_ptr, emp_minMax_ptr);
printPay(emp_ptr, emp_totals_ptr, emp_minMax_ptr);
return 0;
}
// Function to get hours worked
void getHours(struct employee *emp_ptr, struct totals *emp_totals_ptr) {
printf("Please enter the hours worked for each employee:\n"); for (int i = 0; i < NUM_EMPL; ++i) {
printf("%s %s: ", emp_ptr
[i
].
name, emp_ptr
[i
].
state); scanf("%f", &emp_totals_ptr
[i
].
hours); }
}
// Function to calculate pay
void calcPay(struct employee *emp_ptr, struct totals *emp_totals_ptr) {
for (int i = 0; i < NUM_EMPL; ++i) {
if (emp_totals_ptr[i].hours > OVERTIME_HOURS) {
emp_totals_ptr[i].regular = OVERTIME_HOURS * emp_ptr[i].wage;
emp_totals_ptr[i].overtime = (emp_totals_ptr[i].hours - OVERTIME_HOURS) * emp_ptr[i].wage * OVERTIME_RATE;
} else {
emp_totals_ptr[i].regular = emp_totals_ptr[i].hours * emp_ptr[i].wage;
emp_totals_ptr[i].overtime = 0;
}
emp_totals_ptr[i].grossPay = emp_totals_ptr[i].regular + emp_totals_ptr[i].overtime;
}
}
// Function to print pay
void printPay(struct employee *emp_ptr, struct totals *emp_totals_ptr, struct min_max *emp_minMax_ptr) {
printf("*** Pay Calculator ***\n\n"); printf("---------------------------------------------------------------------------------\n"); printf("Name Tax Clock# Wage Hours OT Gross State Fed Net\n"); printf(" State Pay Tax Tax Pay\n"); printf("---------------------------------------------------------------------------------\n");
for (int i = 0; i < NUM_EMPL; ++i) {
printf("%-20s %2s %06d %5.2f %5.1f %4.1f %6.2f %6.2f %6.2f %7.2f\n", emp_ptr[i].name, emp_ptr[i].state, emp_ptr[i].clockNum, emp_ptr[i].wage,
emp_totals_ptr[i].hours, emp_totals_ptr[i].overtime, emp_totals_ptr[i].grossPay,
emp_totals_ptr[i].stateTax, emp_totals_ptr[i].fedTax, emp_totals_ptr[i].netPay);
}
printf("---------------------------------------------------------------------------------\n"); printf("Totals: %.2f %.1f %.1f %.2f %.2f %.2f %.2f\n", emp_totals_ptr->hours, emp_totals_ptr->overtime, emp_totals_ptr->grossPay,
emp_totals_ptr->stateTax, emp_totals_ptr->fedTax, emp_totals_ptr->netPay);
printf("Averages: %.2f %.1f %.1f %.2f %.2f %.2f %.2f\n", emp_totals_ptr->hours / NUM_EMPL, emp_totals_ptr->overtime / NUM_EMPL,
emp_totals_ptr->grossPay / NUM_EMPL, emp_totals_ptr->stateTax / NUM_EMPL,
emp_totals_ptr->fedTax / NUM_EMPL, emp_totals_ptr->netPay / NUM_EMPL);
printf("Minimum: %.2f %.1f %.1f %.2f %.2f %.2f %.2f\n", emp_minMax_ptr->minWage, emp_minMax_ptr->minHours, emp_minMax_ptr->minOT,
emp_minMax_ptr->minGross, emp_minMax_ptr->minState, emp_minMax_ptr->minFed,
emp_minMax_ptr->minNet);
printf("Maximum: %.2f %.1f %.1f %.2f %.2f %.2f %.2f\n", emp_minMax_ptr->maxWage, emp_minMax_ptr->maxHours, emp_minMax_ptr->maxOT,
emp_minMax_ptr->maxGross, emp_minMax_ptr->maxState, emp_minMax_ptr->maxFed,
emp_minMax_ptr->maxNet);
}
// Function to calculate totals
void calculateTotals(struct totals *emp_totals_ptr) {
for (int i = 0; i < NUM_EMPL; ++i) {
emp_totals_ptr->hours += emp_totals_ptr[i].hours;
emp_totals_ptr->regular += emp_totals_ptr[i].regular;
emp_totals_ptr->overtime += emp_totals_ptr[i].overtime;
emp_totals_ptr->grossPay += emp_totals_ptr[i].grossPay;
}
}
// Function to calculate averages
void calculateAverages(struct totals *emp_totals_ptr) {
emp_totals_ptr->hours /= NUM_EMPL;
emp_totals_ptr->regular /= NUM_EMPL;
emp_totals_ptr->overtime /= NUM_EMPL;
emp_totals_ptr->grossPay /= NUM_EMPL;
}
// Function to find min and max values
void findMinMax(struct totals *emp_totals_ptr, struct min_max *emp_minMax_ptr) {
emp_minMax_ptr->minWage = emp_minMax_ptr->maxWage = emp_totals_ptr[0].grossPay;
emp_minMax_ptr->minHours = emp_minMax_ptr->maxHours = emp_totals_ptr[0].hours;
emp_minMax_ptr->minOT = emp_minMax_ptr->maxOT = emp_totals_ptr[0].overtime;
emp_minMax_ptr->minGross = emp_minMax_ptr->maxGross = emp_totals_ptr[0].grossPay;
emp_minMax_ptr->minState = emp_minMax_ptr->maxState = emp_totals_ptr[0].stateTax;
emp_minMax_ptr->minFed = emp_minMax_ptr->maxFed = emp_totals_ptr[0].fedTax;
emp_minMax_ptr->minNet = emp_minMax_ptr->maxNet = emp_totals_ptr[0].netPay;
for (int i = 1; i < NUM_EMPL; ++i) {
if (emp_totals_ptr[i].grossPay < emp_minMax_ptr->minGross)
emp_minMax_ptr->minGross = emp_totals_ptr[i].grossPay;
if (emp_totals_ptr[i].grossPay > emp_minMax_ptr->maxGross)
emp_minMax_ptr->maxGross = emp_totals_ptr[i].grossPay;
if (emp_totals_ptr[i].hours < emp_minMax_ptr->minHours)
emp_minMax_ptr->minHours = emp_totals_ptr[i].hours;
if (emp_totals_ptr[i].hours > emp_minMax_ptr->maxHours)
emp_minMax_ptr->maxHours = emp_totals_ptr[i].hours;
if (emp_totals_ptr[i].overtime < emp_minMax_ptr->minOT)
emp_minMax_ptr->minOT = emp_totals_ptr[i].overtime;
if (emp_totals_ptr[i].overtime > emp_minMax_ptr->maxOT)
emp_minMax_ptr->maxOT = emp_totals_ptr[i].overtime;
if (emp_totals_ptr[i].stateTax < emp_minMax_ptr->minState)
emp_minMax_ptr->minState = emp_totals_ptr[i].stateTax;
if (emp_totals_ptr[i].stateTax > emp_minMax_ptr->maxState)
emp_minMax_ptr->maxState = emp_totals_ptr[i].stateTax;
if (emp_totals_ptr[i].fedTax < emp_minMax_ptr->minFed)
emp_minMax_ptr->minFed = emp_totals_ptr[i].fedTax;
if (emp_totals_ptr[i].fedTax > emp_minMax_ptr->maxFed)
emp_minMax_ptr->maxFed = emp_totals_ptr[i].fedTax;
if (emp_totals_ptr[i].netPay < emp_minMax_ptr->minNet)
emp_minMax_ptr->minNet = emp_totals_ptr[i].netPay;
if (emp_totals_ptr[i].netPay > emp_minMax_ptr->maxNet)
emp_minMax_ptr->maxNet = emp_totals_ptr[i].netPay;
}
}