001: #include <iostream>
002: #include <string>
003: #include <vector>
005: using namespace std;
006:
007: /**
008: Describes a product with a description and a price.
009: */
010: class Product {
012: public:
013: Product();
014: Product(string d, double p);
015: /**
016: Gets the product description.
017: @return the description
018: */
019: string get_description() const;
021: /**
022: Gets the product price.
023: @return the unit price
024: */
025: double get_price() const;
026:
027: private:
028: string description;
029: double price;
030: };
031:
032: Product::Product()
033: { price = 0; }
036:
037: Product::Product(string d, double p)
038: { description = d;
040: price = p;
041: }
042:
043: string Product::get_description() const
044: { return description; }
047:
048: double Product::get_price() const
049: { return price; }
052:
053: /**
054: Describes a quantity of an article to purchase and its price.
055: */
056: class Item {
058: public:
059: Item();
060: Item(Product p, int q);
061: /**
062: Computes the total cost of this item.
063: @return the total price
064: */
065: double get_total_price() const;
067: /**
068: Prints this item.
069: */
070: void print() const;
071: private:
072: Product prod;
073: int quantity;
074: };
075:
076:
077: Item::Item()
078: { quantity = 0; }
081:
082: Item::Item(Product p, int q)
083: { prod = p;
085: quantity = q;
086: }
087:
088: double Item::get_total_price() const
089: { return prod.get_price() * quantity; }
092:
093: void Item::print() const
094: { const int COLUMN_WIDTH = 30;
096: string description = prod.get_description();
097:
098: cout << description;
100: // pad with spaces to fill column
101:
102: int pad = COLUMN_WIDTH - description.length();
103: for (int i = 1; i <= pad; i++) cout << " ";
105:
106: cout << prod.get_price() << " " << quantity
108: << " " << get_total_price() << "\n";
109: }
111: /**
112: Describes a mailing address.
113: */
114: class Address {
116: public:
117: Address();
118: Address(string n, string s,
119: string c, string st, string z);
120: /**
121: Prints the address.
122: */
123: void print() const;
124: private:
125: string name;
126: string street;
127: string city;
128: string state;
129: string zip;
130: };
131:
132: Address::Address() {}
133:
134: Address::Address(string n, string s,
135: string c, string st, string z)
136: { name = n;
138: street = s;
139: city = c;
140: state = st;
141: zip = z;
142: }
143:
144: void Address::print() const
145: { cout << name << "\n" << street << "\n"
147: << city << ", " << state << " " << zip << "\n";
148: }
150: /**
151: Describes an invoice for a set of purchased products.
152: */
153: class Invoice {
155: public:
156: Invoice(Address a);
157: /**
158: Adds a charge for a product to this invoice.
159: @param aProduct the product that the customer ordered
160: @param quantity the quantity of the product
161: */
162: void add(Product p, int quantity);
163: /**
164: Prints the invoice.
165: */
166: void print() const;
167: private:
168: Address billing_address;
169: vector<Item> items;
170: };
171:
172: Invoice::Invoice(Address a)
173: { billing_address = a; }
176:
177: void Invoice::add(Product p, int q)
178: { Item it(p, q);
180: items.push_back(it);
181: }
182:
183: void Invoice::print() const
184: { cout << " I N V O I C E\n\n";
186: billing_address.print();
187: cout <<
188: "\n\nDescription Price Qty Total\n";
189: for (int i = 0; i < items.size(); i++) items[i].print();
191:
192: double amount_due = 0;
193: for (int i = 0; i < items.size(); i++)
194: amount_due = amount_due + items[i].get_total_price();
195:
196: cout << "\nAMOUNT DUE: $" << amount_due;
197: }
198:
199: int main()
200: { Address sams_address("Sam's Small Appliances",
202: "100 Main Street", "Anytown", "CA", "98765");
203:
204: Invoice sams_invoice(sams_address);
205: sams_invoice.add(Product("Toaster", 29.95), 3);
206: sams_invoice.add(Product("Hair dryer", 24.95), 1);
207: sams_invoice.add(Product("Car vacuum", 19.99), 2);
208:
209: sams_invoice.print();
210: return 0;
211: }