SOURCE FILE: graph.cpp


//******************************************************************
// Graph program
// This program generates bar graphs of monthly sales
// by department for two Chippendale furniture stores, permitting
// department-by-department comparison of sales
//******************************************************************
#include <iostream>
#include <iomanip>    // For setw()
#include <fstream>    // For file I/O
#include <string>     // For string type

using namespace std;

void GetData( ifstream&, int&, float& );
void OpenForInput( ifstream& );
void PrintData( int, int, float );
void PrintHeading();

int main()
{
    int	     deptID1;	    // Department ID number for Store 1
    int	     deptID2;	    // Department ID number for Store 2
    float    sales1;	    // Department sales for Store 1
    float    sales2;	    // Department sales for Store 2
    ifstream store1;	    // Accounting file for Store 1
    ifstream store2;	    // Accounting file for Store 2

    cout << "For Store 1," << endl;
    OpenForInput(store1);
    cout << "For Store 2," << endl;
    OpenForInput(store2);
    if ( !store1 || !store2 )			 // Make sure files
	return 1;				 //   were opened

    PrintHeading();

    GetData(store1, deptID1, sales1);		 // Priming reads
    GetData(store2, deptID2, sales2);
    while (store1 && store2)			 // While not EOF...
    {
	cout << endl;
	PrintData(deptID1, 1, sales1);		 // Process Store 1
	PrintData(deptID2, 2, sales2);		 // Process Store 2
	GetData(store1, deptID1, sales1);
	GetData(store2, deptID2, sales2);
    }
    return 0;
}

//******************************************************************

void OpenForInput( /* inout */ ifstream& someFile )    // File to be
						       // opened
// Prompts the user for the name of an input file
// and attempts to open the file

// Postcondition:
//     The user has been prompted for a file name
//  && IF the file could not be opened
//	   An error message has been printed
// Note:
//     Upon return from this function, the caller must test
//     the stream state to see if the file was successfully opened

{
    string fileName;	// User-specified file name

    cout << "Input file name: ";
    cin >> fileName;

    someFile.open(fileName.c_str());
    if ( !someFile )
	cout << "** Can't open " << fileName << " **" << endl;
}

//******************************************************************

void PrintHeading()

// Prints the title for the bar chart, a heading, and the numeric
// scale for the chart.	 The scale uses one mark per $500

// Postcondition:
//     The heading for the bar chart has been printed

{
   cout
     << "Bar Graph Comparing Departments of Store #1 and Store #2"
     << endl << endl
     << "Store	Sales in 1,000s of dollars" << endl
     << "  #	0	  5	   10	     15	       20	 25"
     << endl
     << "	|.........|.........|.........|.........|.........|"
     << endl;
}

//******************************************************************

void GetData( /* inout */ ifstream& dataFile,	// Input file
	      /* out */	  int&	    deptID,	// Department number
	      /* out */	  float&    deptSales ) // Department's
						//   monthly sales

// Takes an input accounting file as a parameter, reads the
// department ID number and number of days of sales from that file,
// then reads one sales figure for each of those days, computing a
// total sales figure for the month.  This figure is returned in
// deptSales.  (If input of the department ID fails due to
// end-of-file, deptID and deptSales are undefined.)

// Precondition:
//     dataFile has been successfully opened
//  && For each department, the file contains a department ID,
//     number of days, and one sales figure for each day
// Postcondition:
//     IF input of deptID failed due to end-of-file
//	    deptID and deptSales are undefined
//     ELSE
//	    The data file reading marker has advanced past one
//	    department's data
//	 && deptID == department ID number as read from the file
//	 && deptSales == sum of the sales values for the department

{
    int	  numDays;  // Number of business days in the month
    int	  day;	    // Loop control variable for reading daily sales
    float sale;	    // One day's sales for the department

    dataFile >> deptID;
    if ( !dataFile )		 // Check for EOF
	return;			 // If so, exit the function

    dataFile >> numDays;
    deptSales = 0.0;
    day = 1;			 // Initialize loop control variable
    while (day <= numDays)
    {
	dataFile >> sale;
	deptSales = deptSales + sale;
	day++;			 // Update loop control variable
    }
}

//******************************************************************

void PrintData( /* in */ int   deptID,	     // Department ID number
		/* in */ int   storeNum,     // Store number
		/* in */ float deptSales )   // Total sales for the
					     //	  department

// Prints the department ID number, the store number, and a
// bar graph of the sales for the department.  The bar graph
// is printed at a scale of one mark per $500

// Precondition:
//     deptID contains a valid department number
//  && storeNum contains a valid store number
//  && 0.0 <= deptSales <= 25000.0
// Postcondition:
//     A line of the bar chart has been printed with one * for
//     each $500 in sales, with remainders over $250 rounded up
//  && No stars have been printed for sales <= $250

{
    cout << setw(12) << "Dept " << deptID << endl;
    cout << setw(3) << storeNum << "	 ";
    while (deptSales > 250.0)
    {
	cout << '*' ;			  // Print '*' for each $500
	deptSales = deptSales - 500.0;	  // Update loop control
    }					  //   variable
    cout << endl;
}