// commis.cpp
// commis.cpp
// Programmer: Bill McQuain
// Platform: IBM ThinkPad P75
// Compiler: MS Visual C++ v4.0
// Last modified: October 15, 1996
// Last modified: October 15, 1996
// Calculates sales commissions. The deal is that a salesperson in category
// 1 gets:
// 1 gets:
// 1) a base salary of $1000 per month
// 2) a monthly commission of 8% of all sales if s/he sells at least
// $5000 but less than $30000
// 3) a monthly commission of 15% of all sales if s/he sells at least
// $30000
// $30000
// A salesperson in category 2 gets:
// A salesperson in category 2 gets:
// 1) a base salary of $0 per month
// 2) a monthly commission of 10% of all sales if s/he sells at least
// $2000 but less than $20000
// 3) a monthly commission of 30% of all sales if s/he sells at least
// $20000
// $20000
// The program reads lines of input from a file called "sales.dat".
// Each input line contains a 4-digit employee ID number, the salesperson's
// category, and the amount of sales by that employee in the current month.
// category, and the amount of sales by that employee in the current month.
// Output includes the employee ID number, base salary, commission, and
// total salary for each employee, in labeled columns. The maximum,
// minimum and average total salaries are reported.
// minimum and average total salaries are reported.
#include <fstream.h>
#include <iomanip.h>
void main() {
const float BaseSalary1 = 1000.0f; // category 1 base salary,
const float HiRate1 = 0.15f; // high commission rate,
const float LoRate1 = 0.08f; // low commission rate,
const float BaseSalary2 = 0.0f; // category 2 base salary,
const float HiRate2 = 0.30f; // high commission rate,
const float LoRate2 = 0.10f; // low commission rate
const float HiSales1 = 30000.0f; // category 1 high sales level
const float LoSales1 = 5000.0f; // satisfactory sales level
const float HiSales2 = 20000.0f; // category 2 high sales level
const float LoSales2 = 2000.0f; // satisfactory sales level
float Sales, // monthly sales for current employee
Commission, // commission for current employee
BaseSalary, // base salary for current employee
TotalSalary; // total salary for current employee
float MaxSalary = 0.0f, // maximum salary of all employees
MinSalary = 20000.0f, // miminum salary of all employees
// I'm assuming no one will make more
// than $20000 in a month
SumSalaries = 0.0f, // sum of all total salaries
AvgSalary; // average of all total salaries
int NumSalesPeople = 0, // number of employees considered
EmployeeID, // ID number of current employee
Category; // category of current employee
ifstream insales; // input file stream
ofstream comm; // output file stream
insales.open("sales.dat"); // open input and output files
comm.open("comm.dat");
comm.setf(ios::fixed, ios::floatfield); // turn on manipulators
comm.setf(ios::showpoint);
//////////////////////////////////////////////////////////////////////////
// Print file header:
// Print file header:
comm << "ACME Corporation Sales Staff Compensation"
comm << endl << endl;
comm << " ID Sales Base Commission Total"
comm << endl;
comm << "------------------------------------------------------"
comm << endl;
//////////////////////////////////////////////////////////////////////////
// Try to read first line of input file:
// Try to read first line of input file:
insales >> EmployeeID >> Category>> Sales;
//////////////////////////////////////////////////////////////////////////
// Process input file until all lines have been read:
// Process input file until all lines have been read:
while (insales) {
NumSalesPeople++; // count number of employees read
//////////////////////////////////////////////////////////////////
// Determine employee category and calculate base salary and
// commission accordingly:
switch (Category) {
case 1: {if (Sales < LoSales1)
Commission = 0.0f;
else if (Sales < HiSales1)
Commission = LoRate1 * Sales;
else
Commission = HiRate1 * Sales;
BaseSalary = BaseSalary1;
break;
}
case 2: {if (Sales < LoSales2)
Commission = 0.0f;
else if (Sales < HiSales2)
Commission = LoRate2 * Sales;
else
Commission = HiRate2 * Sales;
BaseSalary = BaseSalary2;
break;
}
default:{comm << setw(4) << EmployeeID;
comm << " has invalid category!" << endl;
Commission = 0.0f;
BaseSalary = 0.0f;
}
}
// calculate total salary
TotalSalary = BaseSalary + Commission;
//////////////////////////////////////////////////////////////////
// Check for new minimum and/or maximum salary:
// Check for new minimum and/or maximum salary:
if (TotalSalary < MinSalary) MinSalary = TotalSalary;
if (TotalSalary > MaxSalary) MaxSalary = TotalSalary;
//////////////////////////////////////////////////////////////////
// Keep running total of salaries (for averaging later):
// Keep running total of salaries (for averaging later):
SumSalaries += TotalSalary;
//////////////////////////////////////////////////////////////////
// Print out data for current employee:
// Print out data for current employee:
comm << EmployeeID;
comm << setw(12) << setprecision(2) << Sales;
comm << setw(12) << setprecision(2) << BaseSalary;
comm << setw(15) << setprecision(2) << Commission;
comm << setw(11) << setprecision(2) << TotalSalary;
comm << endl;
//////////////////////////////////////////////////////////////////
// Try to read another line of input from file:
// Try to read another line of input from file:
insales >> EmployeeID >> Category >> Sales;
}
//////////////////////////////////////////////////////////////////////
// Print out minimum and maximum salaries:
// Print out minimum and maximum salaries:
comm << endl;
comm << "Minimum salary: "
comm << setw(12) << setprecision(2) << MinSalary;
comm << endl;
comm << "Maximum salary: "
comm << setw(12) << setprecision(2) << MaxSalary;
comm << endl;
//////////////////////////////////////////////////////////////////////
// Calculate and print out the average salary. Be careful to guard
// against a possible division by zero.
// against a possible division by zero.
comm << "Average salary: "
if (NumSalesPeople > 0)
AvgSalary = SumSalaries / NumSalesPeople;
else
AvgSalary = 0.0f;
comm << setw(12) << setprecision(2) << AvgSalary;
//////////////////////////////////////////////////////////////////////
// Close input and output files:
// Close input and output files:
insales.close();
comm.close();
}