设备管理系统



//功能及要求描述:

 //(1) 公司主要包括三类设备需要管理:电视机、DVD、带DVD的电视机;

 //(2) 设备主要包含的信息:编号、类别、名称、价格、库存数量;

 //(3) 添加各类设备信息;

 //(4) 删除设备信息;

 //(5) 查找设备信息;

 //(6) 修改设备信息;

 //(7) 输出所有设备信息;

 //(8) 将信息保存到文件;


#include<iostream>
#include<sstream>
#include<fstream>
#include<cstdlib>
#include<vector>
#include<string>
#include<iomanip>
#include<iterator>
#include<algorithm>
#include<conio.h>
#include<Windows.h>
using namespace std;

string itos(int a)
{
 ostringstream os;
 os<<a;
 return os.str();
}

int stoi(string s)
{
 istringstream is(s);
 int x;
 is>>x;
 return x;
}

void inline pause()
{
 system("pause");
}

void inline error(string str)
{
 cout<<str<<endl;
 pause();
}

char getSelect(char min,char max,string errorInfo)
{
 char cmd;
 cout<<"[ ]\b\b";
 cmd=_getch();
 cout<<cmd<<endl;
 while(cmd<min||cmd>max)
 {
  cout<<errorInfo<<endl;
  cout<<"[ ]\b\b";
  cmd=_getch();
  cout<<cmd<<endl;
 }
 return cmd;
}

class Device
{
private:
 string _No;
 string _kind;
 string _name;
 double _price;
public:
 friend vector<Device>;
 friend class Devices;
 friend istream& operator>>(istream &in,Device &d);
 friend ostream& operator<<(ostream &out,Device &d);
 Device(string No="",string kind="",string name="",double price=0)
 {
  _No=No;
  _kind=kind;
  _name=name;
  _price=price;
 }
 string &getNo()
 {
  return _No;
 }
 string &getKind()
 {
  return _kind;
 }
 string &getName()
 {
  return _name;
 }
 double &getPrice()
 {
  return _price;
 }
};
istream& operator>>(istream &in,Device &d)
{
 cout<<"请输入设备编号:"<<endl;
 in>>d._No;
 cout<<"请输入设备类别(DVD、电视机或带DVD的电视机):"<<endl;
 in>>d._kind;
 if(d.getKind()!="DVD"&&d.getKind()!="电视机"&&d.getKind()!="带DVD的电视机")
  while(d.getKind()!="DVD"&&d.getKind()!="电视机"&&d.getKind()!="带DVD的电视机")
  {
   cout<<"请确认输入的类别无误!"<<endl;
   cout<<"请输入设备类别(DVD、电视机或带DVD的电视机):"<<endl;
   in>>d._kind;
  }
 cout<<"请输入设备名称:"<<endl;
 in>>d._name;
 cout<<"请输入设备价格(>0):"<<endl;
 in>>d._price;
 if(d._price<=0)
  while(d._price<=0)
  {
   cout<<"请确认输入的价格无误!"<<endl;
   cout<<"请输入设备价格(>0):"<<endl;
   in>>d._price;
  }
 return in;
}
ostream &operator <<(ostream &out,Device &d)
{
 out<<setw(15)<<d.getNo()<<setw(15)<<d.getKind()<<setw(15)<<d.getName()<<setw(15)<<d.getPrice();
 return out;
}

bool cmpByNo(Device d1,Device d2)
{
 return d1.getNo()<d2.getNo();
}
bool cmpByKind(Device d1,Device d2)
{
 return d1.getKind()<d2.getKind();
}
bool cmpByName(Device d1,Device d2)
{
 return d1.getName()<d2.getName();
}
bool cmpByPrice(Device d1,Device d2)
{
 return d1.getPrice()<d2.getPrice();
}
class Devices
{
private:
 int _DVDAmount;
 int _TVAmount;
 int _DVDTVAmount;
 vector<Device> v;
 void printTitle()
 {
  cout<<setw(15)<<"设备编号"<<setw(15)<<"设备类别"<<setw(15)<<"设备名称\t"<<setw(15)<<"设备价格"<<endl;
 }
 void changeAmount(string kind,bool add)
 {
  int change=add?1:-1;
  if(kind=="DVD")
   _DVDAmount+=change;
  else if(kind=="电视机")
   _TVAmount+=change;
  else if(kind=="带DVD的电视机")
   _DVDTVAmount+=change;
 }
 void showMenu();
public:
 Devices()
 {
  _DVDAmount=0;
  _TVAmount=0;
  _DVDTVAmount=0;
 }
 ~Devices()
 {
  v.~vector();
 }
 int getAmount()
 {
  return v.size();
 }
 int getDVDAmount()
 {
  return _DVDAmount;
 }
 int getTVAmount()
 {
  return _TVAmount;
 }
 int getDVDTVAmount()
 {
  return _DVDTVAmount;
 }
 void clear()
 {
  v.clear();
  _DVDAmount=0;
  _TVAmount=0;
  _DVDTVAmount=0;
 }
 void welcomeMenu();
 void menu();
 void addDevice();
 void DelDevice();
 void printAll();
 void find();
 void modify();
 void sortIt();
 void readFromFile();
 void saveToFile();
};
void Devices::addDevice()
{
 Device d;
 cin>>d;
 changeAmount(d.getKind(),true);
 v.push_back(d);
 cout<<"添加成功!"<<endl;
}
void Devices::printAll()
{
 if(v.empty())
 {
  cout<<"无数据"<<endl;
  pause();
  return ;
 }
 cout<<setw(8)<<"序号";
 printTitle();
 for(vector<Device>::iterator it=v.begin();it!=v.end();it++)
  cout<<setw(8)<<string("[")+itos(it-v.begin())+"]"<<*it<<endl;
 cout<<"共"<<getAmount()<<"条记录"<<endl;
 cout<<"其中:"<<endl;
 cout<<"DVD:"<<getDVDAmount()<<"条记录"<<endl;
 cout<<"带DVD的电视机:"<<getDVDTVAmount()<<"条记录"<<endl;
 cout<<"电视机:"<<getTVAmount()<<"条记录"<<endl;
 pause();
}
void Devices::welcomeMenu()
{    
 const char c=14;
 ostringstream os[15];
    int i;
    os[0]<<endl;
    os[1]<<"                   "; 
    for(i=0;i<14;i++)
  if(i%2==0)
   os[1].put(c);
  else
   os[1].put(' ');
    os[1]<<"设备管理系统 ";
    for(i=0;i<14;i++)
  if(i%2==0)
   os[1].put(c);
  else
   os[1].put(' ');
    os[1]<<endl;
 os[2]<<"                 "<<c<<"                                          "<<c<<endl;
    os[3]<<"                 "<<c<<"                 [1] 添加                 "<<c<<endl; 
    os[4]<<"                 "<<c<<"                 [2] 删除                 "<<c<<endl; 
    os[5]<<"                 "<<c<<"                 [3] 修改                 "<<c<<endl; 
    os[6]<<"                 "<<c<<"                 [4] 查看                 "<<c<<endl; 
    os[7]<<"                 "<<c<<"                 [5] 查找                 "<<c<<endl; 
    os[8]<<"                 "<<c<<"                 [6] 排序                 "<<c<<endl; 
    os[9]<<"                 "<<c<<"                 [7] 保存                 "<<c<<endl;  
    os[10]<<"                 "<<c<<"                 [8] 取消                 "<<c<<endl; 
    os[11]<<"                 "<<c<<"                 [0] 退出                 "<<c<<endl;  
    os[12]<<"                 "<<c<<"                                          "<<c<<endl;    
    os[13]<<"                 "<<c<<"                                          "<<c<<endl; 
    os[14]<<"                   "; 
    for(i=0;i<40;i++) 
  if(i%2==0)
   os[14].put(c);
  else
   os[14].put(' ');
    os[14]<<endl;
 for(i=14;i>=0;i--)
 {
  Sleep(80);
  system("cls");
  for(int j=i;j<15;j++)
   cout<<os[j].str();
 }

void Devices::showMenu()
{    
 const char c=14;
    int i;
    cout<<endl;
    cout<<"                   "; 
    for(i=0;i<14;i++)
  if(i%2==0)
   cout.put(c);
  else
   cout.put(' ');
    cout<<"设备管理系统 ";
    for(i=0;i<14;i++)
  if(i%2==0)
   cout.put(c);
  else
   cout.put(' ');
    cout<<endl;
 cout<<"                 "<<c<<"                                          "<<c<<endl;
    cout<<"                 "<<c<<"                 [1] 添加                 "<<c<<endl; 
    cout<<"                 "<<c<<"                 [2] 删除                 "<<c<<endl; 
    cout<<"                 "<<c<<"                 [3] 修改                 "<<c<<endl; 
    cout<<"                 "<<c<<"                 [4] 查看                 "<<c<<endl; 
    cout<<"                 "<<c<<"                 [5] 查找                 "<<c<<endl; 
    cout<<"                 "<<c<<"                 [6] 排序                 "<<c<<endl; 
    cout<<"                 "<<c<<"                 [7] 保存                 "<<c<<endl;  
    cout<<"                 "<<c<<"                 [8] 取消                 "<<c<<endl; 
    cout<<"                 "<<c<<"                 [0] 退出                 "<<c<<endl;  
    cout<<"                 "<<c<<"                                          "<<c<<endl;    
    cout<<"                 "<<c<<"                                          "<<c<<endl; 
    cout<<"                   "; 
    for(i=0;i<40;i++) 
  if(i%2==0)
   cout.put(c);
  else
   cout.put(' ');
    cout<<endl;

void Devices::menu()
{
 char cmd,cmd2;
 system("cls");
 showMenu();
 cout<<"请输入命令[0-8]:"<<endl;
 cmd=getSelect('0','8',"不合法命令!");
 if(cmd=='0')
 {
  cout<<"是否保存所做的更改?\n[0]否\n[1]是\n[2]取消"<<endl;
  cmd2=getSelect('0','2',"请输入正确的命令!");
  if(cmd2=='1')
  {
   saveToFile();
   cout<<"保存成功!"<<endl;
   pause();
  }
  else if(cmd2=='2')
   return ;
  exit(0);
 }
 switch(cmd)
 {
 case '1':
  do
  {
  addDevice();
  cout<<"是否继续添加?\n[1]是\n[0]否\n"<<endl;
  cmd2=getSelect('0','1',"是否继续添加?\n[1]是\n[0]否\n");
  }while(cmd2=='1');
  break;
 case '2':
  do
  {
  DelDevice();
  cout<<"是否继续删除?\n[1]是\n[0]否\n"<<endl;
  cmd2=getSelect('0','1',"是否继续删除?\n[1]是\n[0]否\n");
  }while(cmd2=='1');
  break;
 case '3':
  do
  {
  modify();
  cout<<"是否继续更改?\n[1]是\n[0]否\n"<<endl;
  cmd2=getSelect('0','1',"是否继续更改?\n[1]是\n[0]否\n");
  }while(cmd2=='1');
  break;
 case '4':
  printAll();
  break;
 case '5':
  do
  {
  find();
  cout<<"是否继续查找?\n[1]是\n[0]否\n"<<endl;
  cmd2=getSelect('0','1',"是否继续查找?\n[1]是\n[0]否\n");
  }while(cmd2=='1');
  break;
 case '6':
  sortIt();
  break;
 case '7':
  saveToFile();
  cout<<"保存成功!"<<endl;
  break;
 case '8':
  clear();
  readFromFile();
  cout<<"已取消!"<<endl;
  break;
 }
}
void Devices::find()
{
 string No,kind,name;
 double price;
 int cnt;
 cout<<"请选择查询方式[1-4]:"<<endl;
 cout<<"[1] 按编号查询"<<endl;
 cout<<"[2] 按类别查询"<<endl;
 cout<<"[3] 按名称查询"<<endl;
 cout<<"[4] 按价格查询"<<endl;
 char cmd;
 cmd=getSelect('1','4',"不合法的查询方式,请再次选择查询方式[1-4]:");
 switch(cmd)
 {
 case '1':
  { cnt=0;
  cout<<"请输入设备编号:"<<endl;
  cin>>No;
  for(vector<Device>::iterator it=v.begin();it!=v.end();it++)
   if(it->getNo()==No)
   {
    cnt++;
    if(cnt==1)
     printTitle();
    cout<<*it<<endl;
   }
   if(cnt==0)
    cout<<"未找到编号为"<<No<<"的设备"<<endl;
   else
   cout<<"共"<<cnt<<"条记录。"<<endl;
  }
 break;
 case '2':
  {
  cnt=0;
  cout<<"请输入设备类别(DVD、电视机或带DVD的电视机):"<<endl;
 cin>>kind;
 if(kind!="DVD"&&kind!="电视机"&&kind!="带DVD的电视机")
  while(kind!="DVD"&&kind!="电视机"&&kind!="带DVD的电视机")
  {
   cout<<"请确认输入的类别无误!"<<endl;
   cout<<"请输入设备类别(DVD、电视机或带DVD的电视机):"<<endl;
   cin>>kind;
  }
  for(vector<Device>::iterator it=v.begin();it!=v.end();it++)
   if(it->getKind()==kind)
   {
    cnt++;
    if(cnt==1)
     printTitle();
    cout<<*it<<endl;
   }
   if(cnt==0)
    cout<<"未找到类别为"<<kind<<"的设备"<<endl;
   else
   cout<<"共"<<cnt<<"条记录。"<<endl;
  }
 break;
 case '3':
  {
  cnt=0;
  cout<<"请输入设备名称:"<<endl;
  cin>>name;
  for(vector<Device>::iterator it=v.begin();it!=v.end();it++)
   if(it->getName()==name)
   {
    cnt++;
    if(cnt==1)
     printTitle();
    cout<<*it<<endl;
   }
   if(cnt==0)
    cout<<"未找到名称为"<<name<<"的设备"<<endl;
   else
   cout<<"共"<<cnt<<"条记录。"<<endl;
  }
 break;
 case '4':
  cnt=0;
  cout<<"请输入设备价格:"<<endl;
  cin>>price;
  for(vector<Device>::iterator it=v.begin();it!=v.end();it++)
   if(it->getPrice()==price)
   {
    cnt++;
    if(cnt==1)
     printTitle();
    cout<<*it<<endl;
   }
   if(cnt==0)
    cout<<"未找到价格为"<<price<<"的设备"<<endl;
   else
   cout<<"共"<<cnt<<"条记录。"<<endl;
 break;
 }
}
void Devices::DelDevice()
{
 if(v.empty())
  {
   cout<<"无数据!"<<endl;
   return ;
  }
 string No;
 int cnt=0;
 bool find(0);
 char cmd;
 cout<<"请输入要删除设备的编号:"<<endl;
 cin>>No;
 for(vector<Device>::iterator it=v.begin();it!=v.end();)
  {
   if(it->getNo()==No)
   {
    find=1;
    cout<<*it<<endl;
    cout<<"确定要删除这条记录吗?"<<endl;
    cout<<"[1]确定"<<endl<<"[0]取消"<<endl;
    cmd=getSelect('0','1',"请输入正确的命令");
    if(cmd=='1')
    {
     cnt++;
     changeAmount(it->getKind(),false);
     if(it==v.begin())
     {
      v.erase(it);
      it=v.begin();
     }
     else
     {
      vector<Device>::iterator t=it;
      it--;
      v.erase(t);
      it++;
     }
     cout<<"删除成功!"<<endl;
    }
    else
    {
     cout<<"取消成功!"<<endl;
     it++;
    }
   }
   else
    it++;
   
  }
 if(find==0)
  cout<<"未找到编号为"<<No<<"的设备"<<endl;
 else
  cout<<"共删除了"<<cnt<<"条记录"<<endl;
}
void Devices::modify()
{
 if(v.empty())
  {
   cout<<"无数据!"<<endl;
   return ;
  }
 string No;
 int cnt=0;
 bool find(0);
 char cmd;
 cout<<"请输入要修改设备的编号:"<<endl;
 cin>>No;
 for(vector<Device>::iterator it=v.begin();it!=v.end();it++)
   if(it->getNo()==No)
   {
    find=1;
    cout<<setw(8)<<string("[")+itos(it-v.begin())+"]"<<*it<<endl;
    cout<<"确定要修改这条记录吗?"<<endl;
    cout<<"[1]修改编号"<<endl;
    cout<<"[2]修改类别"<<endl;
    cout<<"[3]修改名称"<<endl;
    cout<<"[4]修改价格"<<endl;
    cout<<"[5]修改全部"<<endl;
    cout<<"[6]不修改"<<endl;
    cout<<"[0]返回主界面"<<endl;
    cmd=getSelect('0','6',"请输入正确的命令[0-6]:");
    switch(cmd)
    {
    case '0':
     return ;
    case '1':
     cnt++;
     cout<<"请输入设备编号:"<<endl;
     cin>>it->_No;
     cout<<"修改成功!"<<endl;
     break;
    case '2':
     cnt++;
     changeAmount(it->getKind(),false);
     cout<<"请输入设备类别(DVD、电视机或带DVD的电视机):"<<endl;
     cin>>it->_kind;
     if(it->getKind()!="DVD"&&it->getKind()!="电视机"&&it->getKind()!="带DVD的电视机")
      while(it->getKind()!="DVD"&&it->getKind()!="电视机"&&it->getKind()!="带DVD的电视机")
      {
       cout<<"请确认输入的类别无误!"<<endl;
       cout<<"请输入设备类别(DVD、电视机或带DVD的电视机):"<<endl;
       cin>>it->_kind;
      }
     changeAmount(it->getKind(),true);
     cout<<"修改成功!"<<endl;
     break;
    case '3':
     cnt++;
     cout<<"请输入设备名称:"<<endl;
     cin>>it->_name;
     cout<<"修改成功!"<<endl;
     break;
    case '4':
     cnt++;
     cout<<"请输入设备价格(>0):"<<endl;
     cin>>it->_price;
     if(it->_price<=0)
      while(it->_price<=0)
      {
       cout<<"请确认输入的价格无误!"<<endl;
       cout<<"请输入设备价格(>0):"<<endl;
       cin>>it->_price;
      }
     cout<<"修改成功!"<<endl;
     break;
    case '5':
     cnt++;
     changeAmount(it->getKind(),false);
     cin>>*it;
     changeAmount(it->getKind(),true);
     cout<<"修改成功!"<<endl;
     break;
    case '6':
     cout<<"取消成功!"<<endl;
     break;
    }
   }
 if(find==0)
  cout<<"未找到编号为"<<No<<"的设备"<<endl;
 else
  cout<<"共修改了"<<cnt<<"条记录"<<endl;
}
void Devices::sortIt()
{
 cout<<"[1] 按编号排序"<<endl;
 cout<<"[2] 按类别排序"<<endl;
 cout<<"[3] 按名称排序"<<endl;
 cout<<"[4] 按价格排序"<<endl;
 cout<<"请选择排序方式[1-4]:"<<endl;
 char cmd;
 cmd=getSelect('1','4',"请选择排序方式[1-4]:");
 switch(cmd)
 {
 case '1':
  sort(v.begin(),v.end(),cmpByNo);
  break;
 case '2':
  sort(v.begin(),v.end(),cmpByKind);
  break;
 case '3':
  sort(v.begin(),v.end(),cmpByName);
  break;
 case '4':
  sort(v.begin(),v.end(),cmpByPrice);
  break;
 }
 cout<<"排序已完成!是否立即查看?"<<endl;
 cout<<"[1] 立即查看"<<endl;
 cout<<"[0] 返回主界面"<<endl;
 cmd=getSelect('0','1',"请输入正确的命令!");
 if(cmd=='1')
  printAll();
}
void Devices::readFromFile()
{
 ifstream fin("1.txt",ios::in);
/* if(!fin)
 {
  fin.open("1.txt",ios::in|ios::_Noreplace);
 }*/
 Device d;
 while(fin>>d._No>>d._kind>>d._name>>d._price)
 {
  changeAmount(d.getKind(),true);
  v.push_back(d);
 }
 fin.close();
}

void Devices::saveToFile()
{
 ofstream fout("tmp.txt",ios::out);
 if(!fout)
 {
  error("创建临时文件失败!");
  exit(-1);
 }
 fout.setf(ios::left);
 for(vector<Device>::iterator it=v.begin();it!=v.end();it++)
  fout<<*it<<endl;
 fout.close();
 remove("1.txt");
 rename("tmp.txt","1.txt");
}
int main()
{
 Devices d;
 system("color 0A");
 cout.setf(ios::left);
 cout<<"加载数据中……"<<endl;
 d.readFromFile();
 d.welcomeMenu();
 while(1)
 {
  d.menu();
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值