CIS 250 - Control break report

Data file needed for assignment: cb1data.txt. Data file is also located on remote server at: ~dklick/examples/cb1data.txt

Objectives

Overview

This assignment involves the creation of a level break report. The data file provided has already been put into the proper sorted order. The format of each record is as follows:

Requirements

Your task is to read the records in from the data file (cb1data.txt) and produce a report to a file named cbreport.txt.

Although the following technique is "brittle", you may read the data from the input file using the standard input extraction operator. For example, if you wanted to read one whole record in one statement and had the appropriate variables declared, you could write:
infile >> dept >> empID >> month >> day >> year >> hours;

A "priming read" is well-suited for this type of algorithm. A priming read makes a read from input just before a while loop starts, and then has the same read just before the end of the loop body. That type of read works very well when reading from a text file and checking for end-of-file. Instead of trying to read all of the fields from a single record though, it is better to just use the first field for the priming read, and read the remainder of the fields for that record as the first line within the loop. Example:

    infile >> dept;
    while (infile) {
        infile >> empID >> month >> day >> year >> hours;
        ... other processing code ...
        infile >> dept;
    }

The report you produce should match the sample report exactly, including ALL formatting and spacing. A sample of the report is available on the remote server at: ~dklick/examples/cbreport250.txt. You can compare your output file to the reference outout file using the following command:
diff report.txt ~dklick/examples/cbreport250.txt
That command will display differences between the two files. If there are no differences, then your report is correct.

You have been given an algorithm to implement. There are some ambiguities to simulate a real life situation - but no errors that the instructor is aware of. You are required to use ostream manipulators (left, right, setw, setprecision, fixed, showpoint, etc.) to get the correct output formatting for this project.

Sample Output

Daily hours worked by Department by Employee

Dept EmpID     Date     Hours

 IT  D4772   1/02/2011   8.25
 IT  D4772   1/03/2011   7.00
 IT  D4772   1/05/2011   9.25
 IT  D4772   1/06/2011   9.00
 IT  D4772   1/08/2011   7.25
Employee total          40.75

 IT  F9642   1/04/2011   8.25
 IT  F9642   1/06/2011   7.25
 IT  F9642   1/07/2011   5.25
 IT  F9642   1/08/2011   8.00
Employee total          28.75

 IT  V1001   1/03/2011   5.25
 IT  V1001   1/04/2011   8.50
 IT  V1001   1/05/2011   6.75
 IT  V1001   1/06/2011   6.75
 IT  V1001   1/07/2011   8.00
 IT  V1001   1/08/2011   6.00
Employee total          41.25

Department total       110.75

MGT  A0010   1/02/2011   6.50
MGT  A0010   1/03/2011   8.25
MGT  A0010   1/04/2011   9.25
MGT  A0010   1/05/2011   9.75
MGT  A0010   1/06/2011   5.50
MGT  A0010   1/07/2011   8.75
MGT  A0010   1/08/2011   8.75
Employee total          56.75

MGT  S0812   1/04/2011   5.25
MGT  S0812   1/05/2011   7.75
MGT  S0812   1/06/2011   7.25
MGT  S0812   1/07/2011   6.00
MGT  S0812   1/08/2011   9.50
Employee total          35.75

Department total        92.50

MKT  H6554   1/02/2011   9.25
MKT  H6554   1/03/2011   8.00
MKT  H6554   1/04/2011   5.75
MKT  H6554   1/05/2011   8.75
MKT  H6554   1/06/2011   8.50
MKT  H6554   1/08/2011   6.00
Employee total          46.25

Department total        46.25

MNT  E5109   1/02/2011   8.75
MNT  E5109   1/03/2011   5.50
MNT  E5109   1/04/2011   6.00
MNT  E5109   1/06/2011   5.00
MNT  E5109   1/08/2011   6.50
Employee total          31.75

Department total        31.75

MSC  E4100   1/03/2011   5.75
MSC  E4100   1/04/2011   8.75
MSC  E4100   1/05/2011   7.25
MSC  E4100   1/07/2011   6.50
MSC  E4100   1/08/2011   8.75
Employee total          37.00

Department total        37.00

PRD  A0132   1/04/2011   9.00
PRD  A0132   1/05/2011   8.00
PRD  A0132   1/06/2011   8.75
PRD  A0132   1/07/2011   9.00
PRD  A0132   1/08/2011   5.00
Employee total          39.75

PRD  E1231   1/02/2011   6.75
PRD  E1231   1/03/2011   8.25
PRD  E1231   1/04/2011   6.75
PRD  E1231   1/06/2011   8.00
PRD  E1231   1/07/2011   5.50
PRD  E1231   1/08/2011   7.25
Employee total          42.50

PRD  E1250   1/02/2011   9.75
PRD  E1250   1/03/2011   7.75
PRD  E1250   1/04/2011   7.75
PRD  E1250   1/05/2011   7.50
Employee total          32.75

Department total       115.00

SLS  L1776   1/02/2011   9.00
SLS  L1776   1/03/2011   7.75
SLS  L1776   1/04/2011   6.75
SLS  L1776   1/06/2011   5.50
SLS  L1776   1/08/2011   8.75
Employee total          37.75

SLS  M5205   1/02/2011   7.00
SLS  M5205   1/03/2011   5.00
SLS  M5205   1/04/2011   7.75
SLS  M5205   1/05/2011   6.00
SLS  M5205   1/06/2011   7.75
SLS  M5205   1/07/2011   5.25
SLS  M5205   1/08/2011   8.25
Employee total          47.00

Department total        84.75

Total hours worked     518.00

70 records processed

Pseudocode

To make life even easier for you, here's the pseudocode for your program:

open input file for sequential access
open output (report) file
print headings to report file

totHours = empHours = deptHours = 0
prevID = prevDept = "$$$"
recno = 0

while there are still more records in the input file
    get the next record from the input file
    recno = recno + 1
    if record's dept is different than prevDept and recno > 1
        // employee level break
        print employee's total hours to output file
        add empHours to deptHours
        empHours = 0
        // department level break
        print department's total hours to output file
        add deptHours to totHours
        deptHours = 0
    otherwise if record's employee id is different than prevID and recno > 1
        // employee level break
        print employee's total hours to output file
        add empHours to deptHours
        empHours = 0
    print formatted record detail to output file
    add record's hours to empHours
    prevID = record's employee id
    prevDept = record's department

close input file

// employee level break
print employee's total hours to output file
add empHours to deptHours
empHours = 0

// department level break
print department's total hours to output file
add deptHours to totHours
deptHours = 0

print grand totals to output file
print footers to output file
close output file
end

Rubric

  1. 3 points for comments at the start of the source code which contain program name, student name, assignment, date, course, and a brief program description
  2. 2 points for correctly following coding conventions (indentation, naming rules, NO tabs, etc.)
  3. 5 points for correctly reading the input (data) file
  4. 5 points for correctly writing to the output (report) file
  5. 10 points for having the report formatting match exactly using ostream manipulators
  6. 25 points for correctly implementing the algorithm given in this assignment