//****************************************************************** // 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 #include // For setw() #include // For file I/O #include // 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; }