//********************************************************
//
// Assignment 11 - Object Oriented Design
//
// Name: John Semenuk
//
// Class: C Programming, Spring 2026
//
// Date: April 25, 2026
//
// Description: An object oriented program design using
// C++ that will process our existing set of employees.
// It utilizes a class called Employee and generates an
// array of objects that are used to store, calculate,
// and print out a simple report of inputted and calculated
// values.
//
//
// Object Oriented Design (using C++)
//
//********************************************************
#include <stdio.h> // std::setprecision, std::setw
#include <string.h> // std::cout, std::fixed
#include <ctype.h> // string functions
// define 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
#define EMP_SIZE 5
// Employee structure
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) ;
// calculate overtime
float calcOverTimeHrs( float hours)
{
if ( hours > STD_HOURS)
return hours - STD_HOURS;
else
return 0.0 ;
}
// calculate 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;
}
}
// calculate 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;
}
// calculate federal tax
float calcFedTax( float grossPay)
{
return grossPay * FED_TAX_RATE;
}
// calculate net pay
float calcNetPay( float grossPay, float stateTax, float fedTax)
{
return grossPay - stateTax - fedTax;
}
// print employee report
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 function
int main( )
{
struct Employee e[ EMP_SIZE] ;
int i, j;
// process 5 employees
for ( i = 0 ; i < EMP_SIZE; i++ )
{
printf ( "\n \n Enter Employee First Name: " ) ; scanf ( "%19s" , e
[ i
] .
firstName ) ;
printf ( "\n Enter Employee Last Name: " ) ; scanf ( "%19s" , e
[ i
] .
lastName ) ;
printf ( "\n Enter Employee Tax State: " ) ; scanf ( "%2s" , e
[ i
] .
taxState ) ;
// convert tax state to uppercase
for ( j = 0 ; e[ i] .taxState [ j] != '\0 ' ; 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 ) ;
// display report
printEmployee( e[ i] ) ;
}
return 0 ;
}
Ly8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgovLwovLyBBc3NpZ25tZW50IDExIC0gT2JqZWN0IE9yaWVudGVkIERlc2lnbgovLwovLyBOYW1lOiBKb2huIFNlbWVudWsKLy8KLy8gQ2xhc3M6IEMgUHJvZ3JhbW1pbmcsIFNwcmluZyAyMDI2Ci8vCi8vIERhdGU6IEFwcmlsIDI1LCAyMDI2Ci8vCi8vIERlc2NyaXB0aW9uOiBBbiBvYmplY3Qgb3JpZW50ZWQgcHJvZ3JhbSBkZXNpZ24gdXNpbmcKLy8gQysrIHRoYXQgd2lsbCBwcm9jZXNzIG91ciBleGlzdGluZyBzZXQgb2YgZW1wbG95ZWVzLgovLyBJdCB1dGlsaXplcyBhIGNsYXNzIGNhbGxlZCBFbXBsb3llZSBhbmQgZ2VuZXJhdGVzIGFuCi8vIGFycmF5IG9mIG9iamVjdHMgdGhhdCBhcmUgdXNlZCB0byBzdG9yZSwgY2FsY3VsYXRlLAovLyBhbmQgcHJpbnQgb3V0IGEgc2ltcGxlIHJlcG9ydCBvZiBpbnB1dHRlZCBhbmQgY2FsY3VsYXRlZAovLyB2YWx1ZXMuCi8vCi8vCi8vIE9iamVjdCBPcmllbnRlZCBEZXNpZ24gKHVzaW5nIEMrKykKLy8KLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKI2luY2x1ZGUgPHN0ZGlvLmg+ICAvLyBzdGQ6OnNldHByZWNpc2lvbiwgc3RkOjpzZXR3CiNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gc3RkOjpjb3V0LCBzdGQ6OmZpeGVkCiNpbmNsdWRlIDxjdHlwZS5oPiAgIC8vIHN0cmluZyBmdW5jdGlvbnMKCi8vIGRlZmluZSBjb25zdGFudHMKI2RlZmluZSBTVERfSE9VUlMgNDAuMAojZGVmaW5lIE9UX1JBVEUgMS41CiNkZWZpbmUgTUFfVEFYX1JBVEUgMC4wNQojZGVmaW5lIE5IX1RBWF9SQVRFIDAuMAojZGVmaW5lIFZUX1RBWF9SQVRFIDAuMDYKI2RlZmluZSBDQV9UQVhfUkFURSAwLjA3CiNkZWZpbmUgREVGQVVMVF9UQVhfUkFURSAwLjA4CiNkZWZpbmUgTkFNRV9TSVpFIDIwCiNkZWZpbmUgVEFYX1NUQVRFX1NJWkUgMwojZGVmaW5lIEZFRF9UQVhfUkFURSAwLjI1CiNkZWZpbmUgRklSU1RfTkFNRV9TSVpFIDEwCiNkZWZpbmUgTEFTVF9OQU1FX1NJWkUgMTAKIAojZGVmaW5lIEVNUF9TSVpFIDUKCi8vIEVtcGxveWVlIHN0cnVjdHVyZQpzdHJ1Y3QgRW1wbG95ZWUKewogICAgY2hhciBmaXJzdE5hbWVbMjBdOwogICAgY2hhciBsYXN0TmFtZVsyMF07CiAgICBjaGFyIHRheFN0YXRlWzNdOwogICAgaW50IGNsb2NrTnVtYmVyOwogICAgZmxvYXQgd2FnZVJhdGU7CiAgICBmbG9hdCBob3VyczsKICAgIGZsb2F0IG92ZXJUaW1lSHJzOwogICAgZmxvYXQgZ3Jvc3NQYXk7CiAgICBmbG9hdCBzdGF0ZVRheDsKICAgIGZsb2F0IGZlZFRheDsKICAgIGZsb2F0IG5ldFBheTsKfTsKCi8vIGZ1bmN0aW9uIHByb3RvdHlwZXMKZmxvYXQgY2FsY092ZXJUaW1lSHJzKGZsb2F0IGhvdXJzKTsKZmxvYXQgY2FsY0dyb3NzUGF5KGZsb2F0IHdhZ2VSYXRlLCBmbG9hdCBob3VycywgZmxvYXQgb3ZlclRpbWVIcnMpOwpmbG9hdCBjYWxjU3RhdGVUYXgoZmxvYXQgZ3Jvc3NQYXksIGNoYXIgdGF4U3RhdGVbXSk7CmZsb2F0IGNhbGNGZWRUYXgoZmxvYXQgZ3Jvc3NQYXkpOwpmbG9hdCBjYWxjTmV0UGF5KGZsb2F0IGdyb3NzUGF5LCBmbG9hdCBzdGF0ZVRheCwgZmxvYXQgZmVkVGF4KTsKdm9pZCBwcmludEVtcGxveWVlKHN0cnVjdCBFbXBsb3llZSBlKTsKCi8vIGNhbGN1bGF0ZSBvdmVydGltZQpmbG9hdCBjYWxjT3ZlclRpbWVIcnMoZmxvYXQgaG91cnMpCnsKICAgIGlmIChob3VycyA+IFNURF9IT1VSUykKICAgICAgICByZXR1cm4gaG91cnMgLSBTVERfSE9VUlM7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIDAuMDsKfQoKLy8gY2FsY3VsYXRlIGdyb3NzIHBheQpmbG9hdCBjYWxjR3Jvc3NQYXkoZmxvYXQgd2FnZVJhdGUsIGZsb2F0IGhvdXJzLCBmbG9hdCBvdmVyVGltZUhycykKewogICAgaWYgKG92ZXJUaW1lSHJzID4gMCkKICAgIHsKICAgICAgICByZXR1cm4gKFNURF9IT1VSUyAqIHdhZ2VSYXRlKSArCiAgICAgICAgICAgICAgIChvdmVyVGltZUhycyAqIHdhZ2VSYXRlICogT1RfUkFURSk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcmV0dXJuIHdhZ2VSYXRlICogaG91cnM7CiAgICB9Cn0KCi8vIGNhbGN1bGF0ZSBzdGF0ZSB0YXgKZmxvYXQgY2FsY1N0YXRlVGF4KGZsb2F0IGdyb3NzUGF5LCBjaGFyIHRheFN0YXRlW10pCnsKICAgIGlmIChzdHJjbXAodGF4U3RhdGUsICJNQSIpID09IDApCiAgICAgICAgcmV0dXJuIGdyb3NzUGF5ICogTUFfVEFYX1JBVEU7CiAgICBlbHNlIGlmIChzdHJjbXAodGF4U3RhdGUsICJWVCIpID09IDApCiAgICAgICAgcmV0dXJuIGdyb3NzUGF5ICogVlRfVEFYX1JBVEU7CiAgICBlbHNlIGlmIChzdHJjbXAodGF4U3RhdGUsICJOSCIpID09IDApCiAgICAgICAgcmV0dXJuIGdyb3NzUGF5ICogTkhfVEFYX1JBVEU7CiAgICBlbHNlIGlmIChzdHJjbXAodGF4U3RhdGUsICJDQSIpID09IDApCiAgICAgICAgcmV0dXJuIGdyb3NzUGF5ICogQ0FfVEFYX1JBVEU7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuIGdyb3NzUGF5ICogREVGQVVMVF9UQVhfUkFURTsKfQoKLy8gY2FsY3VsYXRlIGZlZGVyYWwgdGF4CmZsb2F0IGNhbGNGZWRUYXgoZmxvYXQgZ3Jvc3NQYXkpCnsKICAgIHJldHVybiBncm9zc1BheSAqIEZFRF9UQVhfUkFURTsKfQoKLy8gY2FsY3VsYXRlIG5ldCBwYXkKZmxvYXQgY2FsY05ldFBheShmbG9hdCBncm9zc1BheSwgZmxvYXQgc3RhdGVUYXgsIGZsb2F0IGZlZFRheCkKewogICAgcmV0dXJuIGdyb3NzUGF5IC0gc3RhdGVUYXggLSBmZWRUYXg7Cn0KCi8vIHByaW50IGVtcGxveWVlIHJlcG9ydAp2b2lkIHByaW50RW1wbG95ZWUoc3RydWN0IEVtcGxveWVlIGUpCnsKICAgIHByaW50ZigiXG5cbioqKiBFbnRlcmVkIERldGFpbHMgYXJlICoqKiBcbiIpOwoKICAgIHByaW50ZigiXG4gRmlyc3QgTmFtZTogJXMiLCBlLmZpcnN0TmFtZSk7CiAgICBwcmludGYoIlxuIExhc3QgTmFtZTogJXMiLCBlLmxhc3ROYW1lKTsKICAgIHByaW50ZigiXG4gVGF4IFN0YXRlOiAlcyIsIGUudGF4U3RhdGUpOwogICAgcHJpbnRmKCJcbiBDbG9jayBOdW1iZXI6ICVkIiwgZS5jbG9ja051bWJlcik7CiAgICBwcmludGYoIlxuIFdhZ2UgUmF0ZTogJS4yZiIsIGUud2FnZVJhdGUpOwogICAgcHJpbnRmKCJcbiBIb3VyczogJS4yZiIsIGUuaG91cnMpOwoKICAgIHByaW50ZigiXG5cbiAqKiogQ2FsY3VsYXRlZCBWYWx1ZXMgYXJlICoqKiBcbiIpOwoKICAgIHByaW50ZigiXG4gT3ZlcnRpbWUgSG91cnMgOiAlLjJmIiwgZS5vdmVyVGltZUhycyk7CiAgICBwcmludGYoIlxuIEdyb3NzIFBheSA6ICQlLjJmIiwgZS5ncm9zc1BheSk7CiAgICBwcmludGYoIlxuIFN0YXRlIFRheCA6ICQlLjJmIiwgZS5zdGF0ZVRheCk7CiAgICBwcmludGYoIlxuIEZlZGVyYWwgVGF4IDogJCUuMmYiLCBlLmZlZFRheCk7CiAgICBwcmludGYoIlxuIE5ldCBQYXkgOiAkJS4yZiIsIGUubmV0UGF5KTsKCiAgICBwcmludGYoIlxuXG4iKTsKfQoKLy8gbWFpbiBmdW5jdGlvbgppbnQgbWFpbigpCnsKICAgIHN0cnVjdCBFbXBsb3llZSBlW0VNUF9TSVpFXTsKICAgIGludCBpLCBqOwoKICAgIC8vIHByb2Nlc3MgNSBlbXBsb3llZXMKICAgIGZvciAoaSA9IDA7IGkgPCBFTVBfU0laRTsgaSsrKQogICAgewogICAgICAgIHByaW50ZigiXG5cbiBFbnRlciBFbXBsb3llZSBGaXJzdCBOYW1lOiAiKTsKICAgICAgICBzY2FuZigiJTE5cyIsIGVbaV0uZmlyc3ROYW1lKTsKCiAgICAgICAgcHJpbnRmKCJcbiBFbnRlciBFbXBsb3llZSBMYXN0IE5hbWU6ICIpOwogICAgICAgIHNjYW5mKCIlMTlzIiwgZVtpXS5sYXN0TmFtZSk7CgogICAgICAgIHByaW50ZigiXG4gRW50ZXIgRW1wbG95ZWUgVGF4IFN0YXRlOiAiKTsKICAgICAgICBzY2FuZigiJTJzIiwgZVtpXS50YXhTdGF0ZSk7CgogICAgICAgIC8vIGNvbnZlcnQgdGF4IHN0YXRlIHRvIHVwcGVyY2FzZQogICAgICAgIGZvciAoaiA9IDA7IGVbaV0udGF4U3RhdGVbal0gIT0gJ1wwJzsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgZVtpXS50YXhTdGF0ZVtqXSA9IHRvdXBwZXIoZVtpXS50YXhTdGF0ZVtqXSk7CiAgICAgICAgfQoKICAgICAgICBwcmludGYoIlxuIEVudGVyIEVtcGxveWVlIENsb2NrIE51bWJlcjogIik7CiAgICAgICAgc2NhbmYoIiVkIiwgJmVbaV0uY2xvY2tOdW1iZXIpOwoKICAgICAgICBwcmludGYoIlxuIEVudGVyIEVtcGxveWVlIEhvdXJseSBXYWdlIFJhdGU6ICIpOwogICAgICAgIHNjYW5mKCIlZiIsICZlW2ldLndhZ2VSYXRlKTsKCiAgICAgICAgcHJpbnRmKCJcbiBFbnRlciBFbXBsb3llZSBIb3VycyBXb3JrZWQgZm9yIHRoZSBXZWVrOiAiKTsKICAgICAgICBzY2FuZigiJWYiLCAmZVtpXS5ob3Vycyk7CgogICAgICAgIC8vIGNhbGN1bGF0aW9ucwogICAgICAgIGVbaV0ub3ZlclRpbWVIcnMgPSBjYWxjT3ZlclRpbWVIcnMoZVtpXS5ob3Vycyk7CiAgICAgICAgZVtpXS5ncm9zc1BheSA9IGNhbGNHcm9zc1BheShlW2ldLndhZ2VSYXRlLCBlW2ldLmhvdXJzLCBlW2ldLm92ZXJUaW1lSHJzKTsKICAgICAgICBlW2ldLnN0YXRlVGF4ID0gY2FsY1N0YXRlVGF4KGVbaV0uZ3Jvc3NQYXksIGVbaV0udGF4U3RhdGUpOwogICAgICAgIGVbaV0uZmVkVGF4ID0gY2FsY0ZlZFRheChlW2ldLmdyb3NzUGF5KTsKICAgICAgICBlW2ldLm5ldFBheSA9IGNhbGNOZXRQYXkoZVtpXS5ncm9zc1BheSwgZVtpXS5zdGF0ZVRheCwgZVtpXS5mZWRUYXgpOwoKICAgICAgICAvLyBkaXNwbGF5IHJlcG9ydAogICAgICAgIHByaW50RW1wbG95ZWUoZVtpXSk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0=