M7 Written Assignment - Case Study Expand the payroll program to combine two sor
ID: 3852110 • Letter: M
Question
M7 Written Assignment - Case Study
Expand the payroll program to combine two sorting techniques (Selection and Exchange sorts) for better efficiency in sorting the employee’s net pay.
//I need to use an EXSEL sort in order to combine the selection and Exchange sorts for my program. I currently have a selection sort in there. Please help me with replacing this with the EXSEL sort.
//My input files:
//My current code with the sel sort. Please help me replace this with an EXSEL sort.
#include <fstream>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <climits>
using namespace std;
class payroll {
public:
ifstream fin;
long int employeeid;
char marital;
string firstname, lastname;
double hourlyrate, grosspay, netpay, taxrate, mtaxrate, taxamount, regpay, otpay;
float sumOfNetPay;
double count;
int hoursworked, othours;
void computetaxrate();
void computemtaxrate();
void computenetpay();
// POLYMORPHISM
virtual void computegp();
virtual void computeotp();
virtual void printheadings();
virtual void printdata();
virtual void printreport();
payroll();
~payroll();
};
payroll::payroll() {
fin.open("hpayroll.dat");
}//CONSTRUCTOR
payroll::~payroll() {
fin.close();
}//DESTRUCTOR
void payroll::computeotp() {
if (hoursworked > 40)
othours = hoursworked - 40;
else
othours = 0;
otpay = othours * (hourlyrate * 1.5);
if (hoursworked < 40)
otpay = 0;
}//COMPUTE ALL OVERTIME HOURS/PAY
void payroll::computegp() {
grosspay = (hoursworked * hourlyrate) + otpay;
regpay = (grosspay - otpay);
}//COMPUTE ALL THE GROSSPAYS
void payroll::computetaxrate() {
if (grosspay > 1000) taxrate = 0.30;
else if ((grosspay > 800) && (grosspay <= 1000)) taxrate = 0.20;
else if ((grosspay > 500) && (grosspay < 800)) taxrate = 0.10;
else if ((grosspay >= 0) && (grosspay <= 500)) taxrate = 0.0;
}//COMPUTE TAX RATES
void payroll::computemtaxrate() {
if (marital == 'S' || marital == 's') mtaxrate += 0.05;
else if (marital == 'H' || marital == 'h') mtaxrate -= 0.05;
else mtaxrate = taxrate;
}//COMPUTE MARTIAL TAX RATES
void payroll::computenetpay() {
taxamount = (grosspay * (taxrate + mtaxrate));
netpay = (grosspay - taxamount);
sumOfNetPay += netpay;
}//COMPUTE NET PAY AS WELL AS SUM OF NETPAYS
void payroll::printheadings() {
cout << setw(45) << "-PAYROLL REPORT-" << endl;
cout << "---------------------------------------------------------------------------------------------------------"
<< endl;
cout << setw(15), setprecision(1), setiosflags(ios::fixed | ios::showpoint | ios::left);
cout << "EMP ID" << setw(14) << "MARTIAL STAT" << setw(12) << "FIRST NAME" << setw(12) << "LAST NAME"
<< setw(6) << "HW" << setw(6) << "HR" << setw(6) << "OTH" << setw(6) << "OTP" << setw(6) << "REGP" << setw(7)
<< "GROSS"
<< setw(6) << "TAX" << setw(6) << "NET" << endl;
cout << "---------------------------------------------------------------------------------------------------------"
<< endl;
}//PRINT HEADINGS
void payroll::printdata() {
cout << setw(15), setprecision(1), setiosflags(ios::fixed | ios::showpoint | ios::left);
cout << employeeid << setw(14) << marital << setw(12) << firstname << setw(12) << lastname
<< setw(6) << hoursworked << setw(6) << hourlyrate << setw(6) << othours << setw(6) << otpay << setw(6)
<< regpay << setw(7) << grosspay
<< setw(6) << taxamount << setw(6) << netpay << endl;
}//PRINT OUTPUTS
void payroll::printreport() {
int i = 0;
printheadings();
while (fin >> employeeid >> marital >> firstname >> lastname >> hoursworked >> hourlyrate) {
count++;
computeotp();
computegp();
computetaxrate();
computemtaxrate();
computenetpay();
printdata();
i++;
}//WHILE
}//PRINT REPORT
class spayroll : public payroll {
public:
double salary52;
spayroll(){};
void update(long int, char, string, string, double, int);
void printreport();
void computegp();
void computeotp();
void printdata();
void printheadings();
double get_netpay();
spayroll& operator = (const spayroll &obj) {
employeeid = obj.employeeid;
marital = obj.marital;
firstname = obj.firstname;
lastname = obj.lastname;
salary52 = obj.salary52;
hoursworked = obj.hoursworked;
netpay = obj.netpay;
othours = obj.othours;
hourlyrate = obj.hourlyrate;
grosspay = obj.grosspay;
netpay = obj.netpay;
taxrate = obj.taxrate;
mtaxrate = obj.mtaxrate;
taxamount = obj.taxamount;
regpay = obj.regpay;
otpay = obj.otpay;
sumOfNetPay = obj.sumOfNetPay;
count = obj.count;
}
};
void spayroll::update(long int eid, char ms, string f, string l, double s52, int h) {
employeeid = eid;
marital = ms;
firstname = f;
lastname = l;
salary52 = s52;
hoursworked = h;
}
// COMPUTE GROSS PAY FOR SALARY EMPLOYEE
void spayroll::computegp(){
regpay = salary52/52;
hourlyrate = regpay / 40;
grosspay = regpay + hourlyrate * hoursworked;
}
void spayroll::computeotp() {
otpay = hourlyrate * hoursworked;
}
void spayroll::printheadings() {
cout << setw(45) << "-PAYROLL REPORT-" << endl;
cout << "-----------------------------------------------------------------------------------------------------------------"
<< endl;
cout << setw(15), setprecision(1), setiosflags(ios::fixed | ios::showpoint | ios::left);
cout << "EMP ID" << setw(14) << "MARTIAL STAT" << setw(12) << "FIRST NAME" << setw(12) << "LAST NAME"
<< setw(10) << "HR" << setw(6) << "OTH" << setw(10) << "OTP" << setw(10) << "REGP" << setw(10)
<< "GROSS"
<< setw(10) << "TAX" << setw(10) << "NET" << endl;
cout << "-----------------------------------------------------------------------------------------------------------------"
<< endl;
}//PRINT HEADINGS
void spayroll::printdata() {
cout << setw(15), setprecision(1), setiosflags(ios::fixed | ios::showpoint | ios::left);
cout << employeeid << setw(14) << marital << setw(12) << firstname << setw(12) << lastname
<< setw(10) << hourlyrate << setw(6) << hoursworked << setw(10) << otpay << setw(10)
<< regpay << setw(10) << grosspay
<< setw(10) << taxamount << setw(10) << netpay << endl;
}//PRINT OUTPUTS
void spayroll::printreport() {
computegp();
computeotp();
computetaxrate();
computemtaxrate();
computenetpay();
printdata();
}//PRINT REPORT
double spayroll::get_netpay() {
return netpay;
}
// SELECTION SORT (please change to EXSEL SORT)
void selsort(spayroll a[], int n) {
int i,j,loc;
double min;
spayroll temp;
for(i=0;i<n-1;i++) {
min = a[i].get_netpay();
loc = i;
for(j=i+1; j<n; j++) {
if(min > a[j].get_netpay()) {
min = a[j].get_netpay();
loc = j;
}
}
temp = a[i];
a[i] = a[loc];
a[loc] = temp;
}
}
int main() {
payroll employee;
cout << "---------------------------------------FOR HOURLY BASED EMPLOYEES---------------------------------------" << endl;
employee.printreport();
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"Sum of Net Pay: "<<employee.sumOfNetPay<<endl;
cout<<"Average Net Pay: "<<employee.sumOfNetPay/employee.count<<endl;
ifstream fin;
long int employeeid;
char marital;
string firstname, lastname;
double salary52;
int hoursworked;
cout << "---------------------------------------FOR SALARY BASED EMPLOYEES---------------------------------------" << endl;
fin.open("spayroll.dat");
int i=0;
spayroll emp[5];
while (fin >> employeeid >> marital >> firstname >> lastname >> salary52 >> hoursworked) {
emp[i].update(employeeid, marital, firstname, lastname, salary52, hoursworked);
i++;
}
emp[0].printheadings();
for (int i=0;i<5; i++) {
emp[i].printreport();
}
float _min, _max;
_max = _min = emp[0].get_netpay();
// MIN AND MAX NETPAY FOR ALL EMPLOYEES
for (i=1; i<5; i++) {
double cur = emp[i].get_netpay();
if (cur < _min) _min = cur;
if (cur > _max) _max = cur;
}
cout<<" "<<endl;
cout<<" "<<endl;
cout << "Minimum netpay of all employees is: " << _min << endl;
cout << "Maximum netpay of all employees is: " << _max << endl;
cout << " SORTED EMPLOYEES BASED ON THEIR NET PAY ";
// SORT EMPLOYEES BASED ON NETPAY
selsort(emp, 5);
emp[0].printheadings();
for (int i=0;i<5; i++) {
emp[i].printdata();
}
}//MAIN
//Current Output
hpayroll.dat Notepad File Edit Format View Help 1225 S Saverio Smith 45 20 7995 s Michelle Smith 50 20 8716 m Santino Smith 35 30 1512 s Nicholas Smith 30 12 1513 M Julianna Smith 42 24Explanation / Answer
Actually the code is correct !
#include <fstream>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <climits>
using namespace std;
class payroll {
public:
ifstream fin;
long int employeeid;
char marital;
string firstname, lastname;
double hourlyrate, grosspay, netpay, taxrate, mtaxrate, taxamount, regpay, otpay;
float sumOfNetPay;
double count;
int hoursworked, othours;
void computetaxrate();
void computemtaxrate();
void computenetpay();
// POLYMORPHISM
virtual void computegp();
virtual void computeotp();
virtual void printheadings();
virtual void printdata();
virtual void printreport();
payroll();
~payroll();
};
payroll::payroll() {
fin.open("hpayroll.dat");
}//CONSTRUCTOR
payroll::~payroll() {
fin.close();
}//DESTRUCTOR
void payroll::computeotp() {
if (hoursworked > 40)
othours = hoursworked - 40;
else
othours = 0;
otpay = othours * (hourlyrate * 1.5);
if (hoursworked < 40)
otpay = 0;
}//COMPUTE ALL OVERTIME HOURS/PAY
void payroll::computegp() {
grosspay = (hoursworked * hourlyrate) + otpay;
regpay = (grosspay - otpay);
}//COMPUTE ALL THE GROSSPAYS
void payroll::computetaxrate() {
if (grosspay > 1000) taxrate = 0.30;
else if ((grosspay > 800) && (grosspay <= 1000)) taxrate = 0.20;
else if ((grosspay > 500) && (grosspay < 800)) taxrate = 0.10;
else if ((grosspay >= 0) && (grosspay <= 500)) taxrate = 0.0;
}//COMPUTE TAX RATES
void payroll::computemtaxrate() {
if (marital == 'S' || marital == 's') mtaxrate += 0.05;
else if (marital == 'H' || marital == 'h') mtaxrate -= 0.05;
else mtaxrate = taxrate;
}//COMPUTE MARTIAL TAX RATES
void payroll::computenetpay() {
taxamount = (grosspay * (taxrate + mtaxrate));
netpay = (grosspay - taxamount);
sumOfNetPay += netpay;
}//COMPUTE NET PAY AS WELL AS SUM OF NETPAYS
void payroll::printheadings() {
cout << setw(45) << "-PAYROLL REPORT-" << endl;
cout << "---------------------------------------------------------------------------------------------------------"
<< endl;
cout << setw(15), setprecision(1), setiosflags(ios::fixed | ios::showpoint | ios::left);
cout << "EMP ID" << setw(14) << "MARTIAL STAT" << setw(12) << "FIRST NAME" << setw(12) << "LAST NAME"
<< setw(6) << "HW" << setw(6) << "HR" << setw(6) << "OTH" << setw(6) << "OTP" << setw(6) << "REGP" << setw(7)
<< "GROSS"
<< setw(6) << "TAX" << setw(6) << "NET" << endl;
cout << "---------------------------------------------------------------------------------------------------------"
<< endl;
}//PRINT HEADINGS
void payroll::printdata() {
cout << setw(15), setprecision(1), setiosflags(ios::fixed | ios::showpoint | ios::left);
cout << employeeid << setw(14) << marital << setw(12) << firstname << setw(12) << lastname
<< setw(6) << hoursworked << setw(6) << hourlyrate << setw(6) << othours << setw(6) << otpay << setw(6)
<< regpay << setw(7) << grosspay
<< setw(6) << taxamount << setw(6) << netpay << endl;
}//PRINT OUTPUTS
void payroll::printreport() {
int i = 0;
printheadings();
while (fin >> employeeid >> marital >> firstname >> lastname >> hoursworked >> hourlyrate) {
count++;
computeotp();
computegp();
computetaxrate();
computemtaxrate();
computenetpay();
printdata();
i++;
}//WHILE
}//PRINT REPORT
class spayroll : public payroll {
public:
double salary52;
spayroll(){};
void update(long int, char, string, string, double, int);
void printreport();
void computegp();
void computeotp();
void printdata();
void printheadings();
double get_netpay();
spayroll& operator = (const spayroll &obj) {
employeeid = obj.employeeid;
marital = obj.marital;
firstname = obj.firstname;
lastname = obj.lastname;
salary52 = obj.salary52;
hoursworked = obj.hoursworked;
netpay = obj.netpay;
othours = obj.othours;
hourlyrate = obj.hourlyrate;
grosspay = obj.grosspay;
netpay = obj.netpay;
taxrate = obj.taxrate;
mtaxrate = obj.mtaxrate;
taxamount = obj.taxamount;
regpay = obj.regpay;
otpay = obj.otpay;
sumOfNetPay = obj.sumOfNetPay;
count = obj.count;
}
};
void spayroll::update(long int eid, char ms, string f, string l, double s52, int h) {
employeeid = eid;
marital = ms;
firstname = f;
lastname = l;
salary52 = s52;
hoursworked = h;
}
// COMPUTE GROSS PAY FOR SALARY EMPLOYEE
void spayroll::computegp(){
regpay = salary52/52;
hourlyrate = regpay / 40;
grosspay = regpay + hourlyrate * hoursworked;
}
void spayroll::computeotp() {
otpay = hourlyrate * hoursworked;
}
void spayroll::printheadings() {
cout << setw(45) << "-PAYROLL REPORT-" << endl;
cout << "-----------------------------------------------------------------------------------------------------------------"
<< endl;
cout << setw(15), setprecision(1), setiosflags(ios::fixed | ios::showpoint | ios::left);
cout << "EMP ID" << setw(14) << "MARTIAL STAT" << setw(12) << "FIRST NAME" << setw(12) << "LAST NAME"
<< setw(10) << "HR" << setw(6) << "OTH" << setw(10) << "OTP" << setw(10) << "REGP" << setw(10)
<< "GROSS"
<< setw(10) << "TAX" << setw(10) << "NET" << endl;
cout << "-----------------------------------------------------------------------------------------------------------------"
<< endl;
}//PRINT HEADINGS
void spayroll::printdata() {
cout << setw(15), setprecision(1), setiosflags(ios::fixed | ios::showpoint | ios::left);
cout << employeeid << setw(14) << marital << setw(12) << firstname << setw(12) << lastname
<< setw(10) << hourlyrate << setw(6) << hoursworked << setw(10) << otpay << setw(10)
<< regpay << setw(10) << grosspay
<< setw(10) << taxamount << setw(10) << netpay << endl;
}//PRINT OUTPUTS
void spayroll::printreport() {
computegp();
computeotp();
computetaxrate();
computemtaxrate();
computenetpay();
printdata();
}//PRINT REPORT
double spayroll::get_netpay() {
return netpay;
}
// SELECTION SORT (please change to EXSEL SORT)
void selsort(spayroll a[], int n) {
int i,j,loc;
double min;
spayroll temp;
for(i=0;i<n-1;i++) {
min = a[i].get_netpay();
loc = i;
for(j=i+1; j<n; j++) {
if(min > a[j].get_netpay()) {
min = a[j].get_netpay();
loc = j;
}
}
temp = a[i];
a[i] = a[loc];
a[loc] = temp;
}
}
int main() {
payroll employee;
cout << "---------------------------------------FOR HOURLY BASED EMPLOYEES---------------------------------------" << endl;
employee.printreport();
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"Sum of Net Pay: "<<employee.sumOfNetPay<<endl;
cout<<"Average Net Pay: "<<employee.sumOfNetPay/employee.count<<endl;
ifstream fin;
long int employeeid;
char marital;
string firstname, lastname;
double salary52;
int hoursworked;
cout << "---------------------------------------FOR SALARY BASED EMPLOYEES---------------------------------------" << endl;
fin.open("spayroll.dat");
int i=0;
spayroll emp[5];
while (fin >> employeeid >> marital >> firstname >> lastname >> salary52 >> hoursworked) {
emp[i].update(employeeid, marital, firstname, lastname, salary52, hoursworked);
i++;
}
emp[0].printheadings();
for (int i=0;i<5; i++) {
emp[i].printreport();
}
float _min, _max;
_max = _min = emp[0].get_netpay();
// MIN AND MAX NETPAY FOR ALL EMPLOYEES
for (i=1; i<5; i++) {
double cur = emp[i].get_netpay();
if (cur < _min) _min = cur;
if (cur > _max) _max = cur;
}
cout<<" "<<endl;
cout<<" "<<endl;
cout << "Minimum netpay of all employees is: " << _min << endl;
cout << "Maximum netpay of all employees is: " << _max << endl;
cout << " SORTED EMPLOYEES BASED ON THEIR NET PAY ";
// SORT EMPLOYEES BASED ON NETPAY
selsort(emp, 5);
emp[0].printheadings();
for (int i=0;i<5; i++) {
emp[i].printdata();
}
}//MAIN
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.