设计一个仓库物品库存管理系统,能够实现仓库物品库存管理,包括:
- 能实现进库、出库、修改、统计和查询功能;
- 用文件系统存储数据信息;
进行面向对象程序设计。
- 显示菜单选择:
2.用户在控制台输入入库物品信息,相应的文件夹也记录入档。
3、将物品实现出库功能,相应文件也删除该物品信息。
4、将物品实现修改功能,相应文件也将物品信息进行修改。
5、将物品信息统计好,从文件中展示到控制台屏幕上。
6、进行物品信息查询,并将相应信息展示到控制台屏幕上。
7、退出系统。
#include <iostream>
#include <string>
#include <fstream>
#include <cassert>
#include <iomanip>
#include <conio.h>
using namespace std;
class Goods //定义一个物品类
{
public:
Goods(); //构造函数的声明
void first_face(); //开始菜单界面
void ExitSystem(); //用户结束程序
void in_storage(); //实现入库功能
void out_storage_ele(); //出库菜单界面
void out_storage_num(); //按物品编号出库
void out_storage_name(); //按物品名称出库
void change_ele(); //修改物品信息菜单界面
void change_num(); //按物品编号修改
void change_name(); //按物品名称修改
void show(); //将物品信息统计展示在频幕上
void selecct_ele(); //查找物品菜单界面
void select_num(); //按物品编号查询
void select_name(); //按物品名称查询
void select_price(); //按物品价格查询
void select_area(); //按物品产地查询
private: //将物品的编号、名称、价格、产地和数量分别定义为类中的私有成员
string num;
string name;
double price;
string area;
long count;
};
Goods::Goods() //构造函数,将物品编号、名称、价格、产地和数量分别初始化
{
num="xxx";
name="xxx";
price=0.00;
area="xxx";
count=0;
}
void Goods::first_face() //开始菜单界面
{
cout<<endl;
cout<<endl <<"\t\t>>>>>>>>>>>>>>>>物品库存管理系统<<<<<<<<<<<<<<<<<<<<\t\t"
<<endl<<"\t--------------------------系统菜单显示如下---------------------\t"
<<endl<<"\t\t¥¥"
<<endl<<"\t\t¥¥ 1. 物品入库 ¥¥"
<<endl<<"\t\t¥¥ 2. 物品出库 ¥¥"
<<endl<<"\t\t¥¥ 3. 物品修改 ¥¥"
<<endl<<"\t\t¥¥ 4. 物品统计 ¥¥"
<<endl<<"\t\t¥¥ 5. 物品查询 ¥¥"
<<endl<<"\t\t¥¥ 6. 退出系统 ¥¥"
<<endl<<"\t\t---------------------------------------------------" <<endl<<endl<<"\t\t";
system("color 70"); //将首页菜单界面背景设置为白色,字体为黑色
}
void Goods::ExitSystem() //用户结束程序
{
cout<<"欢迎下次使用"<<endl;
system("pause"); //pause大小写不影响,将程序暂停,输出"press any key to exit"防止程序立即闪退结束
exit(0); //退出程序(进程结束),'1'表示异常退出
}
void Goods::in_storage() //实现入库
{
cout<<endl;
cout<<"物品入库,请输入相关信息 :"<<endl;//分别输入物品入库的基本信息
cout<<"\t物品编号:";//由于入库功能属于成员函数所以可以直接调用物品类中的私有成员
cin>>num;
cout<<"\t物品名称:";
cin>>name;
cout<<"\t物品价格:";
cin>>price;
cout<<"\t物品产地:";
cin>>area;
cout<<"\t物品数量:";
cin>>count;
ofstream goodsFile("goods.txt", ios::app);//定义输出文件流对象goodsFile,
//用来打开goods.tet(如果没有就建一个空文件)这个文件,并且将物品入库信息写进文件尾
goodsFile<<setiosflags(ios::left)<<setw(20)<<num<<" "//实现在指定区域内左对齐写入文件
<<setw(15)<<name<<" "<<setw(10)<<price<<" "
<<setw(10)<<area<<" "<<setw(20)<<count << endl;
goodsFile.close();//打开文件之后就要关闭文件
cout<<endl<<endl<<"\t该商品已经入库......."<<endl<<endl<<"\t";
system("pause");//将程序暂停
system("cls");//实现清屏操作,将屏幕之前信息全部清空
}
void Goods::out_storage_ele()//实现物品出库
{
cout<<endl<<endl;
cout<<"\t============================================================="<<endl
<<"\t "<<endl
<<"\t 物 品 出 库 "<<endl
<<"\t "<<endl
<<"\t 1. 按物品编号出库 "<<endl
<<"\t "<<endl
<<"\t 2. 按物品名称出库 "<<endl
<<"\t "<<endl
<<"\t============================================================="<<endl<<endl<<"\t\t";
char select; //将用户选择操作类型定义为char类型
cout<<"请输入选择(1-2):";
cin>>select; //输入选择操作数字
switch(select)
{
case '1': //注意:因为选择操作为char类型,所以要带上单引号,int类型则不需要
out_storage_num();
break;
case '2':
out_storage_name();
break;
default: //输入其他数据时,暂停
break;
}
}
//思路:分别定义一个输入流对象和一个输出流对象,当输入出库物品名称与输入流对象中入库文件物品名称不匹配时,
//就将这些物品名称输入到输出流对象中的文件,名字一样的则不管,关闭文件(名字匹配的就可以被清空),
//再将输出流对象的文件物品信息输入到入库文件中即可
void Goods::out_storage_name() //按物品名称出库
{
cout<<endl<<"\t物品出库,输入出库商品信息 :"<<endl<<endl;
cout<<"\t物品名称 : ";
cin>>name; //输入需要出库的物品名称
ifstream goodsFile("goods.txt"); //定义输入文件流对象,打开入库文件
if(!goodsFile) //如果入库文件打不开,就输出仓库为空的信息
{
cout<<endl<<endl<<"\t仓存为空!!!!"<<endl<<endl<<"\t";
system("pause"); //暂停,待用户按任意键之后在执行下一步
system("cls"); //返回到开始菜单界面
return;
}
bool flag=false; //定义一个布尔类型的数据,初始值是false
string name1;//物品名
double price1;//价格
string num1;//物品编号
string area1;//产地
long count1 = 0; //物品数量
ofstream tempFile("j4y.txt"); //定义一个输出文件流对象
while(goodsFile>>num1>>name1>>price1>>area1>>count1)//分别依照次序打开入库文件中的信息
{
if(name1==name) //如果出库文件物品名称等于入库文件中的物品名称,布尔类型数据的值就为true
flag=true;
else //如果两者物品名称不匹配就将这些信息以左对齐的形式输入到输出文件流对象的文件中
{
tempFile<<setiosflags(ios::left)<<setw(20)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(10)<<area1<<" "<<setw(20)<<count1<<endl;
}
}
tempFile.close();//分别关闭两个文件
goodsFile.close();
if(!flag) //如果布尔类型的值没有改变,则告诉用户(输出)没有物品的信息
{
cout<<endl<<endl<<"\t仓库中没有这种物品!!!"<<endl<<endl<<"\t";
system("pause");
system("cls");
return;
}
ofstream goodsFile1("goods.txt");//分别打开两个文件,此时goods,txt为空文件,j4y.txt文件为删除对应物品后剩下的其余物品信息
ifstream tempFile1("j4y.txt");
goodsFile1<<tempFile1.rdbuf();//将j4y.txt文件中信息以标准输出流形式写入goods.txt文件中
goodsFile1.close();//关闭两个文件
tempFile1.close();
cout<<endl<<"\t这些物品已经出库"<<endl<<endl;
}
//同理可得,按照物品编号出库的成员函数原理与上面一样
void Goods::out_storage_num()
{
cout<<endl<<"\t物品出库,输入出库物品信息 : "<<endl<<endl;
cout<<"\t物品编号 :";
cin>>num;
ifstream goodsFile("goods.txt");
if(!goodsFile)
{
cout<<endl<<endl<<"\t仓存为空!!!!"<<endl<<endl<<"\t";
system("pause");
system("cls");
return;
}
bool flag=false;
string name1;//物品名
double price1;//价格
string num1;//物品编号
string area1;//产地
long count1=0; //物品数量
ofstream tempFile("j4y.txt");
while(goodsFile>>num1>>name1>>price1>>area1>>count1)
{
if(num1==num)
flag=true;
else
{
tempFile<<setiosflags(ios::left)<<setw(20)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(10)<<area1<<" "<<setw(20)<<count1<<endl;
}
}
tempFile.close();
goodsFile.close();
if(!flag)
{
cout<<endl<<endl<<"\t仓库中没有这种物品!!!"<<endl<<endl<<"\t";
system("pause");
system("cls");
return;
}
ofstream goodsFile5("goods.txt");
ifstream tempFile5("j4y.txt");
goodsFile5<<tempFile5.rdbuf();
goodsFile5.close();
tempFile5.close();
cout<<endl<<"\t这些物品已经出库"<<endl<<endl<<"\t";
}
void Goods::change_ele()//修改物品信息菜单界面
{
cout<<endl<<endl;
cout<<"\t============================================================="<<endl
<<"\t "<<endl
<<"\t 物 品 修 改 "<<endl
<<"\t "<<endl
<<"\t 1. 按物品编号修改 "<<endl
<<"\t "<<endl
<<"\t 2. 按物品名称修改 "<<endl
<<"\t "<<endl
<<"\t============================================================="<<endl<<endl<<"\t\t";
cout<<"请输入选择(1-2):";
char select;
cin>>select;
switch(select)
{
case '1':
change_num();
break;
case '2':
change_name();
break;
default:
break;
}
}
//思路:分别定义一个输入流对象和一个输出流对象,当输入出库物品编号与输入流对象中入库文件物品编号不匹配时,
//就将这些物品名称输入到输出流对象中的文件,名字一样的则不管,关闭文件(编号匹配的就可以被清空),
//再将输出流对象的文件物品信息输入到入库文件中,接着重新输入修改物品对应的各个信息即可
void Goods::change_num()
{
cout<<"\t请输入需要修改的商品编号 :";
cin>>num; //输入需改的物品编号
ifstream goodsFile("goods.txt"); //打开输入流文件进行操作
if(!goodsFile)
{
cout<<endl<<endl<<"\t仓存为空!!!!"<<endl<<endl<<"\t";
system("pause");
system("cls");
return;
}
bool flag=false;
string name1;//物品名
double price1;//价格
string num1;//物品编号
string area1;//产地
long count1=0; //物品数量
ofstream tempFile("j4y.txt");
while(goodsFile>>num1>>name1>>price1>>area1>>count1)
{
if(num1==num)
flag=true;
else
{
tempFile<<setiosflags(ios::left)<<setw(20)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(10)<<area1<<" "<<setw(20)<<count1<<endl;
}
}
tempFile.close();
goodsFile.close();
if(!flag)
{
cout<<endl<<endl<<"\t仓库中没有这种商品!!!"<<endl<<endl<<"\t";
system("pause");
system("cls");
return;
}
ofstream goodsFile1("goods.txt");
ifstream tempFile1("j4y.txt");
goodsFile1<<tempFile1.rdbuf();
goodsFile1.close();
tempFile1.close();
cout<<"\t新的商品编号:";
cin>>num1;
cout<<"\t新的商品名称:";
cin>>name1;
cout<<"\t新的商品价格:";
cin>>price1;
cout<<"\t新的商品产地:";
cin>>area1;
cout<<"\t新的商品数量:";
cin>>count1;
ofstream goodsFile2("goods.txt",ios::app);
goodsFile2<<setiosflags(ios::left)<<setw(20)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(10)<<area1<<" "<<setw(20)<<count1<<endl;
goodsFile2.close();
}
//原理如上
void Goods::change_name()
{
cout<<"\t请输入需要修改的商品名称 : ";
cin>>name;
ifstream goodsFile("goods.txt");
if(!goodsFile)
{
cout<<endl<<endl<<"\t仓存为空!!!!"<<endl<<endl<<"\t";
system("pause");
system("cls");
return;
}
bool flag=false;
string name1;//商品名
double price1;//价格
string num1;//仓库编号
string area1;//生产产地
long count1=0; //商品数量
ofstream tempFile("j4y.txt");
while(goodsFile>>num1>>name1>>price1>>area1>>count1)
{
if(name1==name)
flag=true;
else
{
tempFile << setiosflags(ios::left) << setw(20) << num1 << " "
<< setw(15) << name1 << " " << setw(10) << price1 << " "
<< setw(10) << area1 << " " << setw(20) << count1 << endl;
}
}
tempFile.close();
goodsFile.close();
if(!flag)
{
cout<<endl<<endl<<"\t仓库中没有这种商品!!!"<<endl<<endl<<"\t";
system("pause");
system("cls");
return;
}
ofstream goodsFile1("goods.txt");
ifstream tempFile1("j4y.txt");
goodsFile1<<tempFile1.rdbuf();
goodsFile1.close();
tempFile1.close();
cout<<"\t新的商品编号:";
cin>>num1;
cout<<"\t新的商品名称:";
cin>>name1;
cout<<"\t新的商品价格:";
cin>>price1;
cout<<"\t新的商品产地:";
cin>>area1;
cout<<"\t新的商品数量:";
cin>>count1;
ofstream goodsFile3("goods.txt",ios::app);
goodsFile3<<setiosflags(ios::left)<<setw(20)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(10)<<area1<<" "<<setw(20)<<count1<<endl;
goodsFile3.close();
}
void Goods::show() //将文件中的物品信息按左对齐方式输入到屏幕上
{
string name1;//商品名
double price1;//价格
string num1;//仓库编号
string area1;//生产产地
long count1=0; //商品数量
ifstream goodsFile4("goods.txt",ios::in);
cout<<"物品信息如下:"<<endl;
while(!(goodsFile4>>num1>>name1>>price1>>area1>>count1).eof())
{
cout<<setiosflags(ios::left)<<setw(20)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(10)<<area1<<" "<<setw(20)<<count1<<endl;
}
goodsFile4.close();
}
void Goods::selecct_ele() //物品查询菜单界面
{
cout<<endl<<endl;
cout<<"\t============================================================="<<endl
<<"\t "<<endl
<<"\t 物 品 查 询 "<<endl
<<"\t "<<endl
<<"\t 1. 按物品编号查询 "<<endl
<<"\t "<<endl
<<"\t 2. 按物品名称查询 "<<endl
<<"\t "<<endl
<<"\t 3. 按价格查询 "<<endl
<<"\t "<<endl
<<"\t 4. 按产地查询 "<<endl
<<"\t "<<endl
<<"\t============================================================="<<endl<<endl<<"\t\t";
cout<<"请输入选择(1-4):";
char select;
cin>>select;
switch(select)
{
case '1':
select_num();
break;
case '2':
select_name();
break;
case '3':
select_price();
break;
case '4':
select_area();
break;
default:
break;
}
}
//思路:打开入库文件,输入物品编号,当两者相匹配时,输出到屏幕上
void Goods::select_num()
{
cout<<endl<<"\t按商品编号查询 : "<<endl<<endl ;
cout<<"\t输入商品编号 : ";
cin>>num;
string name1;//商品名
double price1;//价格
string num1;//仓库编号
string area1;//生产产地
long count1=0; //商品数量
ifstream goodsFile("goods.txt");
if(!goodsFile)
{
cout<<endl<<endl<<"\t对不起,你的库存为空!!!"<<endl<<endl<<"\t";
return;
}
bool flag=false;
cout<<endl<<"商品编号 "<<"商品名字 "<<"商品价格 "<<"商品产地 "
<<"商品数量 "<<endl<<endl;
while(goodsFile>>num1>>name1>>price1>>area1>>count1)
{
if(num1==num)
{
flag=true;
cout<<setiosflags(ios::left)<<setw(15)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(20)<<area1<<" "<<setw(10)<<count1<<endl;
}
}
goodsFile.close();
if(!flag)
cout<<endl<<endl<<"对不起,库存中没有这种商品!!!";
cout<<endl<<endl;
system("pause");
system("cls");
}
void Goods::select_price()
{
cout<<endl<<"\t按商品价格查询 : "<<endl<<endl ;
cout<<"\t输入商品价格 :";
cin>>price;
string name1;//商品名
double price1;//价格
string num1;//仓库编号
string area1;//生产产地
long count1=0; //商品数量
ifstream goodsFile("goods.txt");
if(!goodsFile)
{
cout<<endl<<endl<<"\t对不起,你的库存为空!!!"<<endl<<endl<<"\t";
return;
}
bool flag=false;
cout<<endl<<"商品编号 "<<"商品名字 "<<"商品价格 "<<"商品产地 "
<<"商品数量 "<<endl<<endl;
while(goodsFile>>num1>>name1>>price1>>area1>>count1)
{
if(price1==price)
{
flag=true;
cout<<setiosflags(ios::left)<<setw(15)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(20)<<area1<<" "<<setw(10)<<count1<<endl;
}
}
goodsFile.close();
if(!flag)
cout<<endl<<endl<<"对不起,库存中没有这种商品!!!";
cout<<endl<<endl;
system("pause");
system("cls");
}
void Goods::select_area()
{
cout<<endl<<"\t按商品产地查询 :"<<endl<<endl;
cout<<"\t输入商品产地 :";
cin>>area;
string name1;//商品名
double price1;//价格
string num1;//仓库编号
string area1;//生产产地
long count1=0; //商品数量
ifstream goodsFile("goods.txt");
if(!goodsFile)
{
cout<<endl<<endl<<"\t对不起,你的库存为空!!!"<<endl<<endl<<"\t";
return;
}
bool flag=false;
cout<<endl<<"商品编号 "<<"商品名字 "<<"商品价格 "<<"商品产地 "
<<"商品数量 "<<endl<<endl;
while(goodsFile>>num1>>name1>>price1>>area1>>count1)
{
if(area1==area)
{
flag=true;
cout<<setiosflags(ios::left)<<setw(15)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(20)<<area1<<" "<<setw(10)<<count1<<endl;
}
}
goodsFile.close();
if(!flag)
cout<<endl<<endl<<"对不起,库存中没有这种商品!!!";
cout<<endl<<endl;
system("pause");
system("cls");
}
void Goods::select_name()
{
cout<<endl<<"\t按商品名字查询 :"<<endl<<endl ;
cout<<"\t输入商品名字 : ";
cin>>name;
string name1;//商品名
double price1;//价格
string num1;//仓库编号
string area1;//生产产地
long count1=0; //商品数量
ifstream goodsFile("goods.txt");
if(!goodsFile)
{
cout<<endl<<endl<<"\t对不起,你的库存为空!!!"<<endl<<endl<<"\t";
return;
}
bool flag=false;
cout<<endl<<"商品编号 "<<"商品名字 "<<"商品价格 "<<"商品产地 "
<<"商品数量 "<<endl<<endl;
while(goodsFile>>num1>>name1>>price1>>area1>>count1)
{
if(name1==name)
{
flag=true;
cout<<setiosflags(ios::left)<<setw(15)<<num1<<" "
<<setw(15)<<name1<<" "<<setw(10)<<price1<<" "
<<setw(20)<<area1<<" "<<setw(10)<<count1<<endl;
}
}
goodsFile.close();
if(!flag)
cout<<endl<<endl<<"对不起,库存中没有这种商品!!!";
cout<<endl<<endl;
system("pause");
system("cls");
}
int main() //主函数
{
int select=0; //选择操作数定义为int类型,不用加单引号
Goods good; //定义物品类对象
while(true) //一直做循环
{
good.first_face();
cout<<"请输入选择(1-6):";
cin>>select;
switch(select)
{
case 1:
good.in_storage();
break;
case 2:
good.out_storage_ele();
break;
case 3:
good.change_ele();
break;
case 4:
good.show();
break;
case 5:
good.selecct_ele();
break;
case 6:
good.ExitSystem();
break;
default:
system("cls");
break;
}
}
system("pause");
return 0;
}