2013-08-11 22:37:52Morris

[UVA] 330 - Inventory Maintenance


 Inventory Maintenance 

Madam Phoenix is moving to the southwest to open a ``Fun In The Sun" store selling sunglasses, sunscreen, and other such items. She's decided to employ you to write an inventory program for her new store. Here's how it will work.

Each ``activity" your program is to process will appear as a separate line in the input file. The end of the input is marked by a line containing an asterisk in column one; no other activity lines will be so marked. Activity lines begin with a lower-case keyword identifying the action to be performed. The names of the items in her inventory are case sensitive, and each contains no more than ten non-blank characters. All fields in the activity lines are separated by blanks, and Madam Phoenix guarantees you that there will be no errors in the input. Here are the various types of activity lines your program is to process.

new item-name item-cost item-selling-price

This line adds a new item (not previously carried in the store) to the potential inventory. The item-cost and item-selling-price are given as normal dollar amounts, without the dollar sign. That is, they will contain one or more decimal digits, a decimal point, and two more decimal digits. Note that this activity line doesn't actually result in a change in the inventory, but is used in anticipation of adding units of the new item to the store's offerings. item-cost is what Madam Phoenix pays for each unit of the item, and item-selling-price is the price for which she sells the item. There will be no more than 100 total item-names ever included in the list of items. item-cost and item-selling-price will never be larger than 100.00.

delete item-name

If an item isn't selling well, Madam Phoenix can remove it from the inventory by including this line in the program input. All units of item-name in the inventory are written off as a loss.

buy item-name quantity

When Madam Phoenix buys some units (at the unit-cost, previously indicated) of an item-name to offer for sale, she'll indicate that with one of these lines in the pregrain input. quantity indicates the number of units she purchased. The quantity she purchases will never be larger than 5000 at a time, but the number of units in the inventory may be as large as 10,000.

sell item-name quantity

When one or more units of an item are sold, that fact is recorded by placing one of these lines in the input. quantity indicates the number of units sold (at the item-selling-price previously indicated). Obviously, the quantity sold cannot exceed the number of items in stock.

report

This line in the input requests a report. This is the only input line for which output is expected. Your program will display columns, with suitable headings, showing item-name, the buying price, the selling price, the number of units in the inventory, and the value of the units in the inventory (that is, the product of the number of units in the inventory and the buying price). The lines in the report should be sorted in alphabetical order on item name. Following the last item the total value of all units in the inventory should be displayed. Then finally, a line should appear showing the total profit since the last report was issued. Profit is defined as total sales, less the cost of the items sold, less the cost of items written off (by the delete activity). Print a blank line after every report. The sample output shown illustrates the desired format for the report. All numbers in the report must naturally be exact.

Sample Input

new Shade01 0.50 3.79
new Towel01 1.47 6.98
new Shade02 0.63 4.29
new BluBlock 1.00 4.98
buy BluBlock 100
sell BluBlock 2
buy Towel01 500
buy Shade01 100
buy Shade02 100
sell Towel01 1
sell Towel01 1
sell BluBlock 2
report
delete Shade01
sell BluBlock 5
new Shade03 0.51 1.98
buy Shade03 250
sell Towel01 5
sell Shade03 4
sell Shade02 10
report
*

Sample Output

                  INVENTORY REPORT
Item Name     Buy At      Sell At      On Hand        Value
---------     ------      -------      -------        -----
BluBlock        1.00         4.98           96        96.00
Shade01         0.50         3.79          100        50.00
Shade02         0.63         4.29          100        63.00
Towel01         1.47         6.98          498       732.06
------------------------
Total value of inventory                             941.06
Profit since last report                              26.94

                  INVENTORY REPORT
Item Name     Buy At      Sell At      On Hand        Value
---------     ------      -------      -------        -----
BluBlock        1.00         4.98           91        91.00
Shade02         0.63         4.29           90        56.70
Shade03         0.51         1.98          246       125.46
Towel01         1.47         6.98          493       724.71
------------------------
Total value of inventory                             997.87
Profit since last report                              39.93


delete 比較特別,相當於整個貨物遺失,也就是按照成本直接扣除。

其餘指令則是增添清單,以及進貨物個數,或者販賣某貨物。

#include <stdio.h>
#include <iostream>
#include <map>
#include <algorithm>
using namespace std;
struct E {
double buy, sell;
int stock;
int on;
};
int main() {
map<string, E> R;
string cmd;
string name;
double profit = 0;
int x;
while(cin >> cmd) {
if(cmd == "*")
break;
if(cmd == "new") {
E tmp;
cin >> name >> tmp.buy >> tmp.sell;
tmp.on = 1, tmp.stock = 0;
R[name] = tmp;
} else if(cmd == "buy") {
cin >> name >> x;
R[name].stock += x;
} else if(cmd == "sell") {
cin >> name >> x;
R[name].stock -= x;
profit += x*(R[name].sell-R[name].buy);
} else if(cmd == "delete") {
cin >> name;
R[name].on = 0;
profit -= R[name].stock*R[name].buy;
R[name].stock = 0;
} else {
double inventory = 0;
puts(" INVENTORY REPORT");
puts("Item Name Buy At Sell At On Hand Value");
puts("--------- ------ ------- ------- -----");
for(map<string, E>::iterator it = R.begin();
it != R.end(); it++) {
if(it->second.on == 0) continue;
printf("%-12s%8.2lf%13.2lf%13d%13.2lf\n", it->first.c_str(), it->second.buy
, it->second.sell, it->second.stock, (it->second.stock)*(it->second.buy));
inventory += (it->second.stock)*(it->second.buy);
}
puts("------------------------");
printf("Total value of inventory %15.2lf\n", inventory);
printf("Profit since last report %15.2lf\n", profit);
profit = 0;
puts("");
}
}
return 0;
}