C物品库存管理组织.docx
《C物品库存管理组织.docx》由会员分享,可在线阅读,更多相关《C物品库存管理组织.docx(39页珍藏版)》请在冰豆网上搜索。
C物品库存管理组织
实验内容
1.程序功能介绍
用文件系统实现的物品库存管理程序。
一种商品的品种里面包括三个品牌,以品种为单位,可以实现商品品种的添加、删除、查找、显示等功能。
2.课程设计要求
(1)组成商品品种的品牌不限数量,设置一个最大值(比如10),增加一个成员变量指示品牌的具体数量。
商品品种的数量是每个品牌的数量之和。
(2)设计输出每日进货与出货的统计表,要求进货与出货分别为两个文本文件,清单上列有进出货物的时间、品种描述,具体品牌的进出货数量,如果是出货清单,在每笔出货的清单后还要有该次提取货物的总价格。
(3)商品品种以品种代码的顺序存放。
3.程序设计思想
该设计比较复杂,要对原程序做较大的修改,首先是数据的存放形式,因为要求数据按代码的顺序存放,并且进出货时对数据的各个组成成员都要做较大的修改。
如果要用文件的形式存放,那么文件的读写就非常频繁,而且要使用大量的临时文件,因此建议使用链表的形式存放数据,在程序开始运行时读取固定文件中的数据,程序运行时全部数据都在内存进行操作。
在程序运行结束前再将链表中的数据存放在原来的文件中,供下次运行程序时读取。
建议首先将文件读取这部分程序调试好,这样在调试程序时就不用每次都从键盘输入数据了,可以节省大量的时间。
同时,对链表中结点的操作有很多典型的程序可以参考,不同的结点只是数据部分类型不同,所以只要在上面稍加修改就可以使用。
(1)类的封装
由于数据的存放形式使用链表的形式,所以对于程序的很多操作实际上都是要求对链表进行一系列处理。
其中吧Citem类作为一个结点,因此包含了大量对链表进行操作的函数,为了满足程序的完整性与可读性,应将对链表操作的所有程序封装在一起。
classBrand//品牌类
{
......
friendclassCItem;//定义品种类为友元类
};
classCNode//结点类
{......
friendclassCList;//定义链表类为友元类
};
注:
省略部分详见源程序代码及课程设计教材提示部分
(2)程序功能菜单的设置
程序主题采用菜单选项的形式,输入相应的菜单选项后程序可以反复运行,而其中还要求3.4.5.6.项各有一个菜单,分别是:
按照商品品种名称和按照商品代码进行操作。
&物品库存管理系统&
**************************************************
1.添加商品品种
2.显示商品品种
3.查询商品
4.删除商品
5.商品出库
6.商品进库
0.退出系统
***************************************************
4.设计中所负责的部分————商品的出库与入库部分
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();
}
5.课程设计遇到的技术问题与解决思路
1.在实际操作中,可能会因错误而输入错误的字符,这时可能会对程序的正常运行造成影响,所以必须刷新输入流清除储存器中的数据,经过翻阅C语言方面的资料发现使用以下函数就可实现。
inlineistream&Flush(istream&stream)
{
stream.clear();
intchars_to_skip=stream.rdbuf()->in_avail();
returnstream.ignore(chars_to_skip);
}
2.怎样实现按任意键回到主菜单。
为了使程序的可读性和使用的方便性更好,设计程序时,打算增加此功能。
在设计过程中,试图通过一段程序实现,但始终都要输入一个字符后按回车键才行,表面上已经实现了此功能,但其实并没有达到预期的效果。
过了几天,在网上查找相关资料,终于在别人设计的一个小程序里面找到代码,原来只需要在利用库函数里面的一函数system(),当然这里要包含头文件dos.h,程序中加入system(“pause”)即可达到要求。
3.为保证程序界面的美观,如何清屏?
在图书馆查阅了有关方面的书籍和文献,利用网络资源,使用函数system("cls")即可。
程序完整代码
#include
#include
#include
#include
#include
#include
#include
#include
#include//exit
(1)
time_ttimer;
inlineistream&Flush(istream&stream)//清除储存器中数据
{
stream.clear();
intchars_to_skip=stream.rdbuf()->in_avail();
returnstream.ignore(chars_to_skip);
}
#defineMAX10//运用宏定义,规定品牌数最大为10
classBrand//品牌类
{
private:
charbrnd_name[20];//品牌名称
intBrand_code;//品牌代号
intquantity;//数量
floatbrnd_price;//价格
public:
Brand(){quantity=0;strcpy(brnd_name,"0");}
friendclassCItem;//定义友元类
};
ClassCItem//品种类
{
private:
charItem_name[10];//品种名称
intItem_code;//品种代号
charcolour[10];//颜色
intquantity;//数量
Brandbrnd[MAX];//最多MAX个品牌
intnBrnd;//品牌的数量(public:
CItem(){strcpy(Item_name,"\0");quantity=0;nBrnd=0;}//缺省构造函数
CItem(char*name){strcpy(Item_name,name);Item_code=0;}//用品种名称构造
CItem(intcode){Item_code=code;strcpy(Item_name,"\0");}//用品种代码构造
intSetItem(intn=0);//置品种数据,正确返回1,当n为1时,是新进货物,输出至出清单文件
char*GetItemName(){returnItem_name;}//返回品种名
intGetItemCode(){returnItem_code;}//返回品种代码
intCompare(CItem&);//比较品种名称,供查找用,比较结果为1,0
intCompareCode(CItem&);//比较品种代码,比较结果为1,0
voidShow();//显示品种数据
voidOutModify();//出货,修改结点中的数据部分
voidInModify();//已有商品,再次进货,修改结点中的数据部分
};
intCItem:
:
Compare(CItem&pitem)//比较品种名称,供查找用,比较结果为1,0
{
intn;
n=strcmp(Item_name,pitem.Item_name);//两个字符串相等,n=0
if(n!
=0)return0;
elsereturn1;
}
intCItem:
:
CompareCode(CItem&pitem)//比较品种代码,比较结果为1,0
{
return(Item_code==pitem.Item_code);
}
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();
}
re