//********************************************************
//
// Assignment 10 - Linked Lists, Typedef, and Macros
//
// Name:Jacquelin Saint lucien
//
// Class: C Programming, Falls 2025
//
// Date: 11/22/2025
//
// 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 have all been replaced with
// pointer references to speed up the processing of this code.
// A linked list has been created and deployed to dynamically
// allocate and process employees as needed.
//
// It will also take advantage of the C Preprocessor features,
// in particular with using macros, and will replace all
// struct type references in the code with a typedef alias
// reference.
//
// Call by Reference design (using pointers)
//
//********************************************************
#include <stdio.h>
#include <string.h>
#define MAX_EMPLOYEES 10
// ----- MACROS -----
#define CALC_GROSS(hours, rate) ((hours) * (rate))
// corrected macros for min and max
#define UPDATE_MIN(current, new) if((new) < (current)) current = (new)
#define UPDATE_MAX(current, new) if((new) > (current)) current = (new)
// new macro for federal tax (10% as assumed in the homework)
#define FED_TAX(gross) ((gross) * 0.10f)
// ----- TYPEDEFS -----
typedef struct {
float min;
float max;
} MIN_MAX;
// ----- STRUCTURES -----
typedef struct {
char first[20];
char last[20];
char state[3];
int clockNumber;
float wageRate;
float hours;
float gross;
float federal;
float net;
} Employee;
typedef struct {
float totalHours;
float totalWages;
float totalGross;
float totalFederal;
float totalNet;
} Totals;
// ----- FUNCTION PROTOTYPES -----
void readEmployee(Employee *e);
void computePayroll(Employee *e);
void updateTotals(Totals *t, Employee e);
void updateMinMax(MIN_MAX *m, float value);
void printEmployee(Employee e);
void printTotals(Totals t, MIN_MAX minHours, MIN_MAX maxHours);
// ====================================================================
// MAIN
// ====================================================================
int main() {
Employee list[MAX_EMPLOYEES];
Totals totals = {0,0,0,0,0};
MIN_MAX hoursMinMax = {999999, -999999};
MIN_MAX grossMinMax = {999999, -999999};
int count = 5; // assignment uses 5 employees
for(int i = 0; i < count; i++) {
readEmployee(&list[i]);
computePayroll(&list[i]);
updateTotals(&totals, list[i]);
updateMinMax(&hoursMinMax, list[i].hours);
updateMinMax(&grossMinMax, list[i].gross);
}
printf("\n*** Pay Calculator ***\n\n"); printf("Name State Clock# Wage Hours Gross FedTax Net\n");
for(int i = 0; i < count; i++)
printEmployee(list[i]);
printTotals(totals, hoursMinMax, grossMinMax);
return 0;
}
// ====================================================================
// FUNCTION SIGNATURES
// ====================================================================
void readEmployee(Employee *e) {
scanf("%s %s %s %d %f %f", e->first, e->last, e->state,
&e->clockNumber, &e->wageRate, &e->hours);
}
void computePayroll(Employee *e) {
e->gross = CALC_GROSS(e->hours, e->wageRate);
e->federal = FED_TAX(e->gross);
e->net = e->gross - e->federal;
}
void updateTotals(Totals *t, Employee e) {
t->totalHours += e.hours;
t->totalWages += e.wageRate;
t->totalGross += e.gross;
t->totalFederal+= e.federal;
t->totalNet += e.net;
}
void updateMinMax(MIN_MAX *m, float value) {
UPDATE_MIN(m->min, value);
UPDATE_MAX(m->max, value);
}
void printEmployee(Employee e) {
printf("%-10s %-10s %-3s %6d %7.2f %7.2f %8.2f %8.2f %8.2f\n", e.first, e.last, e.state, e.clockNumber,
e.wageRate, e.hours, e.gross, e.federal, e.net);
}
void printTotals(Totals t, MIN_MAX minHours, MIN_MAX maxHours) {
printf("Hours: %.2f\n", t.
totalHours); printf("Gross: %.2f\n", t.
totalGross); printf("Federal: %.2f\n", t.
totalFederal); printf("Net: %.2f\n\n", t.
totalNet);
printf("Min Hours Worked: %.2f\n", minHours.
min); printf("Max Hours Worked: %.2f\n", maxHours.
max); }
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDEwIC0gTGlua2VkIExpc3RzLCBUeXBlZGVmLCBhbmQgTWFjcm9zCi8vCi8vIE5hbWU6SmFjcXVlbGluIFNhaW50IGx1Y2llbgovLwovLyBDbGFzczogQyBQcm9ncmFtbWluZywgRmFsbHMgMjAyNQovLwovLyBEYXRlOiAxMS8yMi8yMDI1Ci8vCi8vIERlc2NyaXB0aW9uOiBQcm9ncmFtIHdoaWNoIGRldGVybWluZXMgb3ZlcnRpbWUgYW5kIAovLyBncm9zcyBwYXkgZm9yIGEgc2V0IG9mIGVtcGxveWVlcyB3aXRoIG91dHB1dHMgc2VudCAKLy8gdG8gc3RhbmRhcmQgb3V0cHV0ICh0aGUgc2NyZWVuKS4KLy8KLy8gVGhpcyBhc3NpZ25tZW50IGFsc28gYWRkcyB0aGUgZW1wbG95ZWUgbmFtZSwgdGhlaXIgdGF4IHN0YXRlLAovLyBhbmQgY2FsY3VsYXRlcyB0aGUgc3RhdGUgdGF4LCBmZWRlcmFsIHRheCwgYW5kIG5ldCBwYXkuIEl0Ci8vIGFsc28gY2FsY3VsYXRlcyB0b3RhbHMsIGF2ZXJhZ2VzLCBtaW5pbXVtLCBhbmQgbWF4aW11bSB2YWx1ZXMuCi8vCi8vIEFycmF5IGFuZCBTdHJ1Y3R1cmUgcmVmZXJlbmNlcyBoYXZlIGFsbCBiZWVuIHJlcGxhY2VkIHdpdGgKLy8gcG9pbnRlciByZWZlcmVuY2VzIHRvIHNwZWVkIHVwIHRoZSBwcm9jZXNzaW5nIG9mIHRoaXMgY29kZS4KLy8gQSBsaW5rZWQgbGlzdCBoYXMgYmVlbiBjcmVhdGVkIGFuZCBkZXBsb3llZCB0byBkeW5hbWljYWxseQovLyBhbGxvY2F0ZSBhbmQgcHJvY2VzcyBlbXBsb3llZXMgYXMgbmVlZGVkLgovLwovLyBJdCB3aWxsIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIEMgUHJlcHJvY2Vzc29yIGZlYXR1cmVzLAovLyBpbiBwYXJ0aWN1bGFyIHdpdGggdXNpbmcgbWFjcm9zLCBhbmQgd2lsbCByZXBsYWNlIGFsbCAKLy8gc3RydWN0IHR5cGUgcmVmZXJlbmNlcyBpbiB0aGUgY29kZSB3aXRoIGEgdHlwZWRlZiBhbGlhcwovLyByZWZlcmVuY2UuCi8vCi8vIENhbGwgYnkgUmVmZXJlbmNlIGRlc2lnbiAodXNpbmcgcG9pbnRlcnMpCi8vCi8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgoKCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE1BWF9FTVBMT1lFRVMgMTAKCi8vIC0tLS0tIE1BQ1JPUyAtLS0tLQojZGVmaW5lIENBTENfR1JPU1MoaG91cnMsIHJhdGUpICAgKChob3VycykgKiAocmF0ZSkpCgovLyBjb3JyZWN0ZWQgbWFjcm9zIGZvciBtaW4gYW5kIG1heAojZGVmaW5lIFVQREFURV9NSU4oY3VycmVudCwgbmV3KSAgaWYoKG5ldykgPCAoY3VycmVudCkpIGN1cnJlbnQgPSAobmV3KQojZGVmaW5lIFVQREFURV9NQVgoY3VycmVudCwgbmV3KSAgaWYoKG5ldykgPiAoY3VycmVudCkpIGN1cnJlbnQgPSAobmV3KQoKLy8gbmV3IG1hY3JvIGZvciBmZWRlcmFsIHRheCAoMTAlIGFzIGFzc3VtZWQgaW4gdGhlIGhvbWV3b3JrKQojZGVmaW5lIEZFRF9UQVgoZ3Jvc3MpICAoKGdyb3NzKSAqIDAuMTBmKQoKCi8vIC0tLS0tIFRZUEVERUZTIC0tLS0tCnR5cGVkZWYgc3RydWN0IHsKICAgIGZsb2F0IG1pbjsKICAgIGZsb2F0IG1heDsKfSBNSU5fTUFYOwoKCi8vIC0tLS0tIFNUUlVDVFVSRVMgLS0tLS0KdHlwZWRlZiBzdHJ1Y3QgewogICAgY2hhciBmaXJzdFsyMF07CiAgICBjaGFyIGxhc3RbMjBdOwogICAgY2hhciBzdGF0ZVszXTsKICAgIGludCBjbG9ja051bWJlcjsKICAgIGZsb2F0IHdhZ2VSYXRlOwogICAgZmxvYXQgaG91cnM7CiAgICBmbG9hdCBncm9zczsKICAgIGZsb2F0IGZlZGVyYWw7CiAgICBmbG9hdCBuZXQ7Cn0gRW1wbG95ZWU7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBmbG9hdCB0b3RhbEhvdXJzOwogICAgZmxvYXQgdG90YWxXYWdlczsKICAgIGZsb2F0IHRvdGFsR3Jvc3M7CiAgICBmbG9hdCB0b3RhbEZlZGVyYWw7CiAgICBmbG9hdCB0b3RhbE5ldDsKfSBUb3RhbHM7CgoKLy8gLS0tLS0gRlVOQ1RJT04gUFJPVE9UWVBFUyAtLS0tLQp2b2lkIHJlYWRFbXBsb3llZShFbXBsb3llZSAqZSk7CnZvaWQgY29tcHV0ZVBheXJvbGwoRW1wbG95ZWUgKmUpOwp2b2lkIHVwZGF0ZVRvdGFscyhUb3RhbHMgKnQsIEVtcGxveWVlIGUpOwp2b2lkIHVwZGF0ZU1pbk1heChNSU5fTUFYICptLCBmbG9hdCB2YWx1ZSk7CnZvaWQgcHJpbnRFbXBsb3llZShFbXBsb3llZSBlKTsKdm9pZCBwcmludFRvdGFscyhUb3RhbHMgdCwgTUlOX01BWCBtaW5Ib3VycywgTUlOX01BWCBtYXhIb3Vycyk7CgoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFJTgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKaW50IG1haW4oKSB7CiAgICBFbXBsb3llZSBsaXN0W01BWF9FTVBMT1lFRVNdOwogICAgVG90YWxzIHRvdGFscyA9IHswLDAsMCwwLDB9OwogICAgTUlOX01BWCBob3Vyc01pbk1heCA9IHs5OTk5OTksIC05OTk5OTl9OwogICAgTUlOX01BWCBncm9zc01pbk1heCA9IHs5OTk5OTksIC05OTk5OTl9OwoKICAgIGludCBjb3VudCA9IDU7IC8vIGFzc2lnbm1lbnQgdXNlcyA1IGVtcGxveWVlcwoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgcmVhZEVtcGxveWVlKCZsaXN0W2ldKTsKICAgICAgICBjb21wdXRlUGF5cm9sbCgmbGlzdFtpXSk7CiAgICAgICAgdXBkYXRlVG90YWxzKCZ0b3RhbHMsIGxpc3RbaV0pOwoKICAgICAgICB1cGRhdGVNaW5NYXgoJmhvdXJzTWluTWF4LCBsaXN0W2ldLmhvdXJzKTsKICAgICAgICB1cGRhdGVNaW5NYXgoJmdyb3NzTWluTWF4LCBsaXN0W2ldLmdyb3NzKTsKICAgIH0KCiAgICBwcmludGYoIlxuKioqIFBheSBDYWxjdWxhdG9yICoqKlxuXG4iKTsKICAgIHByaW50ZigiTmFtZSAgICAgICAgICAgIFN0YXRlIENsb2NrIyAgIFdhZ2UgIEhvdXJzICAgR3Jvc3MgICBGZWRUYXggICBOZXRcbiIpOwoKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogICAgICAgIHByaW50RW1wbG95ZWUobGlzdFtpXSk7CgogICAgcHJpbnRUb3RhbHModG90YWxzLCBob3Vyc01pbk1heCwgZ3Jvc3NNaW5NYXgpOwoKICAgIHJldHVybiAwOwp9CgoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gICAgICAgICAgICAgICAgICAgIEZVTkNUSU9OIFNJR05BVFVSRVMKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnZvaWQgcmVhZEVtcGxveWVlKEVtcGxveWVlICplKSB7CiAgICBzY2FuZigiJXMgJXMgJXMgJWQgJWYgJWYiLAogICAgICAgICAgZS0+Zmlyc3QsIGUtPmxhc3QsIGUtPnN0YXRlLAogICAgICAgICAgJmUtPmNsb2NrTnVtYmVyLCAmZS0+d2FnZVJhdGUsICZlLT5ob3Vycyk7Cn0KCnZvaWQgY29tcHV0ZVBheXJvbGwoRW1wbG95ZWUgKmUpIHsKICAgIGUtPmdyb3NzID0gQ0FMQ19HUk9TUyhlLT5ob3VycywgZS0+d2FnZVJhdGUpOwogICAgZS0+ZmVkZXJhbCA9IEZFRF9UQVgoZS0+Z3Jvc3MpOwogICAgZS0+bmV0ID0gZS0+Z3Jvc3MgLSBlLT5mZWRlcmFsOwp9Cgp2b2lkIHVwZGF0ZVRvdGFscyhUb3RhbHMgKnQsIEVtcGxveWVlIGUpIHsKICAgIHQtPnRvdGFsSG91cnMgICs9IGUuaG91cnM7CiAgICB0LT50b3RhbFdhZ2VzICArPSBlLndhZ2VSYXRlOwogICAgdC0+dG90YWxHcm9zcyAgKz0gZS5ncm9zczsKICAgIHQtPnRvdGFsRmVkZXJhbCs9IGUuZmVkZXJhbDsKICAgIHQtPnRvdGFsTmV0ICAgICs9IGUubmV0Owp9Cgp2b2lkIHVwZGF0ZU1pbk1heChNSU5fTUFYICptLCBmbG9hdCB2YWx1ZSkgewogICAgVVBEQVRFX01JTihtLT5taW4sIHZhbHVlKTsKICAgIFVQREFURV9NQVgobS0+bWF4LCB2YWx1ZSk7Cn0KCnZvaWQgcHJpbnRFbXBsb3llZShFbXBsb3llZSBlKSB7CiAgICBwcmludGYoIiUtMTBzICUtMTBzICUtM3MgJTZkICU3LjJmICU3LjJmICU4LjJmICU4LjJmICU4LjJmXG4iLAogICAgICAgICAgIGUuZmlyc3QsIGUubGFzdCwgZS5zdGF0ZSwgZS5jbG9ja051bWJlciwKICAgICAgICAgICBlLndhZ2VSYXRlLCBlLmhvdXJzLCBlLmdyb3NzLCBlLmZlZGVyYWwsIGUubmV0KTsKfQoKdm9pZCBwcmludFRvdGFscyhUb3RhbHMgdCwgTUlOX01BWCBtaW5Ib3VycywgTUlOX01BWCBtYXhIb3VycykgewogICAgcHJpbnRmKCJcblRvdGFsczpcbiIpOwogICAgcHJpbnRmKCJIb3VyczogJS4yZlxuIiwgdC50b3RhbEhvdXJzKTsKICAgIHByaW50ZigiR3Jvc3M6ICUuMmZcbiIsIHQudG90YWxHcm9zcyk7CiAgICBwcmludGYoIkZlZGVyYWw6ICUuMmZcbiIsIHQudG90YWxGZWRlcmFsKTsKICAgIHByaW50ZigiTmV0OiAlLjJmXG5cbiIsIHQudG90YWxOZXQpOwoKICAgIHByaW50ZigiTWluIEhvdXJzIFdvcmtlZDogJS4yZlxuIiwgbWluSG91cnMubWluKTsKICAgIHByaW50ZigiTWF4IEhvdXJzIFdvcmtlZDogJS4yZlxuIiwgbWF4SG91cnMubWF4KTsKfQo=