超市结账系统
1. C语言编写“超市结账系统” 急急急!!!
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <assert.h>
using namespace std;
// Item info base class
class ItemInfo{
public:
 ItemInfo(){}
 ItemInfo(string barcode, string name, float price)
 {
  this->barcode = barcode;
  this->name = name;
  this->price = price;
 }
 ItemInfo(string barcode)
 {
  this->barcode = barcode;
 }
 void Display() {
    cout << barcode <<"\t"<<name<<"\t"<<price<< endl;
   }
 void Input() {
    cout << "输入条形码:" << endl;
    cin >> barcode;
    cout << "输入名称:" << endl;
    cin >> name;
    cout << "输入价格:" << endl;
    cin >> price;
   }
 void Modify() {
    cout << "输入名称:" << endl;
    cin >> name;
    cout << "输入价格:" << endl;
    cin >> price;
 }
 friend ostream& operator<<(ostream& stream, ItemInfo& item){
  stream << item.barcode <<'\t'<< item.price <<'\t'<< item.name<<endl;
  return stream;
 }
 friend istream& operator>>(istream& stream, ItemInfo& item){
  stream >> item.barcode >> item.price >> item.name;
  return stream;
 }
public:
 string barcode;
 string name;
 float price;
};
// Interface class
class DataProvider{
public:
 virtual void GetFullData(string barcode, string& name, float& price) = 0;
};
// Purchase item class
class ItemPurchaseInfo : public ItemInfo{
public:
 ItemPurchaseInfo():ItemInfo(){}
 ItemPurchaseInfo(string barcode, int count=1) :
   ItemInfo(barcode)
 {
  this->count = count;
 }
   // Rember to call this when barcode set
   void GetFullData(DataProvider& aPro) {
    aPro.GetFullData(barcode, name, price);
   }
   void Input() {
    cout << "输入条形码:" << endl;
    cin >> barcode;
    cout << "输入数量:" << endl;
    cin >> count;
   }
   void Display() {
    cout << barcode <<"\t"<<name<<"\t"<<price<<"\t"<<count<< endl;
   }
public:
 string barcode;
 int count;
};
// Item list class
class ItemList {
public:
 ItemList(){items.clear();}
 friend ostream& operator<<(ostream& stream, ItemList& list){
  unsigned int count = list.items.size();
  stream <<count<<endl;
  for(unsigned int i(0);i<count;i++)
   stream<< list.items.at(i);
  return stream;
 }
 friend istream& operator>>(istream& stream, ItemList& list){
  unsigned int count(0);
  stream >>count;
  list.items.clear();
  for(unsigned int i(0);i<count;i++){
   ItemInfo item;
   stream >> item;
   list.items.insert(list.items.end(), item);
  }
  return stream;
 }
 void Add(ItemInfo item) {
  items.insert(items.end(), item);
 }
 void Modify() {
  string barcode;
  cout << "输入条形码:" << endl;
    cin >> barcode;
  for(unsigned int i(0);i<items.size();i++) {
   if(items.at(i).barcode == barcode ) {
    items.at(i).Modify();
   }
  }
 }
public:
 vector<ItemInfo> items;
};
// Purchase item list class
class PurchaseItemList {
public:
 PurchaseItemList(){items.clear();}
 void Add(ItemPurchaseInfo item) 
  {items.insert(items.end(), item);}
public:
 vector<ItemPurchaseInfo> items;
};
// Implements the interface class
class Cashier : public DataProvider {
public:
 Cashier() : purchase(), stock(){}
 ~Cashier(){}
public: // User funcs
 void CheckIn(){
  purchase.items.clear();
  int opt(0);
  do {
  unsigned int i(0);
  ItemPurchaseInfo ipi;
  ipi.Input();
  purchase.Add(ipi);
  cout << "按0退出,任意键继续" << endl;
  cin >> opt;
  } while(opt);
 }
 void CheckOut(){
  for(unsigned int i(0); i < purchase.items.size(); i++) {
   purchase.items.at(i).GetFullData( *this );
  }
  float checkin(0);
  cout << "输入收款数:" << endl;
  cin >> checkin;
  DisplayList(checkin);
 }
 void Display()
 {
  cout << endl<<"商品清单 "<< stock.items.size() << endl;
  cout <<"--------------------------------------" << endl;
  for(unsigned int i(0);i<
    stock.items.size(); i++){
     stock.items.at(i).Display();
   }
  cout <<"--------------------------------------" << endl;
 }
 void DisplayList(float checkin)
 {
  cout << endl<<"购物小票清单" << endl;
  cout <<"--------------------------------------" << endl;
  float total(0.0);
  for(unsigned int i(0); i < purchase.items.size(); i++) {
   purchase.items.at(i).Display();
   total += purchase.items.at(i).price * purchase.items.at(i).count;
  }
  cout <<"--------------------------------------" << endl;
  cout <<"货款合计:"<< total << "元" << endl;
  cout <<"收款数:"<< checkin << "元" << endl;
  float change(checkin-total);
  assert( change >= 0.0);
  cout <<"找零:"<< change << "元" << endl<< endl;
  
 }
friend ostream& operator<<(ostream& stream, Cashier& c){
  stream << c.stock;
  return stream;
 }
 friend istream& operator>>(istream& stream, Cashier& c){
  c.stock.items.clear();
  stream >> c.stock;
  return stream;
 }
 
public: // interface func
 void GetFullData(string barcode, string& name, float&price) {
  // go through stock and find the item by barcode matching
  for(unsigned int i(0); i < stock.items.size(); i++) {
   if(stock.items.at(i).barcode == barcode) {
    name = stock.items.at(i).name;
    price = stock.items.at(i).price;
   }
  }
 }
public:
 PurchaseItemList purchase;
 ItemList stock;
};
int main()
{
 int opt(0);
 Cashier cashier;
 ifstream fin("data.bin", ios::in | ios::binary);
 fin.seekg(0, ios::beg);
 //cashier.stock.Load(fin);
 fin >> cashier;
 fin.close();
 ofstream fout;
 
 ItemInfo item;
 do{
  cout << "1. 新购买" << endl;
  cout << "2. 输入新商品信息" << endl;
  cout << "3. 修改商品信息" << endl;
  cout << "4. 显示商品信息" << endl;
  cout << "0. 退出" << endl;
  cin >> opt;
  switch(opt)
  {
  case 1:
   cashier.CheckIn();
   cashier.CheckOut();
   break;
  case 2:
   item.Input();
   cashier.stock.Add(item);
   fout.open("data.bin", ios::out| ios::binary);
   fout.seekp(0,ios::beg);
   fout << cashier;
   fout.close();
   break;
  case 3:
   cashier.stock.Modify();
   fout.open("data.bin", ios::out| ios::app  | ios::binary);
   fout << cashier;
   fout.close();
   break;
  case 4:
   cashier.Display();
   break;
  default:
   break;
  }
 } while(opt);
    return 0;
}
