仓库出库管理任务书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
题目仓库出库管理的设计与实
现
学院计算机科学与技术专业
班级
姓名
指导教师巩晶
201 年月日
目录
1.系统描述 (3)
1.1设计题目 (3)
1.2设计目的 (3)
1.3问题说明 (3)
1.4开发环境 (3)
1.5系统分析 (3)
1.6系统设计流程图 (4)
2.系统设计 (5)
2.1数据文件设计 (5)
2.2输入输出的设计 (5)
2.3用户界面设计 (10)
2.4处理过程设计 (12)
3.系统测试 (12)
3.1测试用例描述 (12)
3.2测试方法描述 (13)
3.3测试结果 (13)
4.总结 (17)
4.1特点与不足 (17)
4.2收获与体会 (18)
5.参考文献 (18)
附表 (18)
评分表 (27)
计算机基础强化训练任务书
学生姓名:专业班级:
指导教师:工作单位:
题目: 仓库出库管理的设计与实现
初始条件:
理论:学完计算机基础知识,掌握C++语言编程基础和VC开发平台的使用。
实践:计算机科学系实验中心提供计算机及软件开发环境。
要求完成的主要任务:
(1)系统需求分析,得到系统的数据需求和功能需求,分析结果用表格记录。
(2)系统设计,包括内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。
要求内存数据用链表组织,数据文件用文本文件,用户界面用字符界面。
至少实现数据记录的增加、修改、删除、查询(查询应能按不同数据项进行)。
(2)编制好程序后,设计若干测试用例,上机测试所设计的程序。
(4)设计报告按格式要求书写。
设计报告正文的内容应包括:
1)系统描述包括问题说明、数据需求和功能需求。
2)系统设计包括内存数据结构设计、数据文件设计、代码设计、输入/输出设计、用户界面设计、处理过程设计。
3)系统测试包括测试用例的描述、测试方法和测试结果。
4)设计的特点、不足、收获和体会。
时间安排:
1、第20周(7月4日至7月8日)完成。
2、7月8日8:00到计算机学院实验中心(三楼)检查程序、交课程设计报告、源程序(CD盘)。
指导教师签名:
2011年月日系主任(或责任教师)签名:
2011年月日
1 系统描述
1.1设计题目
仓库出库管理的设计与实现
1.2 设计目的
(1) 通过设计,强化计算机专业基础知识,如C++语言、数据结构、离散数学等,对这些
知识加以运用。
(2) 掌握编写程序的思想方法、技巧,为以后的专业学习打下良好的基础。
(3) 培养动手能力,理论联系实际的能力,在实践中掌握理论,深化对计算机科学与技术
的认识。
1.3. 问题说明
随着企事业的发展,以及人们需求的增多,仓库管理已被广泛的应用。
而仓库管理系统软件更是大型企业不可缺少的,它使管理变的更加容易,使管理员轻松的掌握仓库物品信息,调整仓库中物品的进出,了解仓库的库存大小,以及对物品进行查找等。
本此训练的系统为仓库出库管理系统,针对的是物品的出库,可以实现针对出库的相应的功能。
系统使用C++语言开发,利用面向对象的思想,内存数据用链表组织,数据的存储为文本存储。
至少实现数据记录的增加、修改、删除、查询(查询应能按不同数据项进行)。
1.4开发环境
Visual C++6.0集成开发环境,主要用C++语言,面向对象的思想方法。
1.5 系统分析
(1)数据需求
仓库的属性有:货物编号、货物名称、货物数量等。
数据需求分析结果如下表:
(2)功能需求
本程序要求实现仓库管理中的物品的入库初始化,物品的出库,物品的列表显示,物品相关信息的查找和退出程序的功能。
当输入有误时,给以相应的提示信息。
1.6系统设计流程图
2系统设计
2.1数据文件设计
该程序采用内部数据结构如下:
typedef struct dnode /* 定义双向链表结构体*/ {
int number; /* 货物编号*/
char name[max]; /* 货物名称*/
int counter; /* 货物数量*/
struct dnode *prior, *next;
/* 定义两指针,分别指向其前驱和后继*/
}dlnode;
void create(dlnode *L);//创建链表头结点
void input(dlnode *L);//定义入库函数
void output(dlnode *L);//定义出库函数
void outnum(dlnode *L);//按编号出库函数
void outname(dlnode *L);//按名称出库函数
void current(dlnode *L);//货物出库函数
void search(dlnode *L);//查找主菜单
void print(dlnode *L);//输出函数
void searchnum(dlnode *L);//按编号查找函数
void searchname(dlnode *L);//按名称查找函数
void display(dlnode *L) ; // 显示货物清单
2.2输入输出的设计
(1)输入
输入,即时入库的实现
void input(dlnode *L)//定义入库函数
{
dlnode *in,*head;
head=in=(dlnode *)malloc(sizeof(dlnode));//分配空间
head=L;
printf("\n请输入货物数据:\n");
printf("编号:");scanf("%d",&in->number);
printf("名称:");scanf("%s",&in->name);
printf("数量:");scanf("%d",&in->counter);
if(L->next==NULL) //如果只有头节点,
{ //把刚输入的in节点
L->next=in; //跟在头节点后面
L->prior=in; //
in->next=L; //
in->prior=L; //
isempty++; //isempty加1
}
else
{//如果当前L的下一个节点不是头节点
while((L=L->next)!=head)
{//如果输入的数大于L->number,则插到L的前面
if(L->number<in->number)
{
in->next=L;
in->prior=L->prior;
L->prior->next=in;
L->prior=in;
isempty++; //isempty加1
return;
}
}
//输入的编号比其它编号都小,则插到最后个节点,并首尾相连head->prior->next=in;
in->prior=head->prior;
head->prior=in;
in->next=head;
isempty++; //isempty加1
}
}
(2)输出
即程序中的出库函数,实现了对信息进行分类输出及删除操作,其主要设计代码:1)选择出库函数类型:
void output(dlnode *L)//出库的函数
{
int y;
dlnode *head=L;
if(isempty==0)//检测是否有货物输入
{
printf("没有货物输入系统\n");
getchar();getchar();
return ;
}
while(1)
{
printf("=============\n");
printf("1.按编号出库\n");
printf("2.按名称出库\n");
printf("0.返回上一层\n");
printf("==============\n");
printf("选择0--2:");scanf("%d",&y);
switch(y)
{
case 1:outnum(L);break;//调用按编号出库函数
case 2:outname(L);break;//调用按名称出库函数
case 0:return;
default:printf("enter error!Please input 0--2!");
getchar();getchar();printf("\n\n");
}
}
}
2)按编号输出函数
void outnum(dlnode *L)//按编号出库函数
{
int num;
dlnode *head=L;
printf("请输入出库货物的编号:");
scanf("%d",&num);
while((L=L->next)!=head)
{//如果找到就删除节点
if(L->number==num)
{
L->prior->next=L->next;
L->next->prior=L->prior;
isempty--; //isempty减1
printf("编号为%d的货物成功出库",num);
getchar();getchar();
return;
}
}
printf("没有此编号的货物,请查看是否还有货物。
\n\n");
getchar();getchar();
}
3)按名称输出函数:
void outname(dlnode *L)//按名称出库函数
{
char na[32];
dlnode *head=L;
printf("请输入出库货物的名称:");
scanf("%s",&na);
while((L=L->next)!=head)
{//如果找到就删除节点
if(strcmp(L->name,na)==0)
{
L->prior->next=L->next;
L->next->prior=L->prior;
isempty--; //isempty减1
printf("名称为%s的货物成功出库",na);
getchar();getchar();
return;
}
}
printf("没有此名称的货物,请查看是否还有货物。
\n\n");
getchar();getchar();
}
2.3用户界面设计
void create(dlnode *L)//创建链表头节点
{
int i;
printf("*******欢迎使用仓库出库管理的设计与实现*******\n");
isempty=0;
///////初始化头节点的值////////
L->next=NULL;L->prior=NULL;
L->number=L->counter=0;
strcpy(L->name," ");
printf("货物库存初始化\n");
printf("============================\n");
printf(" 1.继续增加库存\n");
printf(" 0.结束\n");
printf("============================\n");
scanf("%d",&i);
while(i==1)
{
input(L);
printf("\n============================\n");
printf(" 1.继续增加库存\n");
printf(" 0.结束\n");
printf("============================\n");
scanf("%d",&i);
}
}
初始化:
输入1时:
输入0时:
2.4处理过程设计
程序整体的处理过程描述如下:
实验要求是仓库出库管理的设计与实现,然而,出库的前提就是入库,所以还需要写一个入库的程序,输入货物及其信息。
首先是增加库存,再接下来有5个选择分别是货物出库、查找货物表、显示仓库货物表,输出到文件和退出,运用这5个操作,实现对出库管理的操作,在程序设计中,运用到了对数据的增加,删除(即出库)、查找、输出等。
3 系统测试
3.1用例测试描述
在程序中输入如下信息:
货物的种类为: 6
分别在测试这些数据是否能出库、显示、查找等。
3.2测试方法
根据用例反复检测,看调试的过程中是否出现错误的结果,如是否当文件中没有要查找的数据时,程序是否可以正常运行,是否在查找的时候能准确找到物品,其中最核心的方法就是把各种情况都想到,把代码的各个角落都测试到,这样就可以确保程序的准确性和健壮性。
3.3测试结果
(1)文本中的内容
出库:
上述出库后,仓库内的剩余货物:
4 设计总结
4.1设计特点(优缺点)
本次设计,由于重点是出库,而出库的前提是入库,即在编写程序的时候还要加上入库的函数。
程序的还有一个特点就是如果有需要,能一直循环下去知道所有的货物都输出来。
程序的优点是,简洁,易懂。
一就实现了出库,出库,并能随时显示仓库内的物品,,查找到所需物品。
程序的另一个优点是界面设计精致,虽然是字符界面,但程序相当好用。
关于如何使用,屏幕上的输出提示的很清楚,再加上精美的外观,使人爱不释手。
设计中也存在着许多不足,如对于数据信息,比较简洁,货物信息也比较少,这点还有待改进,还有就是有些话重复很多次,有点罗嗦。
对一些关于格式化输出的函数掌握并不熟练,还需要进一步的学习。
4.2收获和体会
本次强化训练开放性和综合性很强,要求我们利用以前所学的的所有知识,来开发本次的仓库入库管理系统,虽然本次系统是字符界面,但在思想上和方法上有了一定的提高。
首先,对于文件读写的运用,这开始对我来是一个盲点,因为在C++这门课上,我们从未提及过这方面的知识,虽然自己曾经看过,但只是掌握了一些皮毛。
而本次训练,是我在原有的基础上,强化了对文本读写操作的理解。
在思想方法上,我了解到,一个真正的系统是有一个坚实的数据库的,而我们现在用的文本存储就是一个模拟的数据库。
其次,强化面向对象的思想,自从学习数据结构这门课程,为了用C++对文本进行读写,在操作中用到了类、对象等。
再次体会封装思想,强化了已有的知识。
最后,本次设计的功能较齐全,功能全责要求我们思维有一定的严谨性,本次程序的编写代码的长度有几百行,难免会出现一些错误,不过在更改错误的过程中,让我们深刻的了解了许多不该犯的思维误区,如判断是否相等的语句x==0写成了x=0,这造成了判断语句永远为真。
诸如此类的小错误是编写大程序的禁忌。
本次强化训练在理论上和时间上巩固了已有的知识,强化了思维,提高了专业的兴趣,使我对以后的专业课程兴趣盎然。
5.参考文献
[1]《C++程序设计教程》,闵联营,何克右编著,出版社:武汉理工大学出版社,出版或修订时间:2005年7月第1版
[2]《数据结构(C语言版)》,严蔚敏,吴伟民编著,出版社:清华大学出版社,出版或修订时间:1997年4月
附表:
源代码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#define max 32
int isempty=0;//标志,判断链表是无否为空
typedef struct dnode /* 定义双向链表结构体*/
{
int number; /* 货物编号*/
char name[max]; /* 货物名称*/
int counter; /* 货物数量*/
struct dnode *prior, *next;
/* 定义两指针,分别指向其前驱和后继*/
}dlnode;
void create(dlnode *L);
void input(dlnode *L);
void output(dlnode *L);
void outnum(dlnode *L);
void outname(dlnode *L);
void current(dlnode *L);
void search(dlnode *L);
void print(dlnode *L);
void searchnum(dlnode *L);
void searchname(dlnode *L);
void display(dlnode *L) ;
void main()
{
int x;
dlnode *L;
if(!(L=(dlnode *)malloc(sizeof(dlnode)))) //分配空间
{
printf("\n");
exit(1);
}
create(L);///调用函数,创建头节点,并完成库存初始化
while(1)
{////////////////////////主菜单///////////////////////////
printf(" ============================\n");
printf(" 1. 货物出库\n");
printf(" 2. 查找货物表\n");
printf(" 3. 显示仓库货物表\n");
printf(" 4. 输出到文件\n");
printf(" 0. 退出\n");
printf(" =============================\n");
printf(" 选择0--4:");
scanf("%d",&x);
switch(x)
{
case 1:current(L);break;//调用出库函数
case 2:search(L);break;//调用查找函数
case 3:display(L);break;//调用显示输出函数
case 4:print(L);break;//调用打印函数
case 0:printf("\n bye!see you!\n");
getchar();getchar();exit(0);//退出程序
default:printf("\n Enter erreor!please input 0--4!");
getchar();getchar();
}
}
}
void create(dlnode *L)//创建链表头节点
{
int i;
printf("*******欢迎使用仓库出库管理的设计与实现*******\n");
isempty=0;
///////初始化头节点的值////////
L->next=NULL;L->prior=NULL;
L->number=L->counter=0;
strcpy(L->name," ");
printf("货物库存初始化\n");
printf("============================\n");
printf(" 1.继续增加库存\n");
printf(" 0.结束\n");
printf("============================\n");
scanf("%d",&i);
while(i==1)
{
input(L);
printf("\n============================\n");
printf(" 1.继续增加库存\n");
printf(" 0.结束\n");
printf("============================\n");
scanf("%d",&i);
}
}
void search(dlnode *L) ///查找的主要菜单
{
int y;
if(isempty==0)
{
printf("没有输入货物!\n");
getchar();getchar();
return;
}
else
{
while(1)
{
printf("=====================\n");
printf("1.按编号查询\n");
printf("2.按货物名称查询\n");
printf("0.返回上一层\n");
printf("====================\n");
printf("选择0--2:");
scanf("%d",&y);
switch(y)
{
case 1:searchnum(L);break;//调用按编号查找的函数
case 2:searchname(L);break;//调用按名称查找的函数
case 0:return;//返回
default:printf("enter error!Please input 0--2!\n\n");
getchar();getchar();printf("\n\n");
}
}
}
}
void searchnum(dlnode *L)///按编号查找的函数
{
int num,flag=0;//flag为是否找到的标志
dlnode *head=L;
if(isempty==0)
{
printf("没有货物被输入\n");
getchar();getchar();
return;
}
printf("输入你要查找的货物编号:\n");
scanf("%d",&num);
while((L=L->next)!=head)
{
if(L->number==num)
{ flag=1;//flag为1时表示找到
printf("找到指定编号货物\n");
printf("\n编号:%d\n",L->number);
printf("名称:%s\n",L->name) ;
printf("数量:%d\n\n",L->counter);
}
}
if(flag==0)//flag为0时表示没有找到
printf("没有找到指定编号货物,请查看是否还有货物。
\n");
getchar();getchar();
}
void searchname(dlnode *L)//按名称查找的函数
{
int flag=0;//flag为是否找到的标志
char na[32];
dlnode *head=L;
if(isempty==0)
{
printf("没有货物被输入\n");
getchar();getchar();
return;
}
printf("输入你要查找的货物名称\n");
scanf("%s",&na);
while((L=L->next)!=head)
{
if(strcmp(L->name,na)==0)
{ flag=1;//flag为1时表示找到
printf("找到指定名称货物\n");
printf("\n编号:%d\n",L->number);
printf("名称:%s\n",L->name) ;
printf("数量:%d\n\n",L->counter);
}
}
if(flag==0)//flag为0时表示没有找到
printf("没有找到指定编号货物,请查看是否还有货物。
\n\n");
getchar();getchar();
}
void current(dlnode *L)//货物出库函数
{
int y;
while(1)
{
printf("========================\n");
printf(" 1.货物出库\n");
printf(" 0.返回上一层\n");
printf("========================\n");
printf(" 选择1--2:");
scanf("%d",&y);
switch(y)
{
case 1:output(L);break;//调用出库函数
case 0:return;//返回上一层
default:printf("enter error!Please input 0--2!");
getchar();getchar();
printf("\n\n");
}
}
}
void input(dlnode *L)//定义入库函数
{
dlnode *in,*head;
head=in=(dlnode *)malloc(sizeof(dlnode));//分配空间
head=L;
printf("\n请输入货物数据:\n");
printf("编号:");scanf("%d",&in->number);
printf("名称:");scanf("%s",&in->name);
printf("数量:");scanf("%d",&in->counter);
if(L->next==NULL) //如果只有头节点,
{ //把刚输入的in节点
L->next=in; //跟在头节点后面
L->prior=in; //
in->next=L; //
in->prior=L; //
isempty++; //isempty加1
}
else
{//如果当前L的下一个节点不是头节点
while((L=L->next)!=head)
{//如果输入的数大于L->number,则插到L的前面
if(L->number<in->number)
{
in->next=L;
in->prior=L->prior;
L->prior->next=in;
L->prior=in;
isempty++; //isempty加1
return;
}
}
//输入的编号比其它编号都小,则插到最后个节点,并首尾相连head->prior->next=in;
in->prior=head->prior;
head->prior=in;
in->next=head;
isempty++; //isempty加1
}
}
void output(dlnode *L)//出库的函数
{
int y;
dlnode *head=L;
if(isempty==0)//检测是否有货物输入
{
printf("没有货物输入系统\n");
getchar();getchar();
return ;
}
while(1)
{
printf("=============\n");
printf("1.按编号出库\n");
printf("2.按名称出库\n");
printf("0.返回上一层\n");
printf("==============\n");
printf("选择0--2:");scanf("%d",&y);
switch(y)
{
case 1:outnum(L);break;//调用按编号出库函数
case 2:outname(L);break;//调用按名称出库函数
case 0:return;
default:printf("enter error!Please input 0--2!");
getchar();getchar();printf("\n\n");
}
}
}
void outnum(dlnode *L)//按编号出库函数
{
int num;
dlnode *head=L;
printf("请输入出库货物的编号:");
scanf("%d",&num);
while((L=L->next)!=head)
{//如果找到就删除节点
if(L->number==num)
{
L->prior->next=L->next;
L->next->prior=L->prior;
isempty--; //isempty减1
printf("编号为%d的货物成功出库",num);
getchar();getchar();
return;
}
}
printf("没有此编号的货物,请查看是否还有货物。
\n\n");
getchar();getchar();
}
void outname(dlnode *L)//按名称出库函数
{
char na[32];
dlnode *head=L;
printf("请输入出库货物的名称:");
scanf("%s",&na);
while((L=L->next)!=head)
{//如果找到就删除节点
if(strcmp(L->name,na)==0)
{
L->prior->next=L->next;
L->next->prior=L->prior;
isempty--; //isempty减1
printf("名称为%s的货物成功出库",na);
getchar();getchar();
return;
}
}
printf("没有此名称的货物,请查看是否还有货物。
\n\n");
getchar();getchar();
}
void display(dlnode *L)//显示货物清单
{
dlnode *head=L;
if(isempty==0)
{
printf("没有货物可显示\n");
getchar();getchar();
return;
}
L=L->next;
do
{
printf("\n编号:%d\n",L->number);
printf("名称:%s\n",L->name) ;
printf("数量:%d\n\n",L->counter);
}while((L=L->next)!=head);
getchar();getchar();
}
void print(dlnode *L)
{
dlnode *head=L;
L=L->next;
char filename[max];
FILE *out;
if(isempty==0)
{
printf("没有货物可输出\n");
getchar();getchar();
return;
}
printf("请输入文件名称:");
scanf("%s",filename);
if((out=fopen(filename,"w"))==NULL)
{
printf("打开文件失败!\n");
getchar();getchar();
return;
}
do{
fprintf(out,"编号:%d\n名称:%s\n数量:%d\n\n",L->number,L->name,L->counter);
}while((L=L->next)!=head);
printf("输出成功\n");getchar();getchar();
fclose(out);
}
本科生课程设计成绩评定表
班级:计算机0909班姓名:学号:
注:最终成绩以五级分制记。
优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格
指导教师签名:
年月日。