//////////////////////////////////////////////////////////////////////// // C++ Programming CS177, Spring 1997 // // Lab 6. The Office Inventory -- sample answer // // Roger Hartley // //////////////////////////////////////////////////////////////////////// #include #include #include #include // the class that describes an item class SupplyItem { private: string description; int holding; float unitCost; public: SupplyItem() {} SupplyItem(const string& d, const float uc) : description(d), unitCost(uc), holding(0) {} // set holding to zero float worth() { return holding * unitCost; } void change(int ch); string getDescription() { return description; } int getHolding() { return holding; } SupplyItem& operator=(SupplyItem rhs) { // this overloaded operator was necessary to get rid of some // compiler warning messages -- it could be omitted description = rhs.description; holding = rhs.holding; unitCost = rhs.unitCost; return *this; } }; // the stock on hand is stored in a vector or items class Stock { private: vector supplies; int noItems; public: Stock(); void maintain(string&, int); void report(); }; // the application class class Inventory { private: Stock stock; public: void run(); void input(string&, int&); }; void SupplyItem::change(int ch) { // only allow a chamge of stock holding if the result is positive if (holding + ch < 0) cout << "We don't have that many!" << endl; else holding += ch; } Stock::Stock() : supplies(10) { // the stock constructor sets up the "empty" inventory // the unit costs are passed to the SupplyItem constructor // as constants supplies[0] = SupplyItem(string("pencils"), 0.3); supplies[1] = SupplyItem(string("legal-pads"), 1.2); supplies[2] = SupplyItem(string("paper-clips"), 0.02); supplies[3] = SupplyItem(string("folders"), 0.03); supplies[4] = SupplyItem(string("pens"), 1.35); noItems = 5; } void Inventory::input(string& desc, int& amt) { // use reference parameters to allow values to be passed out of the // function cout << "Type an item name and a change in stock holding: "; cin >> desc >> amt; } void Stock::maintain(string& desc, int amt) { // stock maintenance needs a search thrpigh the vector to // see if the supply item description is present int i; for (i = 0; i < noItems; i++) if (supplies[i].getDescription() == desc) { // the description is in the vector, so allow the change supplies[i].change(amt); cout << "OK" << endl; break; // no need to search further } // if the items was not found, then signal an error if (i >= noItems) cout << "Sorry, we do not carry that item" << endl; } void Stock::report() { // display an inventory report cout << endl << "Stock holdings:" << endl << endl; float total = 0.0; for (int i = 0; i < noItems; i++) { total += supplies[i].worth(); cout << setw(15) << setiosflags(ios::left) << supplies[i].getDescription().c_str() << setw(6) << setiosflags(ios::right) << supplies[i].getHolding() << endl; } // printing floating point numbers for money amounts needs // the following arcana cout << setiosflags(ios::showpoint) // make sure the decimal point is shown << setiosflags(ios::fixed) // don't use scientific notation << setprecision(2); // round up to show two decimal places if necessary cout << endl << "Total worth is $" << total << endl; } void Inventory::run() { // the top-level loop reads an input line and processes it immediately while (!cin.eof()) { string desc; int amt; input(desc, amt); stock.maintain(desc, amt); } // all the input is exhausted, so print the report stock.report(); } int main() { // just make an inventory and run it Inventory inventory; inventory.run(); }