Hello guys and good evening!
The problem that I have been having with my code is that my totals and averages do not show the correct values that they should be! Everything else in my program works so far, the check headers, QSort, formatting for employee data, and displaying correct information entered for everything else.
You can see the program in action here:
Part 1
Part 2
Part 3
Part 4
I changed the order of which the information is stored, since payrate and hours were accidentally the opposite way. Also bumped up my print totals and print averages before the print checks.
Now without further ado, my source code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
typedef short BOOLEAN;
typedef char STR15[15 + 1];
typedef char STR10[10 + 1];
typedef struct PayRecord
{
STR15 LastName;
STR10 FirstName;
float hours, payrate, deferred, gross, fedtax, statetax, ssitax, net;
float reghrs, ovthrs;
float totreg, totovt, totrate, totgross, totfed, totstate, totssi, totdefr, totnet;
} PayRecord;
#define FEDTAXRATE 0.15
#define STATETAXRATE 0.07
#define SSITAXRATE 0.0775
#define MAXEMPLOYEES 5
#define TRUE 1
#define FALSE 0
#define HEADLINE1 "Employee Pay Reg Hrs Gross Fed SSI Net\n"
#define HEADLINE2 "Name Rate Ovt Hrs Pay State Defr Pay\n"
#define HEADLINE3 "========= ====== ======= ======= ======= ====== =======\n"
#define EMPLOYEEREPORT "%-16s %5.2f %5.2f %7.2f %6.2f %6.2f %7.2f\n"
#define EMPLOYEEREPORT2 " %5.2f %6.2f %6.2f\n\n"
#define BREAK "==============================================================\n"
#define TOTALS1 "Totals %5.2f %6.2f %6.2f %6.2f %6.2f %7.2f\n"
#define TOTALS2 " %6.2f %5.2f %6.2f\n\n"
#define AVERAGES1 "Averages %5.2f %6.2f %5.2f %6.2f %6.2f %7.2f\n"
#define AVERAGES2 " %6.2f %5.2f %6.2f\n\n"
#define BLANK "* *\n"
#define BORDER "************************************************************\n"
#define HEADER "* Check No %3d *\n"
#define HEADER2 "* Sabre Corporation *\n"
#define HEADER3 "* 15790 West Henness lane *\n"
#define HEADER4 "* New Corio, New Mexico 65790 *\n"
#define HEADER5 "* Pay to the Order of *\n"
#define HEADER6 "* %-16s *\n"
#define HEADER7 "* The Sum Nine Hundred Ninety-Nine and XX/100 Dollars *\n"
#define HEADER8 "* Reference: %-16s *\n"
#define STUB "* Check No %3d *\n"
#define STUB2 "* %-16s Reg Pay Fed Tax *\n"
#define STUB3 "* Address Ovt Pay State Tax *\n"
#define STUB4 "* City, State Gross Pay SSI Tax *\n"
#define STUB5 "* Zip Net Pay Tax Total *\n"
void PrintHeadings(FILE *reportFile)
{
fprintf(reportFile, HEADLINE1);
fprintf(reportFile, HEADLINE2);
fprintf(reportFile, HEADLINE3);
}
void InitAccumulators(PayRecord EmployeeData[], int maxemployees)
{
EmployeeData[MAXEMPLOYEES - 1].totreg = 0;
EmployeeData[MAXEMPLOYEES - 1].totovt = 0;
EmployeeData[MAXEMPLOYEES - 1].totrate = 0;
EmployeeData[MAXEMPLOYEES - 1].totgross = 0;
EmployeeData[MAXEMPLOYEES - 1].totfed = 0;
EmployeeData[MAXEMPLOYEES - 1].totstate = 0;
EmployeeData[MAXEMPLOYEES - 1].totssi = 0;
EmployeeData[MAXEMPLOYEES - 1].totdefr = 0;
EmployeeData[MAXEMPLOYEES - 1].totnet = 0;
}
void InputEmployeeData(PayRecord EmployeeData[], int count)
{
printf("Please enter your first and last name: ");
scanf("%s%s", EmployeeData[count].FirstName, EmployeeData[count].LastName);
printf("Please enter hours, payrate, and deferred amount: ");
scanf("%f%f%f", &EmployeeData[count].hours, &EmployeeData[count].payrate, &EmployeeData[count].deferred);
printf("\n");
}
void QSortEmployee(PayRecord EmployeeData[], int start, int finish)
{
int left = start,
right = finish;
char * pivot = EmployeeData[(start + finish) / 2].LastName;
while (left < right)
{
while ((strcmp(EmployeeData[left].LastName, pivot) < 0) && (left < right))
{
left++;
}
while ((strcmp(EmployeeData[right].LastName, pivot) > 0) && (right > left))
{
right--;
}
if (left <= right)
{
PayRecord tempEmployee = EmployeeData[left];
EmployeeData[left] = EmployeeData[right];
EmployeeData[right] = tempEmployee;
left++;
right--;
}
}
if (start < finish)
{
QSortEmployee(EmployeeData, start, right);
}
if (left < finish)
{
QSortEmployee(EmployeeData, left, finish);
}
}
float CalculateGross(PayRecord EmployeeData[], int count)
{
return (EmployeeData[count].hours <= 40) ? EmployeeData[count].hours * EmployeeData[count].payrate :
EmployeeData[count].payrate * 40 + (EmployeeData[count].hours - 40) * 1.5 * EmployeeData[count].payrate;
}
void CalculateHours(PayRecord EmployeeData[], int count)
{
if (EmployeeData[count].hours <= 40)
{
EmployeeData[count].reghrs = EmployeeData[count].hours;
EmployeeData[count].ovthrs = 0;
}
else
{
EmployeeData[count].reghrs = 40;
EmployeeData[count].ovthrs = (EmployeeData[count].hours - 40);
}
}
float CalculateNet(PayRecord EmployeeData[], int count)
{
return EmployeeData[count].gross - (EmployeeData[count].fedtax + EmployeeData[count].statetax + EmployeeData[count].ssitax + EmployeeData[count].deferred);
}
void AddAccumulators(PayRecord EmployeeData[], int count, int maxemployees)
{
EmployeeData[MAXEMPLOYEES - 1].totreg = EmployeeData[MAXEMPLOYEES - 1].totreg + EmployeeData[count].reghrs;
EmployeeData[MAXEMPLOYEES - 1].totovt = EmployeeData[MAXEMPLOYEES - 1].totovt + EmployeeData[count].ovthrs;
EmployeeData[MAXEMPLOYEES - 1].totrate = EmployeeData[MAXEMPLOYEES - 1].totrate + EmployeeData[count].payrate;
EmployeeData[MAXEMPLOYEES - 1].totgross = EmployeeData[MAXEMPLOYEES - 1].totgross + EmployeeData[count].gross;
EmployeeData[MAXEMPLOYEES - 1].totfed = EmployeeData[MAXEMPLOYEES - 1].totfed + EmployeeData[count].fedtax;
EmployeeData[MAXEMPLOYEES - 1].totstate = EmployeeData[MAXEMPLOYEES - 1].totstate + EmployeeData[count].statetax;
EmployeeData[MAXEMPLOYEES - 1].totssi = EmployeeData[MAXEMPLOYEES - 1].totssi + EmployeeData[count].ssitax;
EmployeeData[MAXEMPLOYEES - 1].totdefr = EmployeeData[MAXEMPLOYEES - 1].totdefr + EmployeeData[count].deferred;
EmployeeData[MAXEMPLOYEES - 1].totnet = EmployeeData[MAXEMPLOYEES - 1].totnet + EmployeeData[count].net;
}
void showReport(FILE *reportFile, char *FullName, PayRecord EmployeeData[], int count)
{
printf(HEADLINE1);
printf(HEADLINE2);
printf(HEADLINE3);
printf(EMPLOYEEREPORT, FullName, EmployeeData[count].payrate, EmployeeData[count].reghrs, EmployeeData[count].gross, EmployeeData[count].fedtax, EmployeeData[count].ssitax, EmployeeData[count].net);
printf(EMPLOYEEREPORT2, EmployeeData[count].ovthrs, EmployeeData[count].statetax, EmployeeData[count].deferred);
fprintf(reportFile, EMPLOYEEREPORT, FullName, EmployeeData[count].payrate, EmployeeData[count].reghrs, EmployeeData[count].gross, EmployeeData[count].fedtax, EmployeeData[count].ssitax, EmployeeData[count].net);
fprintf(reportFile, EMPLOYEEREPORT2, EmployeeData[count].ovthrs, EmployeeData[count].statetax, EmployeeData[count].deferred);
}
void printTotals(FILE *reportFile, PayRecord EmployeeData[], int maxemployees)
{
printf(BREAK);
printf(TOTALS1, EmployeeData[MAXEMPLOYEES - 1].totrate, EmployeeData[MAXEMPLOYEES - 1].totreg, EmployeeData[MAXEMPLOYEES - 1].totgross, EmployeeData[MAXEMPLOYEES - 1].totfed, EmployeeData[MAXEMPLOYEES - 1].totssi, EmployeeData[MAXEMPLOYEES - 1].totnet);
printf(TOTALS2, EmployeeData[MAXEMPLOYEES - 1].totovt, EmployeeData[MAXEMPLOYEES - 1].totstate, EmployeeData[MAXEMPLOYEES - 1].totdefr);
fprintf(reportFile, BREAK);
fprintf(reportFile, TOTALS1, EmployeeData[MAXEMPLOYEES - 1].totrate, EmployeeData[MAXEMPLOYEES - 1].totreg, EmployeeData[MAXEMPLOYEES - 1].totgross, EmployeeData[MAXEMPLOYEES - 1].totfed, EmployeeData[MAXEMPLOYEES - 1].totssi, EmployeeData[MAXEMPLOYEES - 1].totnet);
fprintf(reportFile, TOTALS2, EmployeeData[MAXEMPLOYEES - 1].totovt, EmployeeData[MAXEMPLOYEES - 1].totstate, EmployeeData[MAXEMPLOYEES - 1].totdefr);
}
void printAverages(FILE *reportFile, int maxemployees, PayRecord EmployeeData[])
{
printf(AVERAGES1, (EmployeeData[MAXEMPLOYEES - 1].totrate / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totreg / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totgross / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totfed / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totssi / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totnet / MAXEMPLOYEES));
printf(AVERAGES2, (EmployeeData[MAXEMPLOYEES - 1].totovt / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totstate / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totdefr / MAXEMPLOYEES));
fprintf(reportFile, AVERAGES1, (EmployeeData[MAXEMPLOYEES - 1].totrate / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totreg / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totgross / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totfed / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totssi / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totnet / MAXEMPLOYEES));
fprintf(reportFile, AVERAGES2, (EmployeeData[MAXEMPLOYEES - 1].totovt / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totstate / MAXEMPLOYEES), (EmployeeData[MAXEMPLOYEES - 1].totdefr / MAXEMPLOYEES));
}
float CalcFedtax(PayRecord EmployeeData[], int count)
{
return (EmployeeData[count].gross - EmployeeData[count].deferred)*FEDTAXRATE;
}
float CalcStatetax(PayRecord EmployeeData[], int count)
{
return EmployeeData[count].fedtax * STATETAXRATE;
}
float CalcSSItax(PayRecord EmployeeData[], int count)
{
return (EmployeeData[count].gross - EmployeeData[count].deferred)*SSITAXRATE;
}
void CalculateTaxes(PayRecord EmployeeData[], int count)
{
EmployeeData[count].fedtax = CalcFedtax(EmployeeData, count);
EmployeeData[count].statetax = CalcStatetax(EmployeeData, count);
EmployeeData[count].ssitax = CalcSSItax(EmployeeData, count);
}
void printCheckHeader(PayRecord EmployeeData[], char *CheckName, int chkNo, char *refCode, int count)
{
printf(BORDER);
printf(HEADER, chkNo);
printf(BLANK);
printf(HEADER2);
printf(HEADER3);
printf(HEADER4);
printf(BLANK);
printf(BLANK);
printf(HEADER5);
printf(BLANK);
printf(HEADER6, CheckName);
printf(BLANK);
printf(HEADER7);
printf(BLANK);
printf(BLANK);
printf(HEADER8, refCode);
printf(BLANK);
printf(BLANK);
printf(BORDER);
}
void printCheckStub(PayRecord EmployeeData[], char *CheckName, int chkNo, int count)
{
printf(STUB, chkNo);
printf(BLANK);
printf(STUB2, CheckName);
printf(STUB3);
printf(STUB4);
printf(STUB5);
printf(BLANK);
printf(BLANK);
printf(BORDER);
printf("\n");
}
BOOLEAN isVowel(char aChar)
{
switch (toupper(aChar))
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': return TRUE; break;
default: return FALSE;
}
}
char *generateRefCode(PayRecord EmployeeData[], int chkNo, int count)
{
static char tempStr[15 + 10 + 1];
char buffer[10 + 1];
int i, j = 1;
for (i = 0; i < 26; i++)
{
tempStr[i] = 0;
}
tempStr[0] = toupper(EmployeeData[count].LastName[0]);
for (i = 1; i < strlen(EmployeeData[count].LastName); i++)
{
if (!isVowel(EmployeeData[count].LastName[i]))
{
tempStr[j++] = toupper(EmployeeData[count].LastName[i]);
}
}
sprintf(buffer, "%d", chkNo);
strcat(tempStr, buffer);
tempStr[j + 3] = 0;
return tempStr;
}
int main(void)
{
PayRecord EmployeeData[MAXEMPLOYEES];
char FullName[15 + 10 + 1];
char CheckName[15 + 10 + 1];
char *refCode;
int count;
int chkNo = 100;
FILE *reportFile;
reportFile = fopen("./report.txt", "wt");
if (reportFile == NULL)
{
printf(" report file open failed ...\n");
fflush(stdin);
exit(-30);
}
PrintHeadings(reportFile);
InitAccumulators(EmployeeData, (MAXEMPLOYEES - 1));
for (count = 0; count < MAXEMPLOYEES; count++)
{
InputEmployeeData(EmployeeData, count);
}
QSortEmployee(EmployeeData, 0, (MAXEMPLOYEES - 1));
for (count = 0; count < MAXEMPLOYEES; count++)
{
strcpy(FullName, EmployeeData[count].LastName);
strcat(FullName, ", ");
strcat(FullName, EmployeeData[count].FirstName);
EmployeeData[count].gross = CalculateGross(EmployeeData, count);
CalculateHours(EmployeeData, count);
CalculateTaxes(EmployeeData, count);
EmployeeData[count].net = CalculateNet(EmployeeData, count);
AddAccumulators(EmployeeData, count, (MAXEMPLOYEES - 1));
showReport(reportFile, FullName, EmployeeData, count);
}
printTotals(reportFile, EmployeeData, (MAXEMPLOYEES - 1));
printAverages(reportFile, (MAXEMPLOYEES - 1), EmployeeData);
for (count = 0; count < MAXEMPLOYEES; count++)
{
refCode = generateRefCode(EmployeeData, chkNo, count);
strcpy(CheckName, EmployeeData[count].FirstName);
strcat(CheckName, " ");
strcat(CheckName, EmployeeData[count].LastName);
printCheckHeader(EmployeeData, CheckName, chkNo, refCode, count);
printCheckStub(EmployeeData, CheckName, chkNo, count);
chkNo++;
}
fclose(reportFile);
fflush(stdin);
getchar();
return 0;
}
Thanks for the help in advance!