#include <stdio.h>
#include <string.h>
#include <ctype.h> // for char functions
#include <stdlib.h> // for malloc
// -----------------------------------------------------------------------------
// Constants
// -----------------------------------------------------------------------------
#define STD_HOURS 40.0
#define OT_RATE 1.5
#define MA_TAX_RATE 0.05
#define NH_TAX_RATE 0.0
#define VT_TAX_RATE 0.06
#define CA_TAX_RATE 0.07
#define DEFAULT_TAX_RATE 0.08
#define NAME_SIZE 20
#define TAX_STATE_SIZE 3
#define FED_TAX_RATE 0.25
#define FIRST_NAME_SIZE 10
#define LAST_NAME_SIZE 10
// -----------------------------------------------------------------------------
// Structures
// -----------------------------------------------------------------------------
struct name {
char firstName[FIRST_NAME_SIZE];
char lastName[LAST_NAME_SIZE];
};
struct employee {
struct name empName;
char taxState[TAX_STATE_SIZE];
long int clockNumber;
float wageRate;
float hours;
float overtimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
struct employee *next;
};
struct totals {
float total_wageRate;
float total_hours;
float total_overtimeHrs;
float total_grossPay;
float total_stateTax;
float total_fedTax;
float total_netPay;
};
struct min_max {
float min_wageRate;
float min_hours;
float min_overtimeHrs;
float min_grossPay;
float min_stateTax;
float min_fedTax;
float min_netPay;
float max_wageRate;
float max_hours;
float max_overtimeHrs;
float max_grossPay;
float max_stateTax;
float max_fedTax;
float max_netPay;
};
// -----------------------------------------------------------------------------
// Function Prototypes
// -----------------------------------------------------------------------------
struct employee *getEmpData(void);
int isEmployeeSize(struct employee *head_ptr);
void calcOvertimeHrs(struct employee *head_ptr);
void calcGrossPay(struct employee *head_ptr);
void calcStateTax(struct employee *head_ptr);
void calcFedTax(struct employee *head_ptr);
void calcNetPay(struct employee *head_ptr);
void calcEmployeeTotals(struct employee *head_ptr, struct totals *totals_ptr);
void calcEmployeeMinMax(struct employee *head_ptr, struct min_max *minmax_ptr);
void printHeader(void);
void printEmp(struct employee *head_ptr);
void printEmpStatistics(struct totals *totals_ptr, struct min_max *minmax_ptr, int theSize);
// -----------------------------------------------------------------------------
// MAIN
// -----------------------------------------------------------------------------
int main() {
struct employee *head_ptr;
int theSize;
struct totals employeeTotals = {0};
struct totals *totals_ptr = &employeeTotals;
struct min_max employeeMinMax = {0};
struct min_max *minmax_ptr = &employeeMinMax;
head_ptr = getEmpData();
theSize = isEmployeeSize(head_ptr);
if (theSize <= 0) {
printf("\n\n**** There was no employee input to process ***\n"); } else {
calcOvertimeHrs(head_ptr);
calcGrossPay(head_ptr);
calcStateTax(head_ptr);
calcFedTax(head_ptr);
calcNetPay(head_ptr);
calcEmployeeTotals(head_ptr, totals_ptr);
calcEmployeeMinMax(head_ptr, minmax_ptr);
printHeader();
printEmp(head_ptr);
printEmpStatistics(totals_ptr, minmax_ptr, theSize);
}
printf("\n\n *** End of Program *** \n"); return 0;
}
// -----------------------------------------------------------------------------
// getEmpData
// -----------------------------------------------------------------------------
struct employee *getEmpData(void) {
char answer[80];
int more_data = 1;
char value;
struct employee *current_ptr, *head_ptr;
head_ptr
= malloc(sizeof(struct employee
)); if (!head_ptr) {
printf("Memory allocation failed\n"); }
memset(head_ptr
, 0, sizeof(struct employee
)); current_ptr = head_ptr;
while (more_data) {
printf("\nEnter employee first name: "); scanf("%9s", current_ptr
->empName.
firstName);
printf("Enter employee last name: "); scanf("%9s", current_ptr
->empName.
lastName);
printf("Enter employee two character tax state: "); scanf("%2s", current_ptr
->taxState
);
printf("Enter employee clock number: "); scanf("%li", ¤t_ptr
->clockNumber
);
printf("Enter employee hourly wage: "); scanf("%f", ¤t_ptr
->wageRate
);
printf("Enter hours worked this week: "); scanf("%f", ¤t_ptr
->hours
);
printf("Would you like to add another employee? (y/n): ");
if ((value
= toupper(answer
[0])) != 'Y') { current_ptr->next = NULL;
more_data = 0;
} else {
current_ptr
->next
= malloc(sizeof(struct employee
)); if (!current_ptr->next) {
printf("Memory allocation failed\n"); }
memset(current_ptr
->next
, 0, sizeof(struct employee
)); current_ptr = current_ptr->next;
}
}
return head_ptr;
}
// -----------------------------------------------------------------------------
// isEmployeeSize
// -----------------------------------------------------------------------------
int isEmployeeSize(struct employee *head_ptr) {
int count = 0;
struct employee *ptr = head_ptr;
while (ptr) {
count++;
ptr = ptr->next;
}
return count;
}
// -----------------------------------------------------------------------------
// printHeader
// -----------------------------------------------------------------------------
void printHeader(void) {
printf("\n\n*** Pay Calculator ***\n"); printf("\n--------------------------------------------------------------" "-------------------");
printf("\nName Tax Clock# Wage Hours OT Gross " " State Fed Net");
" Tax Tax Pay");
printf("\n--------------------------------------------------------------" "-------------------");
}
// -----------------------------------------------------------------------------
// printEmp
// -----------------------------------------------------------------------------
void printEmp(struct employee *head_ptr) {
struct employee *ptr = head_ptr;
char fullname[FIRST_NAME_SIZE + LAST_NAME_SIZE + 2];
while (ptr) {
snprintf(fullname
, sizeof(fullname
), "%s %s", ptr->empName.firstName, ptr->empName.lastName);
printf("\n%-20.20s %-2.2s %06li %5.2f %4.1f %4.1f %7.2f %6.2f %7.2f %8.2f", fullname, ptr->taxState, ptr->clockNumber,
ptr->wageRate, ptr->hours,
ptr->overtimeHrs, ptr->grossPay,
ptr->stateTax, ptr->fedTax, ptr->netPay);
ptr = ptr->next;
}
}
// -----------------------------------------------------------------------------
// printEmpStatistics
// -----------------------------------------------------------------------------
void printEmpStatistics(struct totals *tot,
struct min_max *mm,
int size) {
printf("\n--------------------------------------------------------------" "-------------------");
printf("\nTotals: %5.2f %5.1f %5.1f %7.2f " "%6.2f %7.2f %8.2f",
tot->total_wageRate, tot->total_hours,
tot->total_overtimeHrs, tot->total_grossPay,
tot->total_stateTax, tot->total_fedTax,
tot->total_netPay);
if (size > 0) {
printf("\nAverages: %5.2f %5.1f %5.1f %7.2f " "%6.2f %7.2f %8.2f",
tot->total_wageRate / size,
tot->total_hours / size,
tot->total_overtimeHrs / size,
tot->total_grossPay / size,
tot->total_stateTax / size,
tot->total_fedTax / size,
tot->total_netPay / size);
}
printf("\nMinimum: %5.2f %5.1f %5.1f %7.2f " "%6.2f %7.2f %8.2f",
mm->min_wageRate, mm->min_hours, mm->min_overtimeHrs,
mm->min_grossPay, mm->min_stateTax, mm->min_fedTax,
mm->min_netPay);
printf("\nMaximum: %5.2f %5.1f %5.1f %7.2f " "%6.2f %7.2f %8.2f",
mm->max_wageRate, mm->max_hours, mm->max_overtimeHrs,
mm->max_grossPay, mm->max_stateTax, mm->max_fedTax,
mm->max_netPay);
printf("\n\nThe total employees processed was: %d\n", size
); }
// -----------------------------------------------------------------------------
// calcOvertimeHrs
// -----------------------------------------------------------------------------
void calcOvertimeHrs(struct employee *ptr) {
while (ptr) {
ptr->overtimeHrs = (ptr->hours > STD_HOURS)
? (ptr->hours - STD_HOURS)
: 0;
ptr = ptr->next;
}
}
// -----------------------------------------------------------------------------
// calcGrossPay
// -----------------------------------------------------------------------------
void calcGrossPay(struct employee *ptr) {
while (ptr) {
float normalPay = ptr->wageRate * (ptr->hours - ptr->overtimeHrs);
float overtimePay = ptr->overtimeHrs * (OT_RATE * ptr->wageRate);
ptr->grossPay = normalPay + overtimePay;
ptr = ptr->next;
}
}
// -----------------------------------------------------------------------------
// calcStateTax
// -----------------------------------------------------------------------------
void calcStateTax(struct employee *ptr) {
while (ptr) {
ptr
->taxState
[0] = toupper(ptr
->taxState
[0]); ptr
->taxState
[1] = toupper(ptr
->taxState
[1]);
if (!strcmp(ptr
->taxState
, "MA")) ptr->stateTax = ptr->grossPay * MA_TAX_RATE;
else if (!strcmp(ptr
->taxState
, "NH")) ptr->stateTax = ptr->grossPay * NH_TAX_RATE;
else if (!strcmp(ptr
->taxState
, "VT")) ptr->stateTax = ptr->grossPay * VT_TAX_RATE;
else if (!strcmp(ptr
->taxState
, "CA")) ptr->stateTax = ptr->grossPay * CA_TAX_RATE;
else
ptr->stateTax = ptr->grossPay * DEFAULT_TAX_RATE;
ptr = ptr->next;
}
}
// -----------------------------------------------------------------------------
// calcFedTax
// -----------------------------------------------------------------------------
void calcFedTax(struct employee *ptr) {
while (ptr) {
ptr->fedTax = ptr->grossPay * FED_TAX_RATE;
ptr = ptr->next;
}
}
// -----------------------------------------------------------------------------
// calcNetPay
// -----------------------------------------------------------------------------
void calcNetPay(struct employee *ptr) {
while (ptr) {
ptr->netPay = ptr->grossPay - (ptr->stateTax + ptr->fedTax);
ptr = ptr->next;
}
}
// -----------------------------------------------------------------------------
// calcEmployeeTotals
// -----------------------------------------------------------------------------
void calcEmployeeTotals(struct employee *ptr,
struct totals *tot) {
while (ptr) {
tot->total_wageRate += ptr->wageRate;
tot->total_hours += ptr->hours;
tot->total_overtimeHrs += ptr->overtimeHrs;
tot->total_grossPay += ptr->grossPay;
tot->total_stateTax += ptr->stateTax;
tot->total_fedTax += ptr->fedTax;
tot->total_netPay += ptr->netPay;
ptr = ptr->next;
}
}
// -----------------------------------------------------------------------------
// calcEmployeeMinMax
// -----------------------------------------------------------------------------
void calcEmployeeMinMax(struct employee *ptr,
struct min_max *mm) {
if (!ptr)
return;
mm->min_wageRate = mm->max_wageRate = ptr->wageRate;
mm->min_hours = mm->max_hours = ptr->hours;
mm->min_overtimeHrs = mm->max_overtimeHrs = ptr->overtimeHrs;
mm->min_grossPay = mm->max_grossPay = ptr->grossPay;
mm->min_stateTax = mm->max_stateTax = ptr->stateTax;
mm->min_fedTax = mm->max_fedTax = ptr->fedTax;
mm->min_netPay = mm->max_netPay = ptr->netPay;
ptr = ptr->next;
while (ptr) {
if (ptr->wageRate < mm->min_wageRate) mm->min_wageRate = ptr->wageRate;
if (ptr->wageRate > mm->max_wageRate) mm->max_wageRate = ptr->wageRate;
if (ptr->hours < mm->min_hours) mm->min_hours = ptr->hours;
if (ptr->hours > mm->max_hours) mm->max_hours = ptr->hours;
if (ptr->overtimeHrs < mm->min_overtimeHrs) mm->min_overtimeHrs = ptr->overtimeHrs;
if (ptr->overtimeHrs > mm->max_overtimeHrs) mm->max_overtimeHrs = ptr->overtimeHrs;
if (ptr->grossPay < mm->min_grossPay) mm->min_grossPay = ptr->grossPay;
if (ptr->grossPay > mm->max_grossPay) mm->max_grossPay = ptr->grossPay;
if (ptr->stateTax < mm->min_stateTax) mm->min_stateTax = ptr->stateTax;
if (ptr->stateTax > mm->max_stateTax) mm->max_stateTax = ptr->stateTax;
if (ptr->fedTax < mm->min_fedTax) mm->min_fedTax = ptr->fedTax;
if (ptr->fedTax > mm->max_fedTax) mm->max_fedTax = ptr->fedTax;
if (ptr->netPay < mm->min_netPay) mm->min_netPay = ptr->netPay;
if (ptr->netPay > mm->max_netPay) mm->max_netPay = ptr->netPay;
ptr = ptr->next;
}
}