电器商场仓库管理.docx
《电器商场仓库管理.docx》由会员分享,可在线阅读,更多相关《电器商场仓库管理.docx(33页珍藏版)》请在冰豆网上搜索。
电器商场仓库管理
数据结构课程设计报告
班级:
_______计算机121班_______
姓名:
__________周一苇___________
指导教师:
__________董跃华___________
成绩:
__________________________
信息工程学院
年月日
目录
1.需求分析………………………3
2.概要设计………………………4
3.详细设计………………………11
4.调试分析………………………12
5.测试结果………………………13
6.参考文献………………………17
7.附录……………………………17
第一章需求分析
问题题目:
家电商场仓库管理
问题描述:
仓库管理系统是一个典型的信息管理系统,主要是对实际的库存商品信息加以分类管理,以便及时的为商品的交易提供货品库存信息.类似的问题有图书馆管理系统,通讯录,学生信息管理系统.
本题目使用线性表的链式存储结构完成。
主要需实现功能有:
创建管理表,向表中添加记录,查询商品种类数,输出所有商品信息,追加新商品记录,已有商品库存量的增减,将商品信息写入文件并可以从文件中读出等.
问题要求:
由问题描述我们可知仓库管理所涉及到的功能有如上几种,这就要求我们逐个实现,同时为了可以和用户进行很好的信息交换我们需要编写菜单函数.下面以链表结构的有序表表示某商场家电部的库存模型。
当有提货或进货时需要对该链表及时进行维护。
每个工作日结束之后,将该链表中的数据以文件形式保存,每日开始营业之前,需将以文件形式保存的数据恢复成链表结构的有序表.链表结点的数据域,包括家电名称、品牌、单价和数量,以单价的升序体现链表的有序性。
程序功能包括:
初始化、创建表、插入、删除、更新数据,查询及链表数据与文件之间的转换等。
第二章概要设计
(1)思路确定:
拿到此问题进行分析知道此题目是要对大量的货品信息进行管理,因此要将所需要的功能进行逐个实现,也就是函数的分块实现。
首先明确系统所需的功能有:
创建管理表,向表中添加记录,查询商品种类数,输出所有商品信息,追加新商品记录,已有商品库存量的进货或提货,将商品信息写入文件并可以从文件中读出等。
对应的程序中需要的函数模块有:
初始化链表,输入、插入、删除、更新数据,查询、链表数据与文件之间的转换以及一些辅助函数。
同时,为了更好的和用户进行信息交换,我们要构建菜单函数。
最后我们要用主函数调用以上函数模块。
(2)系统功能设计图
(3)数据结构定义:
typedefstructsnode
{
charkind[20];
charbrand[20];
intmodel;
intprice;
intnumber;
}store;
typedefstoreElemType;
typedefstructSNode
{
ElemTypedata;
structSNode*next;
}SNode,*LinkedList;
使用到的头文件:
#include
#include
#include
#include
(4)函数模块功能说明:
对本系统的功能进行分析后对主要函数可作如下的模块化设计:
输入模块实现功能:
按需添加货品数目将货品型号、种类、名称、价格、数量依次输入,并建立链表将其连接。
插入模块实现功能:
向已有数据中再次添加新货品的记录,包括货品型号、种类、名称、价格、数量。
以结点的方式链接到链表中。
删除模块实现功能:
在已有的数据中删除某种停产后无库存货品信息,并释放内存空间。
删除按货品关键码型号进行。
查找模块实现功能:
在已有的数据中查找指定的货品信息。
按照查找货品编号进行。
输出模块实现功能:
将已有的数据中按单价的升序进行遍历,输出该管理表中所包含的全部货品信息。
保存模块实现功能:
在每日工作结束时都要将数据进行保存操作,链表中的信息以文件形式被长期保存。
载入模块实现功能:
将文件中的数据信息载入链表。
主序模块实现功能:
完成系统的界面处理,包括开始界面和主菜单界面。
具体函数有:
intmenu();/*主菜单函数*/
LinkedListLinkedListInit();/*初始化单链表*/
LinkedListLinkedListAppend();/*添加数据信息*/
intLinkedListLength(LinkedListL);/*查询货品的种类数*/
voidLinkedListTraverse(LinkedListL);/*遍历链表显示货品信息*/
intLinkedListInsert(LinkedListL,inti,ElemTypex);/*插入信息*/
intLinkedListDelete(LinkedListL,inti);/*删除信息*/
intsearch(LinkedListL);/*查询某货品的库存*/
LinkedListpx(LinkedListL);/*由单价排序*/
intLinkedListLocal(LinkedListL);/*定位进出货的位置*/
LinkedListAppends(LinkedListL);/*记录进货量*/
LinkedListsells(LinkedListL);/*记录出货量*/
intsave(LinkedListL);/*保存信息到文件*/
LinkedListload(LinkedListL);/*从文件中读取*/
输入模块实现功能:
LinkedListLinkedListAppend();/*添加数据信息*/
i>n
开始
申请一个结点空间,p指向它
向p指向结点输入货品的信息
N
Y
N
Y
是否为第一个数据(i=0)
N
r->next=p;
r=r->next;r=r->next;r=r->next;
Y
p=>L
i<=n,p=>p->next
NULL=>p->next
返回L
结束
图4-1
插入模块实现功能:
intLinkedListInsert(LinkedListL,inti,ElemTypex);/*插入信息*/
开始
调入载入模块
L=NULL
p=L;
申请一个结点空间,使P指向它
给T指向结点输入预插入货品的信息
Y
p->next!
=NULL&&j
N
Y
返回NULL
Y
p=p->next;
j++;
t->next=p->next;
p->next=t;
返回L
结束
图4-2
删除模块实现功能:
intLinkedListDelete(LinkedListL,inti);/*删除信息*/
开始
调用载入模块
L->next==null
Y
N
从键盘读入i值
p=L;
p->next!
=NULL&&j
Y
Ptr1->next=>head
q=p->next;p->next=p->next->next;
p->next=p->next->next;
返回L
结束
图4-3
保存模块实现功能
intsave(LinkedListL);/*保存信息到文件*/
开始
输入预保存文件的文件名
创建文件成功
N
L!
=NULL
N
Y
将指向结点的数据写入文件
L=L->next;
结束
图4-4
读取模块实现功能
LinkedListload(LinkedListL);/*从文件中读取*/
开始
调用载入模块
fp==NULL
Y
N
为结点申请空间
输出p1指向结点的货品信息
p2=p1->next;
p2=p1;
Y
N
结束
图4-5
第三章详细设计
见附录
第四章调试分析
通过这次课程设计专周实验我认识到,在进行程序设计前要进行系统的问题分析,确定问提的解决流程,问题所需要解决的具体功能要求,明确设计对象的要求。
在专周实验中还是遇到了不少的问题,总结有如下几条:
《1》对函数指针的应用以及结点之间的后移关系掌握不牢固
由于之前发现第一遍的插入数据函数缺少对极端数据的判断,因此重新另外写了一个插入数据函数,可是这个函数在存储上和原本系统中的其他函数不配适,因为原本的函数实现头指针为空,而此函数头指针有存数据而且必须用到,所以使得系统无运行。
一次我改变思路,再第一遍的基础上对原有的插入函数进行修改,起到对极端数据的判断作用。
不配适的函数实现:
/*添加数据信息*/
《2》对单链表的排序
首先想到的是两两比较结点关键码大小,然后交换两个结点,可是在实验过程中不断出现指向错误使得系统无法正常运行。
之后,改进其他方法,两两比较,仅交换结点的数据信息,实现对单链表的排序。
《3》文件的读写
由于平时对文件的使用较少,因此本次实验中文件算是一处难点,
通过查阅书籍编写出代码,知道了,文件首先要定义文件指针,
FILE*fp;而文件的读写函数有fprintf,fscanfreadfwrite等。
输入文件名时,可以控制文件类型,如:
data.txt
第五章测试结果
(1)模拟数据:
种类品牌型号单价数量
电视康佳16000140
手机TCL7140040
电脑惠普25800160
冰箱海尔3480080
数码相机索尼42200170
数码相机佳能51700180
手机诺基亚61800260
(2)界面
(3)添加信息
(4
)查询货品种类数
(5)显示货品信息
(6)插入新货品信息
(7)删除货品信息
(8)进货
(9)提货
(10)查询特定商品
(11)文件
(12)读出
第六章参考文献
1.严慰敏,吴伟民数据结构(C语言版),清华大学出版社
2.谭浩强,C语言程序设计(第四版),清华大学出版社
附录
#include
#include
#include
#include
#defineN5
typedefstructsnode
{
charkind[20];//各种数据的名称种类与其编号对应
charbrand[20];
intmodel;
intprice;
intnumber;
}store;
typedefstoreElemType;
typedefstructSNode
{
ElemTypedata;
structSNode*next;
}SNode,*LinkedList;
intmenu();
LinkedListLinkedListInit();/*初始化单链表*/
LinkedListLinkedListAppend();/*添加数据信息*/
voidLinkedListClear(LinkedListL);/*清空单链表*/
intLinkedListLength(LinkedListL);/*查询货品的种类数*/
voidLinkedListTraverse(LinkedListL);/*遍历链表显示货品信息*/
intLinkedListInsert(LinkedListL,inti,ElemTypex);/*插入信息*/
intLinkedListDelete(LinkedListL,inti);/*删除信息*/
intsearch(LinkedListL);/*查询某货品的库存*/
LinkedListpx(LinkedListL);/*由单价排序*/
intLinkedListLocal(LinkedListL);/*定位进出货的位置*/
LinkedListAppends(LinkedListL);/*记录进货量*/
LinkedListsells(LinkedListL);/*记录出货量*/
intsave(LinkedListL);/*保存信息到文件*/
LinkedListload(LinkedListL);/*从文件中读取*/
intmenu()
{
intoption;
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("|7---删除停产无存货货品记录|\n");
printf("|8---记录进货量|\n");
printf("|9---记录出货量|\n");
printf("|10---查询货品的余量|\n");
printf("|11---每日结算|\n");
printf("|12---每日开始|\n");
printf("|0---退出|\n");
printf("|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|\n");
printf("请选择:
");
scanf("%d",&option);
return(option);
}
/*初始化单链表*/
LinkedListLinkedListInit()
{
LinkedListL;
L=(SNode*)malloc(sizeof(SNode));//头结点
L->next=NULL;//头结点的指针分量为空
returnL;
}
/*添加数据信息*/
LinkedListLinkedListAppend()
{
inti,n,m;
stores;
LinkedListL,r,p,q;
L=LinkedListInit();
r=L;
m=1;
q=(LinkedList)malloc(sizeof(SNode));
printf("请输入货品的种类总数:
\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
{printf("第%d种货品\n",i);
repeat:
printf("请输入货品型号:
");
scanf("%d",&s.model);printf("\n");
q=L;
for(i=1;i{
if(s.model!
=q->data.model)
q=q->next;
else
{
printf("型号重复,请重新输入!
");printf("\n");
gotorepeat;
}
}
printf("请输入货品种类:
");
scanf("%s",&s.kind);printf("\n");
printf("请输入货品品牌:
");
scanf("%s",&s.brand);printf("\n");
printf("请输入货品价格:
");
scanf("%d",&s.price);printf("\n");
printf("请输入货品数量:
");
scanf("%d",&s.number);printf("\n");
while(s.price<0||s.number<0)
{
printf("输入错误,请重新输入信息");
printf("请输入货品价格:
");
scanf("%d",&s.price);
printf("请输入货品数量:
");
scanf("%d",&s.number);
}
printf("\n");
p=(LinkedList)malloc(sizeof(SNode));
strcpy(p->data.kind,s.kind);
strcpy(p->data.brand,s.brand);
p->data.price=s.price;
p->data.model=s.model;
p->data.number=s.number;
p->next=NULL;
m++;
r->next=p;
r=r->next;
}
return(L);
}
/*清空单链表*/
voidLinkedListClear(LinkedListL)
{
L->next=NULL;
}
/*查询货品的种类数*/
intLinkedListLength(LinkedListL)
{
LinkedListp;
inti=1;
p=(SNode*)malloc(sizeof(SNode));
p=L->next;
while(p->next!
=NULL)
{
p=p->next;
i++;
}
return(i);
}
/*遍历链表显示货品信息*/
voidLinkedListTraverse(LinkedListL)
{
LinkedListp;
p=L->next;
printf("当前表是:
\n");
printf("%10s%10s%10s%10s%10s\n","种类","品牌","型号","单价","数量");
while(p!
=NULL)
{
printf("%10s%10s%10d%10d%10d\n",p->data.kind,p->data.brand,p->data.model,p->data.price,p->data.number);
p=p->next;
}
}
/*插入信息*/
intLinkedListInsert(LinkedListL,inti,ElemTypex)
{
LinkedListp,t;
intj;
p=L;
j=1;
t=(SNode*)malloc(sizeof(SNode));
strcpy(t->data.kind,x.kind);
strcpy(t->data.brand,x.brand);
t->data.price=x.price;
t->data.model=x.model;
t->data.number=x.number;
if(L->next==NULL)
{if(i==1)//若L为空表且要求将新结点插入到第1个位置
{
L->next=t;
t->next=NULL;
return1;
}
}
while(p->next!
=NULL&&j
{
p=p->next;
j++;
}
if(p->next==NULL)
{
if(j
{
printf("给的i值超过了表长");
return0;
}
}
t->next=p->next;
p->next=t;
return
(1);
}
/*删除信息*/
intLinkedListDelete(LinkedListL,inti)
{
LinkedListp,q;
intj;
p=L;
j=1;
if(L->next==NULL)//空表
{
printf("没有货品信息!
\n");
return0;
}
while(p->next!
=NULL&&j
{
p=p->next;
j++;
}
if(p->next==NULL)
{
printf("给的i值超过了表长\n");
return0;
}
else
{
q=p->next;
p->next=p->next->next;
free(q);
return
(1);
}
}
/*查询某货品的库存*/
intsearch(LinkedListL)
{
LinkedListp;
intc;
inti=1;
p=L;
printf("请输入商品型号:
");scanf("%d",&c);
while(p->data.model!
=c&&p->next!
=NULL)
{
p=p->next;
}
printf("%10s%10s%10s%10s%10s\n","种类","品牌","型号","单价","数量");
printf("%10s%10s%10d%10d%10d\n",p->data.kind,p->data.brand,p->data.model,p->data.price,p->data.number);
}
voidIntSwap(int*p,int*r)
{
intt;
t=*p;
*p=*r;
*r=t;
}
/*由单价排序*/
LinkedListpx(LinkedListL)
{
LinkedListq,p,H;
chara[20],b[20];
H=L;
for(p=L;p!
=NULL;p=p->next)
{
for(q=L->next;q->next!
=NULL;q=q->next)
{
if(q->data.price>p->data.price)
{
strcpy(a,p->data.kind);strcpy(p->data.kind,q->data.kind);strcpy(q->data.kind,a);
strcpy(b,p->data.brand);strcpy(p->data.brand,q->data.brand);strcpy(q->data.brand,b);