资源描述
目录
一、系统开发的背景 1
二、系统分析与设计 1
(一)、系统功能要求 1
(二)、系统模板设计 1
三、系统的设计与实现 2
(一)产品信息存储:Int cunchu(sqmountlink &L) 2
(二)产品添加:void product_leitianjia(sqmountlink &L,int n) 7
(三)、产品查询chaxun(sqmountlink &L,char pkindname3[],char pname3[]) 11
(四)、产品的打印输出void xianshi(sqmountlink &L) 13
(五)、菜单显示模块 void caidan_caozuo( ) 14
(六)、主函数控制 void main( ) 15
四、系统的测试 17
测试product_leitianjia(sqmountlink &L,int n)函数 17
测试product_tianjia(sqmountlink &L,char pkindname2[],int n)函数 18
测试chaxun(sqmountlink &L,char pkindname3[],char pname3[])函数 18
测试退出函数 19
五、总结 19
六、附件(代码、部分图表) 20
(一)源代码 20
(二)、部分图表 27
产品进销存管理系统
一、系统开发的背景
为了方便管理员对于仓库产品的销售和进货情况的了解,因此需要开发一个商品管理系统来帮助管理员查询仓库产品的情况,管理员就可以对产品的进货、销售、货存情况等信息有一个详细的了解。
二、系统分析与设计
(一)、系统功能要求
针对某一种行业的库房的产品进销存情况进行管理。
(1):可以进行产品类的添加、产品的添加、产品数量的添加;(2):能够查询库房每种产品的总量、进货日期、销出数量、销售时间等;
(二)、系统模板设计
通过对系统功能的分析产品进销管理系统的功能如下图所示。
产品进销存管理系统
主函数控制模块
菜单显示模块
产品打印输出模块
产品查询管理模块
产品添加管理模块
产
品信息储存模块
图1.产品进销管理系统功能图
通过上图的功能分析,把整个系统划分为六个模块:
1.产品信息存储,该模块主要实现: 创建数据库系统用于储存产品的相关信息,如每种产品的总量、进货日期、销出数量、销售时间等,借助函数Int cunchu(sqmountlink &L)来实现;
2.产品添加, 该模块主要实现: 添加产品的相关信息,如产品类、产品、产品数量、进货日期、销出数量、销售时间等,借助函数:void product_leitianjia(sqmountlink&L,intn) product_leigeshutianjia(sqmountlink &L,char pkindname2[],int n) void product_zongliangtianjia(sqmountlink &L,charpkindname1[],charpname1[],intn)voidxiaochushuliangtianjia(sqmountlink &L,char pkindname4[],char pname4[],int n)来实现;
3.产品查询, 该模块主要实现: 查询产品相关信息,比如每种产品的总量、进货日期、销出数量、销售时间等,借助函数void chaxun(sqmountlink &L,char pkindname3[],char pname3[])来实现;
4.产品的打印输出, 该模块主要实现: 对查询到的产品的一些相关信息进行打印输出,借助函数void xianshi(sqmountlink &L)来实现;
5.菜单显示模块, 该模块主要实现: 对菜单整体情况和布局进行显示,并显示出出它的各项功能:添加功能,查询功能以及退出菜单, 借助函数void caidan_operation()来实现;
6. 主函数控制, 该模块主要实现: 对各部分的分工和控制和执行作用, 借助函数void main()来实现;
三、系统的设计与实现
(一)产品信息存储:Int cunchu(sqmountlink &L)
分析:首先编写相关文件头建立结构体,然后用链表创建数据库系统用于储存产品的相关信息流程图如下图2所示。
产品信息存储
向链表中添加产品信息
向链表中输入产品信息
输出产品信息
图2.产品信息储存流程图
该模块的具体代码如下所示。
int cunchu(sqmountlink &L)//创建数据库系统用于储存产品的相关信息,如每种产品的总量、进货日期、销出数量、销售时间等
{ //初始化一个空的顺序表挂接链表L
int i;
L.kindelem=(kindlnode*)malloc(SQMOUNTLINK_INIT_SIZE*sizeof(kindlnode));
if(!L.kindelem) exit(overflow);
L.length=0;
L.listsize=SQMOUNTLINK_INIT_SIZE;
for(i=0;i<L.listsize;i++)
{
(L.kindelem[i]).firstproduct=NULL;
}
return ok;
}//存储
int product_leitianjia(sqmountlink &L,int n)
{ //向顺序表挂接链表L中添加N类产品
int i;
kindlnode *newbase;
if(L.length+n>=L.listsize)
{
newbase=(kindlnode*)realloc(L.kindelem,(L.listsize+n)*sizeof(kindlnode));
if(!newbase) exit(overflow);
L.kindelem=newbase;
L.listsize+=n;
}
printf("需添加的产品类名称:\n");
for(i=0;i<n;i++)
{
scanf("%s",&L.kindelem[L.length].pkindname);
L.kindelem[L.length].firstproduct=NULL;
L.length++;
}
return ok;
}//产品类添加
int product_leigeshutianjia(sqmountlink &L,char pkindname2[],int n)
{ //向顺序表挂接链表L的某产品类中添加N个产品
plinklist p,q;
int k,j;
for(k=0;k<L.length;k++)
{
if(strcmp((L.kindelem[k]).pkindname,pkindname2)!=0)
continue;
else
break;
}
if(L.kindelem[k].firstproduct==NULL)
{
q=(plinklist)malloc(sizeof(productlnode));
printf("输入此产品类所含产品的产品名称:");
scanf("%s",&((*q).pname));
printf("输入此产品类所含产品的产品总量(个):");
scanf("%d",&((*q).total_quantity));
printf("输入此产品类所含产品的进货日期(年-月-日):");
scanf("%d,%d,%d",&(((*q).buy_date).year),&(( (*q).buy_date).month),&(( (*q).buy_date).day));
printf("输入此产品类所含产品的销数出量(个):");
scanf("%d",&((*q).sales_quantity));
printf("输入此产品类所含产品的销售时间(年-月-日):");
scanf("%d,%d,%d",&(((*q).sales_time).year),&(( (*q).sales_time).month),&(( (*q).sales_time).day));
(*q).nextproduct=NULL;
(L.kindelem[k]).firstproduct=q;
for(j=1;j<n;j++)
{
p=(plinklist)malloc(sizeof(productlnode));
printf("输入此产品类所含产品的产品名称:");
scanf("%s",&((*q).pname));
printf("输入此产品类所含产品的产品总量(个):");
scanf("%d",&((*q).total_quantity));
printf("输入此产品类所含产品的进货日期(年-月-日):");
scanf("%d,%d,%d",&(((*q).buy_date).year),&(( (*q).buy_date).month),&(( (*q).buy_date).day));
printf("输入此产品类所含产品的销数出量(个):");
scanf("%d",&((*q).sales_quantity));
printf("输入此产品类所含产品的销售时间(年-月-日):");
scanf("%d,%d,%d",&(((*q).sales_time).year),&(( (*q).sales_time).month),&(( (*q).sales_time).day));
(*p).nextproduct=(*q).nextproduct;
(*q).nextproduct=p;
q=p;
}
}
else
{
for(q=L.kindelem[k].firstproduct; ;q=(*q).nextproduct)
{
if(!((*q).nextproduct))
break;
}
printf("需添加产品的名称、总量(个)、进货日期(年-月-日)、销出数量(个)、销售时间(年-月-日):\n");
for(j=0;j<n;j++)
{
p=(plinklist)malloc(sizeof(productlnode));
scanf("%s %d %d,%d,%d %d %d,%d,%d",&((*p).pname),&( (*p).total_quantity),&(( (*p).buy_date).year),&(( (*p).buy_date).month),&(( (*p).buy_date).day),&( (*p).sales_quantity),&(( (*p).sales_time).year),&(( (*p).sales_time).month),&(( (*p).sales_time).day));
(*p).nextproduct=(*q).nextproduct;
(*q).nextproduct=p;
q=p;
}
}
return ok;
}//产品类个数添加
void product_zongliangtianjia(sqmountlink &L,char pkindname1[],char pname1[],int n)//添加产品的相关信息,如产品类、产品、产品数量、进货日期、销出数量、销售时间等。
{ //添加顺序表挂接链表L的某产品类中的某产品的总量,且需添加的产品总量为n
int i,k;
plinklist p;
for(i=0;i<L.length;i++)
{
if(strcmp((L.kindelem[i]).pkindname,pkindname1)!=0)
continue;
else
break;
}
if(i<L.length)
{
for(p=L.kindelem[i].firstproduct;p!=NULL;p=p->nextproduct)
{
k=strcmp(p->pname,pname1);
if(k==0)
{
(*p).total_quantity=(*p).total_quantity+n;
printf("查看添加后产品的各项输出:%s %d %d,%d,%d %d %d,%d,%d\n",(*p).pname, (*p).total_quantity,( (*p).buy_date).year,( (*p).buy_date).month,( (*p).buy_date).day, (*p).sales_quantity,( (*p).sales_time).year,( (*p).sales_time).month,( (*p).sales_time).day);
}
}
}
}//产品总量添加
void xiaochushuliangtianjia(sqmountlink &L,char pkindname4[],char pname4[],int n)
{ //添加顺序表挂接链表L的某产品类中的某产品销出数量,且销出的数量n
int i,k;
plinklist p;
for(i=0;i<L.length;i++)
{
if(strcmp((L.kindelem[i]).pkindname,pkindname4)!=0)
continue;
else
break;
}
if(i<L.length)
{
for(p=L.kindelem[i].firstproduct;p!=NULL;p=(*p).nextproduct)
{
k=strcmp((*p).pname,pname4);
if(k==0)
{
(*p).sales_quantity=(*p).sales_quantity+n;
printf("查看添加后产品的各项输出:%s %d %d,%d,%d %d %d,%d,%d\n",(*p).pname, (*p).total_quantity,( (*p).buy_date).year,( (*p).buy_date).month,( (*p).buy_date).day, (*p).sales_quantity,( (*p).sales_time).year,( (*p).sales_time).month,( (*p).sales_time).day);
}
}
}
}//ProQuantity_subtract
void chaxun(sqmountlink &L,char pkindname3[],char pname3[])//查询产品相关信息,比如每种产品的总量、进货日期、销出数量、销售时间等
{ //在顺序表挂接链表L中,查询属于某产品类的某产品的各项信息
int i,k;
plinklist p;
for(i=0;i<L.length;i++)
{
if(strcmp((L.kindelem[i]).pkindname,pkindname3)!=0)
continue;
else
break;
}
if(i<L.length)
{
for(p=L.kindelem[i].firstproduct;p!=NULL;p=(*p).nextproduct)
{
k=strcmp((*p).pname,pname3);
if(k==0)
break;
}
if(k!=0)
printf("此产品不存在:\n");
else
{
printf("产品类、产品、产品总量(个)、进货日期(年-月-日)、销出数量(个)、销售时间(年-月-日)\n");
printf("%s %s %d %d,%d,%d %d %d,%d,%d\n",(L.kindelem[i]).pkindname, (*p).pname, (*p).total_quantity,( (*p).buy_date).year,( (*p).buy_date).month,( (*p).buy_date).day, (*p).sales_quantity,( (*p).sales_time).year,( (*p).sales_time).month,( (*p).sales_time).day);
}
}
(二)产品添加:void product_leitianjia(sqmountlink &L,int n)
分析:首先向链表中添加产品信息,产品的类、产品、产品数量、进货日期、销出数量、销出日期,然后输出。流程图如下图3.所示。
产品的添加
产品类
产品名称
产品总量
进货日期
销出数量
销售时间
输 出
图3.产品添加流程图
该模块的具体代码如下所示。
int product_leitianjia(sqmountlink &L,int n) //添加产品的相关信息,如产品类、产品、产品数量、进货日期、销出数量、销售时间等。
//添加顺序表挂接链表L的某产品类中的某产品的总量,且需添加的产品总量为n
{ //向顺序表挂接链表L中添加N类产品
int i;
kindlnode *newbase;
if(L.length+n>=L.listsize)
{
newbase=(kindlnode*)realloc(L.kindelem,(L.listsize+n)*sizeof(kindlnode));
if(!newbase) exit(overflow);
L.kindelem=newbase;
L.listsize+=n;
}
printf("需添加的产品类名称:\n");
for(i=0;i<n;i++)
{
scanf("%s",&L.kindelem[L.length].pkindname);
L.kindelem[L.length].firstproduct=NULL;
L.length++;
}
return ok;
}//产品类添加
int product_leigeshutianjia(sqmountlink &L,char pkindname2[],int n)
{ //向顺序表挂接链表L的某产品类中添加N个产品
plinklist p,q;
int k,j;
for(k=0;k<L.length;k++)
{
if(strcmp((L.kindelem[k]).pkindname,pkindname2)!=0)
continue;
else
break;
}
if(L.kindelem[k].firstproduct==NULL)
{
q=(plinklist)malloc(sizeof(productlnode));
printf("输入此产品类所含产品的产品名称:");
scanf("%s",&((*q).pname));
printf("输入此产品类所含产品的产品总量(个):");
scanf("%d",&((*q).total_quantity));
printf("输入此产品类所含产品的进货日期(年-月-日):");
scanf("%d,%d,%d",&(((*q).buy_date).year),&(( (*q).buy_date).month),&(( (*q).buy_date).day));
printf("输入此产品类所含产品的销数出量(个):");
scanf("%d",&((*q).sales_quantity));
printf("输入此产品类所含产品的销售时间(年-月-日):");
scanf("%d,%d,%d",&(((*q).sales_time).year),&(( (*q).sales_time).month),&(( (*q).sales_time).day));
(*q).nextproduct=NULL;
(L.kindelem[k]).firstproduct=q;
for(j=1;j<n;j++)
{
p=(plinklist)malloc(sizeof(productlnode));
printf("输入此产品类所含产品的产品名称:");
scanf("%s",&((*q).pname));
printf("输入此产品类所含产品的产品总量(个):");
scanf("%d",&((*q).total_quantity));
printf("输入此产品类所含产品的进货日期(年-月-日):");
scanf("%d,%d,%d",&(((*q).buy_date).year),&(( (*q).buy_date).month),&(( (*q).buy_date).day));
printf("输入此产品类所含产品的销数出量(个):");
scanf("%d",&((*q).sales_quantity));
printf("输入此产品类所含产品的销售时间(年-月-日):");
scanf("%d,%d,%d",&(((*q).sales_time).year),&(( (*q).sales_time).month),&(( (*q).sales_time).day));
(*p).nextproduct=(*q).nextproduct;
(*q).nextproduct=p;
q=p;
}
}
else
{
for(q=L.kindelem[k].firstproduct; ;q=q->nextproduct)
{
if(!((*q).nextproduct))
break;
}
printf("需添加产品的名称、总量(个)、进货日期(年-月-日)、销出数量(个)、销售时间(年-月-日):\n");
for(j=0;j<n;j++)
{
p=(plinklist)malloc(sizeof(productlnode));
scanf("%s %d %d,%d,%d %d %d,%d,%d",&((*p).pname),&( (*p).total_quantity),&(( (*p).buy_date).year),&(( (*p).buy_date).month),&(( (*p).buy_date).day),&( (*p).sales_quantity),&(( (*p).sales_time).year),&(( (*p).sales_time).month),&(( (*p).sales_time).day));
(*p).nextproduct=(*q).nextproduct;
(*q).nextproduct=p;
q=p;
}
}
return ok;
}//产品类个数添加
void product_zongliangtianjia(sqmountlink &L,char pkindname1[],char pname1[],int n)//添加产品的相关信息,如产品类、产品、产品数量、进货日期、销出数量、销售时间等。
{ //添加顺序表挂接链表L的某产品类中的某产品的总量,且需添加的产品总量为n
int i,k;
plinklist p;
for(i=0;i<L.length;i++)
{
if(strcmp((L.kindelem[i]).pkindname,pkindname1)!=0)
continue;
else
break;
}
if(i<L.length)
{
for(p=L.kindelem[i].firstproduct;p!=NULL;p=(*p).nextproduct)
{
k=strcmp((*p).pname,pname1);
if(k==0)
{
(*p).total_quantity=(*p).total_quantity+n;
printf("查看添加后产品的各项输出:%s %d %d,%d,%d %d %d,%d,%d\n",(*p).pname, (*p).total_quantity,(*p).buy_date).year,( (*p).buy_date).month,( (*p).buy_date).day, (*p).sales_quantity,( (*p).sales_time).year,( (*p).sales_time).month,( (*p).sales_time).day);
}
}
}
}//产品总量添加
void xiaochushuliangtianjia(sqmountlink &L,char pkindname4[],char pname4[],int n)
{ //添加顺序表挂接链表L的某产品类中的某产品销出数量,且销出的数量n
int i,k;
plinklist p;
for(i=0;i<L.length;i++)
{
if(strcmp((L.kindelem[i]).pkindname,pkindname4)!=0)
continue;
else
break;
}
if(i<L.length)
{
for(p=L.kindelem[i].firstproduct;p!=NULL;p=p->nextproduct)
{
k=strcmp(p->pname,pname4);
if(k==0)
{
p->sales_quantity=p->sales_quantity+n;
printf("查看添加后产品的各项输出:%s %d %d,%d,%d %d %d,%d,%d\n",(*p).pname, (*p).total_quantity,( (*p).buy_date).year,( (*p).buy_date).month,( (*p).buy_date).day, (*p).sales_quantity,( (*p).sales_time).year,( (*p).sales_time).month,( (*p).sales_time).day);
}
}
}
(三)、产品查询chaxun(sqmountlink &L,char pkindname3[],char pname3[])
分析:查询产品相关信息,比如每种产品的总量、进货日期、销出数量、销售时间等流程图如下图4.所示。
k=strcmp(p->pname,pname3);
if(k==0)
break
yes
NO
if(k!=0)
Yes
Else
此产品不存在
此产品信息
图4. 产品查询流程图
该模块的代码如下所示
void chaxun(sqmountlink &L,char pkindname3[],char pname3[])//查询产品相关信息,比如每种产品的总量、进货日期、销出数量、销售时间等
{ //在顺序表挂接链表L中,查询属于某产品类的某产品的各项信息
int i,k;
plinklist p;
for(i=0;i<L.length;i++)
{
if(strcmp((L.kindelem[i]).pkindname,pkindname3)!=0)
continue;
else
break;
}
if(i<L.length)
{
for(p=L.kindelem[i].firstproduct;p!=NULL;p=(*p).nextproduct)
{
k=strcmp((*p).pname,pname3);
if(k==0)
break;
}
if(k!=0)
printf("此产品不存在:\n");
else
{
printf("产品类、产品、产品总量(个)、进货日期(年-月-日)、销出数量(个)、销售时间(年-月-日)\n");
printf("%s %s %d %d,%d,%d %d %d,%d,%d\n",(L.kindelem[i]).pkindname, (*p).pname, (*p).total_quantity,( (*p).buy_date).year,( (*p).buy_date).month,( (*p).buy_date).day, (*p).sales_quantity,( (*p).sales_time).year,( (*p).sales_time).month,( (*p).sales_time).day);
}
}
}//查询
(四)、产品的打印输出void xianshi(sqmountlink &L)
分析:先查询产品的信息然后对查询到的产品的一些相关信息进行打印输出,从而对我们所需要查的产品的具体情况一目了然,流程图如下图5.所示。
if(!(L.kindelem[i].firstproduct))
输出产品类名
for(p=L.kindelem[i].firstproduct;p;p=p->nextproduct)
产品类、产品、产品总量(个)、进货日期(年-月-日)、销出数量(个)、销售时间(年-月-日)
图5. 产品的打印输出流程图
该模块代码如下所示
void xianshi(sqmountlink &L)//对查询到的产品的一些相关信息进行打印输出
{ //显示各产品所属产品类、产品名称、产品总量、进货日期、销出数量、销售时间
int i;
plinklist p;
printf("产品类、产品、产品总量(个)、进货日期(年-月-日)、销出数量(个)、销售时间(年-月-日)\n");
for(i=0;i<L.length;i++)
{
if(!(L.kindelem[i].firstproduct))
printf("%s\n",(L.kindelem[i]).pkindname);
for(p=L.kindelem[i].firstproduct;p;p=(*p).nextproduct)
printf("%s %s %d %d,%d,%d %d %d,%d,%d\n",(L.kindelem[i]).pkindname, (*p).pname,p->total_quantity,( (*p).buy_date).year,( (*p).buy_date).month,( (*p).buy_date).day, (*p).sales_quantity,( (*p).sales_time).year,( (*p).sales_time).month,( (*p).sales_time).day);
}
}//打印
(五)、菜单显示模块 void caidan_caozuo( )
分析:先对菜单整体情况进行布局,然后对情况和布局进行显示,并显示出出它的各项功能:添加功能,查询功能以及退出菜单,流程图如下图6.所示。
操作菜单
6.退出程序
5.查询产品
4.产品售出
3.产品数量添加
2.产品添加
1.产品类的添加
图6. 菜单显示模块流程图
该模块代码如下所示
void caidan_caozuo()//对菜单整体情况和布局进行显示,并显示出出它的各项功能:添加功能,查询功能以及退出菜单
{//操作菜单
printf(" 欢迎使用产品进销管理系统 \n");
printf(" -------------------------------\n");
printf(" 操作菜单 \n");
printf("--------------------------------\n");
printf(" ************************** \n");
printf(" *........................* \n");
printf(" *输入所要执行的操作: * \n");
printf(" *1、产品类添加: * \n");
printf(" *2、产品添加: * \n");
printf(" *3、产品数量添加: * \n");
printf(" *4、产品售出: * \n");
printf(" *5、查询产品: * \n");
printf(" *6、退出程序: * \n");
printf(" *........................* \n");
printf(" ************************** \n");
printf("--------------------------------\n");
}//菜单(六)、主函数控制 void main( )
分析:编辑主函数,实现对各部分的分工和控制和执行作用,流程图如下图7所示。
order
输出
需添加产品类的个数
退出程序
输出
待查询产品所属产品类的名称
输出
需添加产品所属产品类的名称、产品名称、数量
输出
需添加产品所属产品类的名称、个数
1 2 3 4 5
结束
图7. 主函数控制模块流程图
该模块代码如下所示
void main()//编辑主函数,实现对各部分的分工和控制和执行作用
{
int order;
int i,n;
char a[30];
char b[30];
sqmountlink L;
cunchu(L);
loop:
caidan_caozuo();
printf("输入命令:");
scanf("%d",&order);
switch(order)
{
case 1:
printf("需添加产品类的个数:");
scanf("%d",&i);
product_leitianjia(L,i);
printf("修改后的产品库存管理表:\n");
xianshi(L);
goto loop;
break;
case 2:
printf("需添加产品所属产品类的名称:");
scanf("%s",&a);
printf("需向此产品类添加产品的个数:");
scanf("%d",&i);
product_leigeshutianjia(L,a,i);
printf("修改后的产品库存管理表:\n");
xianshi(L);
goto loop;
break;
case 3:
printf("输入需添加数量的产品所属产品类的名称:");
scanf("%s",&a);
printf("输入需添加数量的产品的名称:");
scanf("%s",&b);
printf("输入需添加产品的数量:");
scanf("%d",&n);
product_zongliangtianjia(L,a,b,n);
printf("修改后的产品库
展开阅读全文