⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 库存管理系统.c

📁 库存管理系统(C++) 一个C++编写的库存管理系统
💻 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 + -