//功能及要求描述:
//(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;
}