物品库存管理课程设计报告.docx
《物品库存管理课程设计报告.docx》由会员分享,可在线阅读,更多相关《物品库存管理课程设计报告.docx(20页珍藏版)》请在冰豆网上搜索。
物品库存管理课程设计报告
南京理工大学紫金学院VC++课程设计报告
课程:
VC++课程设计
系别:
计算机系
班级:
计科一班
学号:
120601105
姓名:
付瑞
课题名称:
物品库存管理
起止时间:
2013.11.26~2013.12.11
指导教师:
朱俊
2013年12月
1.程序功能介绍
用文件系统实现的物品库存管理程序。
一种商品的品种里面包括(<10个)品牌,以品种为单位,可以实现商品品种的添加、删除、查找、显示,以及商品的进货,出货等功能。
2.课程设计要求
(1)组成商品品种的品牌不限数量,设置一个最大值(比如10),增加一个成员变量指示品牌的具体数量。
商品品种的数量是每个品牌的数量之和。
(2)设计输出每日进货与出货的统计表,要求进货与出货分别为两个文本文件,清单上列有进出货物的时间、品种描述,具体品牌的进出货数量,如果是出货清单,在每笔出货的清单后还要有该次提取货物的总价格。
(3)商品品种以品种代码的顺序存放。
3.对课程题目的分析
该设计比较复杂,要对原程序做较大的修改,首先是数据的存放形式,因为要求数据按代码的顺序存放,并且进出货时对数据的各个组成成员都要做较大的修改。
如果要用文件的形式存放,那么文件的读写就非常频繁,而且要使用大量的临时文件,因此建议使用链表的形式存放数据,在程序开始运行时读取固定文件中的数据,程序运行时全部数据都在内存进行操作。
在程序运行结束前再将链表中的数据存放在原来的文件中,供下次运行程序时读取。
建议首先将文件读取这部分程序调试好,这样在调试程序时就不用每次都从键盘输入数据了,可以节省大量的时间。
同时,对链表中结点的操作有很多典型的程序可以参考,不同的结点只是数据部分类型不同,所以只要在上面稍加修改就可以使用。
4.程序设计和说明(说明算法思想、设计思路,给出重要的、关键的代码)
(1)类的封装
由于数据的存放形式使用链表的形式,所以对于程序的很多操作实际上都是要求对链表进行一系列处理。
其中吧Citem类作为一个结点,因此包含了大量对链表进行操作的函数,为了满足程序的完整性与可读性,应将对链表操作的所有程序封装在一起。
classBrand//品牌类
{
......
friendclassCItem;//定义品种类为友元类
};
classCNode//结点类
{......
friendclassCList;//定义链表类为友元类
};
classcoustomer//客户类
{
......
};
(2)程序功能菜单的设置
程序主题采用菜单选项的形式,输入相应的菜单选项后程序可以反复运行,而其中还要求3.4.5.6.8.9.项各有一个菜单,分别是:
按照商品品种名称和按照商品代码进行操作。
********************************************
*¥欢迎使用物品库存管理系统¥*
**
*设计者付瑞*
**
*指导老师朱俊*
**
********************************************
详细目录
1.添加商品品种2.显示商品品种
3.查询商品4.删除商品
5.商品出库6.商品进库
7.添加客户8.删除客户
9.查询客户10.显示客户资料
0.退出系统
输入选择:
intCItem:
:
SetItem(intn)//置品种数据,正确返回1,当n为1时,是新进货物,输出至出清单文件
{
cout<<"\n输入商品名称:
";
Flush(cin);
cin.getline(Item_name,20);
cout<<"\n输入商品代码:
";
cin>>Item_code;
cout<<"\n输入商品颜色:
";
Flush(cin);
cin.getline(colour,20);
cout<<"\n输入品牌数:
"<<"(不超过"<cin>>nBrnd;
//循环实现品牌数据的输入,count为商品总数
for(inti=0,count=0;i{
cout<<"\n输入品牌"<
cout<<"\n输入品牌名称:
";
Flush(cin);
cin.getline(brnd[i].brnd_name,20);
cout<<"\n输入品牌代码:
";
cin>>brnd[i].Brand_code;
cout<<"\n输入数量:
";
cin>>brnd[i].quantity;
cout<<"\n输入价格:
";
cin>>brnd[i].brnd_price;
count+=brnd[i].quantity;
}
quantity=count;
if(n==1)
{
ofstreamfile("进货清单.txt",ios:
:
out|ios:
:
ate);
if(!
file)
{
cout<<"错误,不能打开文件.";
getch();
exit
(1);
}
timer=time(NULL);
file<file<<"品种"<<"\t"<<"代码"<<"\t"<<"颜色"<<"\n";
file<file<<"品牌"<<"\t"<<"代码"<<"\t"<<"数量"<<"\t"<<"价格"<<"\n";
for(inti=0;i{
file<<}
file<<"\n";
file.close();
}
return1;
}此函数的两个功能:
第一个是在添加商品时从键盘输入商品的各种数据,调用这个功能时利用n的缺省值,在调用时不给n赋值;第二个是在进货时如果进的是新的品种,那么也要从键盘输入这个品种的各种数据,这部分与第一个功能相同,但是进货要输出进货清单,所以进货功能调用该函数时n设置为1,函数在运行时增加一个判断语句,若n为1时,将所键入的数据输出至进货清单。
voidCItem:
:
Show()//显示品种数据
{
cout<<"品种"<<"\t"<<"代码"<<"\t"<<"颜色"<<"\n";
cout<cout<<"品牌"<<"\t"<<"代码"<<"\t"<<"数量"<<"\t"<<"价格"<<"\n";
for(inti=0;i{
cout<<}
cout<<"\n\n"<system("pause");
cout<<"\n";
}
这个函数也是与出货功能有关,与InModify()的函数类似。
因为是库中的商品出货,所以商品品种必须存在,若不存在,则输出提示信息,出货失败。
还有一种可能是商品品种曾经存在,但已经全部出完了,这时,该品种的各种数据还存在,只是数量为零。
所以,在函数开始执行时要判断库存量是否为零,若为零,则输出提示信息,出货失败。
在出货成功结束时同样要将本品种的各种品牌的出货数据输出到出货清单中。
同样,该函数也是对链表中所存在的结点的数据部分的修改。
voidCItem:
:
OutModify()//出货,修改结点中的数据部分
{
intchoice,count,chuhuo,price=0;//chuhuo为出货量,price为总价格
int*num;
num=newint[nBrnd];
if(quantity==0)
{
cout<<"数量为0.";
exit
(1);
}
for(inti=0;i{
num[i]=brnd[i].quantity;
}
cout<<"品牌"<<"\t"<<"代码"<<"\t"<<"数量"<<"\t"<<"价格"<<"\n";
for(i=0;i{
cout<
<}
cout<<"\n\n";
cout<<"输入数字选择出货商品或按0退出.\n";
cin>>choice;
while(choice>=1&&choice<=nBrnd)
{
cout<<"输入商品数量:
";
cin>>count;
while(count>brnd[choice-1].quantity)
{
cout<<"库存不足,重新输入:
";
cin>>count;
}
brnd[choice-1].quantity-=count;
cout<<"出货成功,按0退出或按数字继续出货.\n";
cin>>choice;
}
ofstreamfile("出货清单.txt",ios:
:
out|ios:
:
ate);
if(!
file)
{
cout<<"错误,不能打开文件.";
getch();
exit
(1);
}
timer=time(NULL);
file<file<<"品种"<<"\t"<<"代码"<<"\t"<<"颜色"<<"\n";
file<file<<"品牌"<<"\t"<<"代码"<<"\t"<<"价格"<<"\t"<<"出货量"<<"\n";
for(i=0;i{
if(chuhuo=num[i]-brnd[i].quantity)
{
price=chuhuo*brnd[i].brnd_price;
file<<}
}
file<<"总价格为:
"<delete[]num;
file.close();
}
InModify()同样也与进货功能有关。
因为所进的品种可能是也有的品种,只是增加其中的数量而已。
所以,在输入进货品种或品种代码时要判断是否是库中已有的品种,若是就调用这个函数,只从键盘输入具体的品牌数量或新增品牌数据即可,而不用在键入品种的各种数据,同时,新键入的各种数据也输出到进货清单。
实际上该函数是对链表中所存在的结点的数据部分的修改。
此函数先判断出货量是不是大于库存量,如果大于将显示“库存不足,重新输入”。
如果小于的话将会继续程序,通过brnd[choice-1].quantity-=count;把原有量减去省下剩余量。
voidCItem:
:
InModify()//已有商品,再次进货,修改结点中的数据部分
{
charname[20];
charchoice;
intcount,jinhuo=0;
intprenBrnd=nBrnd;//原先品牌数
intn=1;//用于判断是否继续进货
intflag=0;//用于判断是否新品牌
int*num;
num=newint[prenBrnd];
for(inti=0;i{
num[i]=brnd[i].quantity;
}
while(n)
{
cout<<"\n\n输入品牌名称:
";
Flush(cin);
cin.getline(name,20);
for(inti=0;i{
if(strcmp(brnd[i].brnd_name,name)==0)
{
cout<<"\n\n输入进货数量:
";
cin>>count;
brnd[i].quantity+=count;
quantity+=count;
flag=1;
break;
}
}
if(flag==0)
{
strcpy(brnd[nBrnd].brnd_name,name);
cout<<"\n输入品牌代码:
";
cin>>brnd[nBrnd].Brand_code;
cout<<"\n输入数量:
";
cin>>brnd[nBrnd].quantity;
cout<<"\n输入价格:
";
cin>>brnd[nBrnd].brnd_price;
quantity+=brnd[nBrnd].quantity;
nBrnd++;
}
cout<<"\n继续进货:
y/n";
cin>>choice;
if(choice=='y'||choice=='Y')
n=1;
elsen=0;
}
ofstreamfile("进货清单.txt",ios:
:
out|ios:
:
ate);
if(!
file)
{
cout<<"错误,不能打开文件.";
getch();
exit
(1);
}
timer=time(NULL);
file<file<<"品种"<<"\t"<<"代码"<<"\t"<<"颜色"<<"\n";
file<file<<"品牌"<<"\t"<<"代码"<<"\t"<<"价格"<<"\t"<<"进货量"<<"\n";
for(i=0;i{
if(jinhuo=brnd[i].quantity-num[i])
{
file<<}
}
if(nBrnd>prenBrnd)
{
for(i=prenBrnd;i{
file<<}
}
file<<"\n\n";
delete[]num;
file.close();
}
voidadd()这个函数实现添加客户资料功能。
创建了一个“客户资料”文件,从键盘输入客户资料,再将客户的资料传到文件中,从而实现添加的功能。
voidcustomer:
:
add()//加入客户资料
{
ofstreamfile("客户资料.txt",ios:
:
out|ios:
:
ate);
if(!
file)
{
cout<<"错误,无法打开文件";
getch();
exit
(1);
}
customerp2;
p2.getdata();//从键盘输入客户资料
//将该客户的资料传到文件中
file.write(reinterpret_cast(&p2),sizeof(customer));//reinterpret_cast将其他类型的数据转换为字符指针
}
voidshowab()这个函数实现的是显示客户资料的功能。
首先以输入方式打开文件,读取“客户资料”文件,再读取,从而实现显示的功能。
voidcustomer:
:
showab()//全部显示
{
ifstreamfile("客户资料.txt",ios:
:
in);//以输入方式打开文件
if(!
file)
{
cout<<"错误,无法打开文件";
getch();
exit
(1);
}
customerp2;
file.read(reinterpret_cast(&p2),sizeof(customer));//读取文件内容
while(!
file.eof())//读入正确,显示,接着读取
{
p2.showdata();
getch();
file.read(reinterpret_cast(&p2),sizeof(customer));
}
}
voidsearch()这个函数实现的是查询客户资料的功能。
增加了一个子菜单,选择是按客户名称查询,或者是按客户代码查询,亦或者是退出。
同样的,我们所需的数据是要从“客户资料”文件中读取的。
voidcustomer:
:
search()//搜索
{
charname1[10];
intcode;
intchoice;
cout<<"\n\n1.按客户名称查询";
cout<<"\n\n2.按客户代码查询";
cout<<"\n\n0.退出";
cout<<"\n\n输入选择:
";
cin>>choice;
switch(choice)
{
case1:
cout<<"\n\n输入客户名称:
";
cin>>name1;
code=0;
break;
case2:
cout<<"\n\n输入客户代码:
";
cin>>code;
strcpy(name1,"null");
break;
}
fstreamfile("客户资料.txt",ios:
:
in);
if(!
file)
{
cout<<"错误,无法打开文件";
getch();
exit
(1);
}
charflag='a';
customerp2;
file.read(reinterpret_cast(&p2),sizeof(customer));
while(!
file.eof())
{
if((strcmp(p2.customer_name,name1)==0)||(p2.customer_code==code))
{
p2.showdata();
getch();
flag='z';
break;
}
file.read(reinterpret_cast(&p2),sizeof(customer));
}
if(flag!
='z')
{
cout<<("\n\n客户未找到\n\n");
getch();
}
}
voidremove()这个函数实现的是删除客户资料的功能。
和search函数一样,也是添加了一个子菜单,打开文件,若文件存在,则删除原文件,否则显示,“错误文件无法打开”,依次读取文件内容,将未删除的文件写入temp中,然后再将temp文件中的内容写回file1中。
voidcustomer:
:
remove()//删除客户
{
charname1[10];
intcode;
intchoice;
cout<<"\n\n1.按客户名称删除";
cout<<"\n\n2.按客户代码删除";
cout<<"\n\n0.退出";
cout<<"\n\n输入选择:
";
cin>>choice;
if(choice==1)
{
cout<<"\n\n输入客户名称:
";
cin>>name1;
code=0;
}
else
{
cout<<"\n\n输入客户代码:
";
cin>>code;
strcpy(name1,"null");
}
ifstreamfile("客户资料.txt",ios:
:
in);
ofstreamtemp("delete2.txt",ios:
:
trunc);
if(!
file||!
temp)
{
cout<<"\n无法打开文件\n";
getch();
exit
(1);
}
file.seekg(0);
temp.seekp(0);
customerp2;
file.read(reinterpret_cast(&p2),sizeof(customer));
while(!
file.eof())
{
if((strcmp(name1,p2.customer_name)==0)||(code==p2.customer_code))
{
file.read(reinterpret_cast(&p2),sizeof(customer));
}
else
{
temp.write(reinterpret_cast(&p2),sizeof(customer));//将未删除的文件写入temp中
file.read(reinterpret_cast(&p2),sizeof(customer));
}
}
file.close();
temp.close();
ifstreamtemp1("delete2.txt",ios:
:
in);
ofstreamfile1("客户资料.txt",ios:
:
trunc);
temp1.seekg(0);file1.seekp(0);
temp1.read(reinterpret_cast