/********************************************************
*
* Assignment 11 - Object Oriented Design (C-Compatible Version)
*
* Name: John Semenuk
* Class: C Programming, Spring 2026
* Date: April 27, 2026
*
* Description:
* This version is rewritten in standard C so it will compile
* correctly as prog.c using gcc.
*
********************************************************/
#include <stdio.h>
#include <string.h>
#include <ctype.h>
// 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 FED_TAX_RATE 0.25
#define EMP_SIZE 5
// structure for Employee
struct Employee
{
char firstName[ 20 ] ;
char lastName[ 20 ] ;
char taxState[ 3 ] ;
int clockNumber;
float wageRate;
float hours;
float overTimeHrs;
float grossPay;
float stateTax;
float fedTax;
float netPay;
} ;
// function prototypes
float calcOverTimeHrs( float hours) ;
float calcGrossPay( float wageRate, float hours, float overTimeHrs) ;
float calcStateTax( float grossPay, char taxState[ ] ) ;
float calcFedTax( float grossPay) ;
float calcNetPay( float grossPay, float stateTax, float fedTax) ;
void printEmployee( struct Employee e) ;
// overtime
float calcOverTimeHrs( float hours)
{
if ( hours > STD_HOURS)
return hours - STD_HOURS;
else
return 0.0 ;
}
// gross pay
float calcGrossPay( float wageRate, float hours, float overTimeHrs)
{
if ( overTimeHrs > 0 )
{
return ( STD_HOURS * wageRate) +
( overTimeHrs * ( wageRate * OT_RATE) ) ;
}
else
{
return wageRate * hours;
}
}
// state tax
float calcStateTax( float grossPay, char taxState[ ] )
{
if ( strcmp ( taxState
, "MA" ) == 0 ) return grossPay * MA_TAX_RATE;
else if ( strcmp ( taxState
, "VT" ) == 0 ) return grossPay * VT_TAX_RATE;
else if ( strcmp ( taxState
, "NH" ) == 0 ) return grossPay * NH_TAX_RATE;
else if ( strcmp ( taxState
, "CA" ) == 0 ) return grossPay * CA_TAX_RATE;
else
return grossPay * DEFAULT_TAX_RATE;
}
// federal tax
float calcFedTax( float grossPay)
{
return grossPay * FED_TAX_RATE;
}
// net pay
float calcNetPay( float grossPay, float stateTax, float fedTax)
{
return grossPay - ( stateTax + fedTax) ;
}
// print employee
void printEmployee( struct Employee e)
{
printf ( "\n \n *** Entered Details are *** \n " ) ;
printf ( "\n First Name: %s" , e.
firstName ) ; printf ( "\n Last Name: %s" , e.
lastName ) ; printf ( "\n Tax State: %s" , e.
taxState ) ; printf ( "\n Clock Number: %d" , e.
clockNumber ) ; printf ( "\n Wage Rate: %.2f" , e.
wageRate ) ; printf ( "\n Hours: %.2f" , e.
hours ) ;
printf ( "\n \n *** Calculated Values are *** \n " ) ;
printf ( "\n Overtime Hours : %.2f" , e.
overTimeHrs ) ; printf ( "\n Gross Pay : $%.2f" , e.
grossPay ) ; printf ( "\n State Tax : $%.2f" , e.
stateTax ) ; printf ( "\n Federal Tax : $%.2f" , e.
fedTax ) ; printf ( "\n Net Pay : $%.2f" , e.
netPay ) ;
}
// main
int main( )
{
struct Employee e[ EMP_SIZE] ;
int i, j;
for ( i = 0 ; i < EMP_SIZE; i++ )
{
printf ( "\n \n Enter Employee First Name: " ) ; scanf ( "%s" , e
[ i
] .
firstName ) ;
printf ( "\n Enter Employee Last Name: " ) ; scanf ( "%s" , e
[ i
] .
lastName ) ;
printf ( "\n Enter Employee Tax State: " ) ; scanf ( "%s" , e
[ i
] .
taxState ) ;
// convert taxState to uppercase
for ( j = 0 ; e[ i] .taxState [ j] ; j++ )
{
e
[ i
] .
taxState [ j
] = toupper ( e
[ i
] .
taxState [ j
] ) ; }
printf ( "\n Enter Employee Clock Number: " ) ; scanf ( "%d" , & e
[ i
] .
clockNumber ) ;
printf ( "\n Enter Employee Hourly Wage Rate: " ) ; scanf ( "%f" , & e
[ i
] .
wageRate ) ;
printf ( "\n Enter Employee Hours Worked for the Week: " ) ; scanf ( "%f" , & e
[ i
] .
hours ) ;
// calculations
e[ i] .overTimeHrs = calcOverTimeHrs( e[ i] .hours ) ;
e[ i] .grossPay = calcGrossPay( e[ i] .wageRate , e[ i] .hours , e[ i] .overTimeHrs ) ;
e[ i] .stateTax = calcStateTax( e[ i] .grossPay , e[ i] .taxState ) ;
e[ i] .fedTax = calcFedTax( e[ i] .grossPay ) ;
e[ i] .netPay = calcNetPay( e[ i] .grossPay , e[ i] .stateTax , e[ i] .fedTax ) ;
// output
printEmployee( e[ i] ) ;
}
return 0 ;
}
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIEFzc2lnbm1lbnQgMTEgLSBPYmplY3QgT3JpZW50ZWQgRGVzaWduIChDLUNvbXBhdGlibGUgVmVyc2lvbikKICoKICogTmFtZTogSm9obiBTZW1lbnVrCiAqIENsYXNzOiBDIFByb2dyYW1taW5nLCBTcHJpbmcgMjAyNgogKiBEYXRlOiBBcHJpbCAyNywgMjAyNgogKgogKiBEZXNjcmlwdGlvbjoKICogVGhpcyB2ZXJzaW9uIGlzIHJld3JpdHRlbiBpbiBzdGFuZGFyZCBDIHNvIGl0IHdpbGwgY29tcGlsZQogKiBjb3JyZWN0bHkgYXMgcHJvZy5jIHVzaW5nIGdjYy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgovLyBjb25zdGFudHMKI2RlZmluZSBTVERfSE9VUlMgNDAuMAojZGVmaW5lIE9UX1JBVEUgMS41CiNkZWZpbmUgTUFfVEFYX1JBVEUgMC4wNQojZGVmaW5lIE5IX1RBWF9SQVRFIDAuMAojZGVmaW5lIFZUX1RBWF9SQVRFIDAuMDYKI2RlZmluZSBDQV9UQVhfUkFURSAwLjA3CiNkZWZpbmUgREVGQVVMVF9UQVhfUkFURSAwLjA4CiNkZWZpbmUgRkVEX1RBWF9SQVRFIDAuMjUKI2RlZmluZSBFTVBfU0laRSA1CgovLyBzdHJ1Y3R1cmUgZm9yIEVtcGxveWVlCnN0cnVjdCBFbXBsb3llZQp7CiAgICBjaGFyIGZpcnN0TmFtZVsyMF07CiAgICBjaGFyIGxhc3ROYW1lWzIwXTsKICAgIGNoYXIgdGF4U3RhdGVbM107CiAgICBpbnQgY2xvY2tOdW1iZXI7CiAgICBmbG9hdCB3YWdlUmF0ZTsKICAgIGZsb2F0IGhvdXJzOwogICAgZmxvYXQgb3ZlclRpbWVIcnM7CiAgICBmbG9hdCBncm9zc1BheTsKICAgIGZsb2F0IHN0YXRlVGF4OwogICAgZmxvYXQgZmVkVGF4OwogICAgZmxvYXQgbmV0UGF5Owp9OwoKLy8gZnVuY3Rpb24gcHJvdG90eXBlcwpmbG9hdCBjYWxjT3ZlclRpbWVIcnMoZmxvYXQgaG91cnMpOwpmbG9hdCBjYWxjR3Jvc3NQYXkoZmxvYXQgd2FnZVJhdGUsIGZsb2F0IGhvdXJzLCBmbG9hdCBvdmVyVGltZUhycyk7CmZsb2F0IGNhbGNTdGF0ZVRheChmbG9hdCBncm9zc1BheSwgY2hhciB0YXhTdGF0ZVtdKTsKZmxvYXQgY2FsY0ZlZFRheChmbG9hdCBncm9zc1BheSk7CmZsb2F0IGNhbGNOZXRQYXkoZmxvYXQgZ3Jvc3NQYXksIGZsb2F0IHN0YXRlVGF4LCBmbG9hdCBmZWRUYXgpOwp2b2lkIHByaW50RW1wbG95ZWUoc3RydWN0IEVtcGxveWVlIGUpOwoKLy8gb3ZlcnRpbWUKZmxvYXQgY2FsY092ZXJUaW1lSHJzKGZsb2F0IGhvdXJzKQp7CiAgICBpZiAoaG91cnMgPiBTVERfSE9VUlMpCiAgICAgICAgcmV0dXJuIGhvdXJzIC0gU1REX0hPVVJTOwogICAgZWxzZQogICAgICAgIHJldHVybiAwLjA7Cn0KCi8vIGdyb3NzIHBheQpmbG9hdCBjYWxjR3Jvc3NQYXkoZmxvYXQgd2FnZVJhdGUsIGZsb2F0IGhvdXJzLCBmbG9hdCBvdmVyVGltZUhycykKewogICAgaWYgKG92ZXJUaW1lSHJzID4gMCkKICAgIHsKICAgICAgICByZXR1cm4gKFNURF9IT1VSUyAqIHdhZ2VSYXRlKSArCiAgICAgICAgICAgICAgIChvdmVyVGltZUhycyAqICh3YWdlUmF0ZSAqIE9UX1JBVEUpKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICByZXR1cm4gd2FnZVJhdGUgKiBob3VyczsKICAgIH0KfQoKLy8gc3RhdGUgdGF4CmZsb2F0IGNhbGNTdGF0ZVRheChmbG9hdCBncm9zc1BheSwgY2hhciB0YXhTdGF0ZVtdKQp7CiAgICBpZiAoc3RyY21wKHRheFN0YXRlLCAiTUEiKSA9PSAwKQogICAgICAgIHJldHVybiBncm9zc1BheSAqIE1BX1RBWF9SQVRFOwogICAgZWxzZSBpZiAoc3RyY21wKHRheFN0YXRlLCAiVlQiKSA9PSAwKQogICAgICAgIHJldHVybiBncm9zc1BheSAqIFZUX1RBWF9SQVRFOwogICAgZWxzZSBpZiAoc3RyY21wKHRheFN0YXRlLCAiTkgiKSA9PSAwKQogICAgICAgIHJldHVybiBncm9zc1BheSAqIE5IX1RBWF9SQVRFOwogICAgZWxzZSBpZiAoc3RyY21wKHRheFN0YXRlLCAiQ0EiKSA9PSAwKQogICAgICAgIHJldHVybiBncm9zc1BheSAqIENBX1RBWF9SQVRFOwogICAgZWxzZQogICAgICAgIHJldHVybiBncm9zc1BheSAqIERFRkFVTFRfVEFYX1JBVEU7Cn0KCi8vIGZlZGVyYWwgdGF4CmZsb2F0IGNhbGNGZWRUYXgoZmxvYXQgZ3Jvc3NQYXkpCnsKICAgIHJldHVybiBncm9zc1BheSAqIEZFRF9UQVhfUkFURTsKfQoKLy8gbmV0IHBheQpmbG9hdCBjYWxjTmV0UGF5KGZsb2F0IGdyb3NzUGF5LCBmbG9hdCBzdGF0ZVRheCwgZmxvYXQgZmVkVGF4KQp7CiAgICByZXR1cm4gZ3Jvc3NQYXkgLSAoc3RhdGVUYXggKyBmZWRUYXgpOwp9CgovLyBwcmludCBlbXBsb3llZQp2b2lkIHByaW50RW1wbG95ZWUoc3RydWN0IEVtcGxveWVlIGUpCnsKICAgIHByaW50ZigiXG5cbioqKiBFbnRlcmVkIERldGFpbHMgYXJlICoqKiBcbiIpOwoKICAgIHByaW50ZigiXG4gRmlyc3QgTmFtZTogJXMiLCBlLmZpcnN0TmFtZSk7CiAgICBwcmludGYoIlxuIExhc3QgTmFtZTogJXMiLCBlLmxhc3ROYW1lKTsKICAgIHByaW50ZigiXG4gVGF4IFN0YXRlOiAlcyIsIGUudGF4U3RhdGUpOwogICAgcHJpbnRmKCJcbiBDbG9jayBOdW1iZXI6ICVkIiwgZS5jbG9ja051bWJlcik7CiAgICBwcmludGYoIlxuIFdhZ2UgUmF0ZTogJS4yZiIsIGUud2FnZVJhdGUpOwogICAgcHJpbnRmKCJcbiBIb3VyczogJS4yZiIsIGUuaG91cnMpOwoKICAgIHByaW50ZigiXG5cbiAqKiogQ2FsY3VsYXRlZCBWYWx1ZXMgYXJlICoqKiBcbiIpOwoKICAgIHByaW50ZigiXG4gT3ZlcnRpbWUgSG91cnMgOiAlLjJmIiwgZS5vdmVyVGltZUhycyk7CiAgICBwcmludGYoIlxuIEdyb3NzIFBheSA6ICQlLjJmIiwgZS5ncm9zc1BheSk7CiAgICBwcmludGYoIlxuIFN0YXRlIFRheCA6ICQlLjJmIiwgZS5zdGF0ZVRheCk7CiAgICBwcmludGYoIlxuIEZlZGVyYWwgVGF4IDogJCUuMmYiLCBlLmZlZFRheCk7CiAgICBwcmludGYoIlxuIE5ldCBQYXkgOiAkJS4yZiIsIGUubmV0UGF5KTsKCiAgICBwcmludGYoIlxuXG4iKTsKfQoKLy8gbWFpbgppbnQgbWFpbigpCnsKICAgIHN0cnVjdCBFbXBsb3llZSBlW0VNUF9TSVpFXTsKICAgIGludCBpLCBqOwoKICAgIGZvciAoaSA9IDA7IGkgPCBFTVBfU0laRTsgaSsrKQogICAgewogICAgICAgIHByaW50ZigiXG5cbiBFbnRlciBFbXBsb3llZSBGaXJzdCBOYW1lOiAiKTsKICAgICAgICBzY2FuZigiJXMiLCBlW2ldLmZpcnN0TmFtZSk7CgogICAgICAgIHByaW50ZigiXG4gRW50ZXIgRW1wbG95ZWUgTGFzdCBOYW1lOiAiKTsKICAgICAgICBzY2FuZigiJXMiLCBlW2ldLmxhc3ROYW1lKTsKCiAgICAgICAgcHJpbnRmKCJcbiBFbnRlciBFbXBsb3llZSBUYXggU3RhdGU6ICIpOwogICAgICAgIHNjYW5mKCIlcyIsIGVbaV0udGF4U3RhdGUpOwoKICAgICAgICAvLyBjb252ZXJ0IHRheFN0YXRlIHRvIHVwcGVyY2FzZQogICAgICAgIGZvciAoaiA9IDA7IGVbaV0udGF4U3RhdGVbal07IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGVbaV0udGF4U3RhdGVbal0gPSB0b3VwcGVyKGVbaV0udGF4U3RhdGVbal0pOwogICAgICAgIH0KCiAgICAgICAgcHJpbnRmKCJcbiBFbnRlciBFbXBsb3llZSBDbG9jayBOdW1iZXI6ICIpOwogICAgICAgIHNjYW5mKCIlZCIsICZlW2ldLmNsb2NrTnVtYmVyKTsKCiAgICAgICAgcHJpbnRmKCJcbiBFbnRlciBFbXBsb3llZSBIb3VybHkgV2FnZSBSYXRlOiAiKTsKICAgICAgICBzY2FuZigiJWYiLCAmZVtpXS53YWdlUmF0ZSk7CgogICAgICAgIHByaW50ZigiXG4gRW50ZXIgRW1wbG95ZWUgSG91cnMgV29ya2VkIGZvciB0aGUgV2VlazogIik7CiAgICAgICAgc2NhbmYoIiVmIiwgJmVbaV0uaG91cnMpOwoKICAgICAgICAvLyBjYWxjdWxhdGlvbnMKICAgICAgICBlW2ldLm92ZXJUaW1lSHJzID0gY2FsY092ZXJUaW1lSHJzKGVbaV0uaG91cnMpOwogICAgICAgIGVbaV0uZ3Jvc3NQYXkgPSBjYWxjR3Jvc3NQYXkoZVtpXS53YWdlUmF0ZSwgZVtpXS5ob3VycywgZVtpXS5vdmVyVGltZUhycyk7CiAgICAgICAgZVtpXS5zdGF0ZVRheCA9IGNhbGNTdGF0ZVRheChlW2ldLmdyb3NzUGF5LCBlW2ldLnRheFN0YXRlKTsKICAgICAgICBlW2ldLmZlZFRheCA9IGNhbGNGZWRUYXgoZVtpXS5ncm9zc1BheSk7CiAgICAgICAgZVtpXS5uZXRQYXkgPSBjYWxjTmV0UGF5KGVbaV0uZ3Jvc3NQYXksIGVbaV0uc3RhdGVUYXgsIGVbaV0uZmVkVGF4KTsKCiAgICAgICAgLy8gb3V0cHV0CiAgICAgICAgcHJpbnRFbXBsb3llZShlW2ldKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQo=