📄 库存管理系统.c
字号:
#include <fstream.h>
#include <iomanip.h>
class GOODS //商品类(抽象类)
{
protected:
int no;
char name[20];
int type; //商品类别:TV-1,DVD-2,DVDTV-3(文件中用于标识商品类别)
double price; //商品总价
int amount;
GOODS* next;
public:
GOODS(){no=0; name[0]=0; type=0; price=0; amount=0; next=0;}
virtual ~GOODS(){}
virtual void Input() //键盘输入商品信息
{
cout<<"编号:"; cin>>no;
cout<<"名称:"; cin>>name;
cout<<"价格:"; cin>>price;
cout<<"库存数量"; cin>>amount;
}
virtual void Input(ifstream& f) //文件输入商品信息
{
f>>no>>name>>type>>price>>price>>amount;
}
virtual void Output()=0; //屏幕输出商品信息(各种商品的数据个数,格式不同)
virtual void Output(ofstream& f)=0; //文件输出商品信息
friend class STOCK;
};
class TV:virtual public GOODS //电视机类
{
public:
TV(){type=1;} //商品类别1代表TV
virtual void Output()
{
cout<<setiosflags(ios::left);
cout<<setw(6)<<no; //编号区域
cout<<setw(10)<<name; //名称区域
cout<<setw(10)<<type; //商品类别
cout<<resetiosflags(ios::left);
cout<<" "<<setw(6)<<price; //TV价格区域
cout<<setw(6)<<price; //总价格区域
cout<<setw(12)<<amount<<endl; //数量区域
}
virtual void Output(ofstream& f)
{
f<<setiosflags(ios::left);
f<<setw(6)<<no; //编号区域
f<<setw(10)<<name; //名称区域
f<<setw(10)<<type; //商品类别
f<<resetiosflags(ios::left);
f<<" "<<setw(6)<<price; //TV价格区域
f<<setw(6)<<price; //总价格区域
f<<setw(12)<<amount<<endl; //数量区域
}
};
class DVD:virtual public GOODS //DVD类
{
public:
DVD(){type=2;} //商品类别2代表DVD
virtual void Output()
{
cout<<setiosflags(ios::left);
cout<<setw(6)<<no;
cout<<setw(10)<<name;
cout<<setw(10)<<type;
cout<<resetiosflags(ios::left);
cout<<setw(6)<<price<<" "; //DVD价格区域
cout<<setw(6)<<price;
cout<<setw(12)<<amount<<endl;
}
virtual void Output(ofstream& f)
{
f<<setiosflags(ios::left);
f<<setw(6)<<no;
f<<setw(10)<<name;
f<<setw(10)<<type;
f<<resetiosflags(ios::left);
f<<setw(6)<<price<<" "; //DVD价格区域
f<<setw(6)<<price;
f<<setw(12)<<amount<<endl;
}
};
class DVDTV:public TV,public DVD //带DVD电视机类
{
private:
double dvd_price,tv_price;//DVD,TV价格
public:
DVDTV(){type=3;}
void Input()
{
cout<<"编号:"; cin>>no;
cout<<"名称:"; cin>>name;
cout<<"DVD价格:"; cin>>dvd_price;
cout<<"TV价格:"; cin>>tv_price;
cout<<"库存数量"; cin>>amount;
price=(dvd_price+tv_price)*0.8;
}
virtual void Input(ifstream& f)
{
f>>no>>name>>type>>dvd_price>>tv_price>>price>>amount;
price=(dvd_price+tv_price)*0.8;
}
virtual void Output()
{
cout<<setiosflags(ios::left);
cout<<setw(6)<<no;
cout<<setw(10)<<name;
cout<<setw(10)<<type;
cout<<resetiosflags(ios::left);
cout<<setw(6)<<dvd_price; //DVD价格区域
cout<<setw(6)<<tv_price; //TV价格区域
cout<<setw(6)<<price;
cout<<setw(12)<<amount<<endl;
}
virtual void Output(ofstream& f)
{
f<<setiosflags(ios::left);
f<<setw(6)<<no;
f<<setw(10)<<name;
f<<setw(10)<<type;
f<<resetiosflags(ios::left);
f<<setw(6)<<dvd_price; //DVD价格区域
f<<setw(6)<<tv_price; //TV价格区域
f<<setw(6)<<price;
f<<setw(12)<<amount<<endl;
}
};
class STOCK //库存类
{
private:
GOODS* GL;
public:
STOCK()
{
GL=new TV;//虚基类不能创建对象,所以用1个空的TV对象作为头结点.
Load();
}
~STOCK()
{
GOODS* p; //当前结点指针
p=GL; //当前结点指针p指向第1个结点(头结点)
while(p)
{
GL=p->next; //链表指针指向下一个结点(下一个结点成为头结点,保证链表的链接状态)
delete p;
p=GL; //当前结点指针指向新的头结点.
}
}
void Clear();
int Find(int ID,GOODS **p1,GOODS **p2);
void Add();
void Delete();
void Modify();
void Print();
void Save();
void Load();
};
void STOCK::Clear() //清除所有商品信息的结点(仅保留头结点)
{
GOODS *p=GL->next;
while(p)
{
GL->next=p->next;
delete p;
p=GL->next;
}
}
//查找商品结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针)
int STOCK::Find(int ID,GOODS **p1,GOODS **p2)
{
*p1=GL->next;
*p2=GL;
while(*p1)
{
if((*p1)->no==ID)
break; //找到
else
{
*p2=*p1; //继续查找
*p1=(*p1)->next;
}
}
return *p1?1:0;
}
void STOCK::Add() //增加商品信息
{
cout<<"\n** 增加商品信息 **\n";
//查找尾结点
GOODS *p=GL;
while(p->next)p=p->next;
char ch;
GOODS *p2;
cout<<"输入商品分类码[1-TV,2-DVD,3-TVDVD]:"; cin>>ch;
//创建新结点,录入数据,连接到链表
switch(ch)
{
case '1': p2=new TV; break;
case '2': p2=new DVD; break;
case '3': p2=new DVDTV; break;
default: return;
}
p->next=p2; p2->Input();
}
void STOCK::Delete() //删除商品
{
cout<<"\n** 删除商品 **\n";
int No;
GOODS *p1,*p2;
cout<<"编号:"; cin>>No;
if(!Find(No,&p1,&p2))
{
cout<<"指定的商品没有找到!\n";
}
else
{
p2->next=p1->next; //连接
delete p1;
cout<<"正确删除!\n";
}
}
void STOCK::Modify() //修改商品信息
{
cout<<"\n** 修改商品 **\n";
int No;
GOODS *p1,*p2;
cout<<"编号:"; cin>>No;
if(!Find(No,&p1,&p2))
{
cout<<"指定的商品没有找到!\n";
}
else
{
p1->Output(); //输出原来的商品信息(做提示)
p1->Input(); //输入新的商品信息(更新)
cout<<"修改完成!\n";
}
}
void STOCK::Print() //输出商品信息
{
cout<<"\n** 商品信息表 **\n";
cout<<setiosflags(ios::left)<<setw(6)<<"编号"<<setw(10)<<"商品名称"<<setw(10)<<"商品类别"
<<resetiosflags(ios::left)<<setw(12)<<"售价"<<setw(6)<<"总价"<<setw(12)<<" 库存(台/套)\n";
GOODS *p=GL->next;
if(!p)
{
cout<<"无商品记录!\n";
return;
}
while(p) //遍历链表,输出商品信息
{
p->Output();
p=p->next;
}
}
void STOCK::Save() //保存商品信息
{
ofstream f("goods.dat",ios::out); //打开文件
//遍历输出至文件
GOODS *p=GL->next;
while(p)
{
p->Output(f);
p=p->next;
}
f.close(); //关闭文件
cout<<"商品信息已经保存在:goods.dat.\n";
}
void STOCK::Load() //装入商品信息
{
char buf[81]; //临时空间
int type; //商品类型
GOODS *p2; //新建结点的指针
long t; //读写位置
//清除现有结点(保留头结点)
Clear();
//打开文件
ifstream f("goods.dat",ios::in);
//建立结点,读数据
GOODS *p=GL; //尾结点指针
while(1)
{
//读取人员类型
t=f.tellg();
f>>buf>>buf>>type;
if(f)
{
//根据商品类型创建新结点
switch(type)
{
case 1: p2=new TV; break;
case 2: p2=new DVD; break;
case 3: p2=new DVDTV; break;
default: f.close(); return;
}
p->next=p2;
p=p->next;
f.seekg(t);
p->Input(f);
}
else
break;
}
//关闭文件
f.close();
}
void main()
{
char ch;
STOCK s; //定义库房对象
//显示主菜单,接受选择,并分支调用库房类相应功能的成员函数,完成相应操作
do
{
cout<<"\n☆☆ 库存管理系统 ☆☆\n";
cout<<"1-增加商品信息\n";
cout<<"2-删除商品信息\n";
cout<<"3-修改商品信息\n";
cout<<"4-输出商品信息\n";
cout<<"5-商品数据存盘\n";
cout<<"6-商品数据装入\n";
cout<<"7-退出\n请选择(1-7):";
cin>>ch;
switch(ch)
{
case '1': s.Add(); break;
case '2': s.Delete();break;
case '3': s.Modify();break;
case '4': s.Print(); break;
case '5': s.Save(); break;
case '6': s.Load(); break;
}
}while(ch!='7');
}
2、2数据文件
GOODS.DAT格式如下,含义见表:
1 C2136 1 1700 1700 15000
2 D128 2 500 500 5000
3 Z169 3 500 1900 1920 2500
编号 商品名称 商品类别 售价 总价 库存
DVD TV
1 C2136 1 1700 1700 15000
2 D128 2 500 500 5000
3 Z169 3 500 1900 1920 2500
2、3运行结果参考
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):4
** 商品信息表 **
编号 商品名称 商品类别 售价 总价 库存(台/套)
1 C2136 1 1700 1700 15000
2 D128 2 500 500 5000
3 Z169 3 500 1900 1920 2500
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):1
** 增加商品信息 **
输入商品分类码[1-TV,2-DVD,3-TVDVD]:1
编号:4
名称:C2118
价格:988
库存数量1000
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):1
** 增加商品信息 **
输入商品分类码[1-TV,2-DVD,3-TVDVD]:3
编号:5
名称:Z120
DVD价格:500
TV价格:988
库存数量500
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):4
** 商品信息表 **
编号 商品名称 商品类别 售价 总价 库存(台/套)
1 C2136 1 1700 1700 15000
2 D128 2 500 500 5000
3 Z169 3 500 1900 1920 2500
4 C2118 1 988 988 1000
5 Z120 3 500 988 1190.4 500
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):2
** 删除商品 **
编号:5
正确删除!
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):4
** 商品信息表 **
编号 商品名称 商品类别 售价 总价 库存(台/套)
1 C2136 1 1700 1700 15000
2 D128 2 500 500 5000
3 Z169 3 500 1900 1920 2500
4 C2118 1 988 988 1000
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):3
** 修改商品 **
编号:1
1 C2136 1 1700 1700 15000
编号:1
名称:C2136
价格:1580
库存数量18000
修改完成!
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):4
** 商品信息表 **
编号 商品名称 商品类别 售价 总价 库存(台/套)
1 C2136 1 1580 1580 18000
2 D128 2 500 500 5000
3 Z169 3 500 1900 1920 2500
4 C2118 1 988 988 1000
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):5
商品信息已经保存在:goods.dat.
☆☆ 库存管理系统 ☆☆
1-增加商品信息
2-删除商品信息
3-修改商品信息
4-输出商品信息
5-商品数据存盘
6-商品数据装入
7-退出
请选择(1-7):7
Press any key to continue
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -