课 程 设 计 报 告
课程名称 数据结构 设计题目 运动会分数统计 专 业 计算机科学与技术 班 级 学 号 姓 名
完成日期 _________2012年6月8日_____________
课 程 设 计 任 务 书
设计题目: 仓库管理系统 设计内容与要求:
【设计内容】
为仓库设计一个仓库管理系统,记录存储货物的编号、名称、数量。并且可以随时进行出货和出库操作、可随时查看货物信息。
【基本要求】
1) 建立一个仓库管理程序,可以按顺序和货物名称查询仓库存储情况;
2) 可以增加或删除货物;
3) 可以实现货物的入库出库;
4) 能用文件保存仓库货品信息;
指导教师:____ ____
2012年 6月 8日
课 程 设 计 评 语
成绩:
指导教师: _______________ 年 月 日
1、问题描述
建立一个仓库管理程序,可以按顺序和货物名称查询仓库存储情况,也可以增加或删除货物信息、实现货物的入库出库,要求能用文件保存仓库货品信息。
2、基本要求
(1)、数据要求
1) 建议输入货物的名称,编号,数量等,其余信息学生自行设计; 2) 输出形式:有合理的提示,编号,名称,数量对应; 3) 数据的存储结构自行设计。
4)仓库货物的相关数据要存储在数据文件中。 (2)、操作要求
建立一个仓库管理程序,可以按顺序和货物名称查询仓库存储情况,也可以增加或删除货物信息、实现货物的入库出库,要求能用文件保存仓库货品信息。
(3)、测试数据要求 测试数据要求使用:
1、全部合法数据; 2、整体非法数据;
3、局部非法数据。进行程序测试,以保证程序的稳定。 (4)、界面要求
有合理的提示,每个功能可以设立菜单,根据提示,能完成相关的功能操作并符合要求。 (5)、存储结构要求
学生自己根据系统功能要求自己设计,但是要求仓库货物的相关数据要存储在数据文件中。(数据文件的数据读写方法等相关内容在c语言程序设计的书上,请自学解决)请在最后的上交资料中指明你用到的存储结构。
3、数据结构
(1)、定义货物数据类型
定义货物数据类型双向链表,用于存放货物的信息,包括货物名称,数量,编号等信息。
typedef struct dnode {
int Number; //货物编号 char Name[max]; //货物名称 int Counter; //货物数量 struct dnode *prior,*next; }dlnode,*dlinklist;
4、总体设计
根据仓库管理系统的分析及设计要求,可以将此系统分为四个模块:信息统
计模块、信息排序输出模块、信息查询模块、信息调用模块。 (1)、信息统计模块实现信息的输入、统计,涉及函数有:void Input()、 (2)、信息输出模块实现信息的输出,涉及函数有:void OutputByName()、void OutputByNum()void init_linklist()void Show() (3)、信息查询模块实现信息的查询,涉及函数有: (4)、信息调用模块实现信息的调用,即从文件中读出信息并输出、保存信息,涉及函数有:void Load(),void Save()
主函数与各函数调用关系流程图、结构图:
信息输入模块 信息输入仓库管理系统 信息输出模块 信息查询模块 信息调用模块 按货物编号输出按货物名称输出按货物编号查询按货物名称查询信息保存信息读取 总分显示菜单界面 输入功能序号 开始 货物的入库和出库 加载货物信息 查看货物信息 查询货物信息 退出并保存信息 主菜单 信息排序输出模块流程图
信息查询模块流程图
选择查询方式 信息查询界面 开始 按货物编号查询按货物名称查询退出返回主菜单5、详细设计
(1)、货物入库功能
void Input()、void InitList()是信息输入、双链表初始化函数,可以按用户执意输入信息 、包括货物的名称编号和数量。 其主要功能流程图如下:
主菜单
开 始 输入名称、编号、数量 N 合法 Y init_linklist(dlinklist *l) 结 束 (2)、货物出库功能
void OutputByName()、void OutputByNum()两个函数 分别可实现通过名称查找出库和通过编号查找出库 其主要功能流程图如下:
货物出库 货物是否存在 Y 输入名称或编号 N 开始 结束
(3)、货物查询功能
()void Show()
函数是一个信息查询函数及查询菜单函数,显示一个查询菜单,利用switch语句实现按货物编号查询和按名称查询,利用循环语句do…while()返回查询菜单,break语句终止循环。
其主要功能流程如下:
开 始 输入查询的货物编号 货物是否存在 Y 循环查找 N 输出信息 Y 结 束 N 提示未找到 (4)、信息保存及读取
void save()、void ReadInfo()这两个函数分别实现信息保存到文件以及从文件中读取信息的功能。把信息保存到文件中以及读取保存在文件里的信息并输出。由于采用的是链式存储,可以很方便的一下把文件里的信息全部读取出来,再依次创建生成双链表,将信息全部读到两个双链表中存储。
其主要功能流程图如下:
开 始 创建文件 Y 数据写入文件 关闭文件 结 束
6、测试与调试
1、输出界面
运行程序,进入主菜单界面,用户可以选择货物入库出库、加载货物信息、信息查询、保存信息到文件、从文件中读入信息、退出系统等操作选项。为了避免再次输入大量信息,可以先选择从文件中读入信息,将以前输入的信息重新显示在屏幕上,再进行后续操作。 主菜单界面如图所示:
(1)、货物的入库
按照程序引导输入货物信息
输入苹果、橘子、馒头各10个。 (2)、输出所有货物信息信息
在主菜单输入3进入货物查看界面,所有货物信息如下图显示所示:
(3)、货物出库
在主菜单中输入1进行货物出库
选择按名称出库
输出出库结果
选择按编号出库
输出出库结果
(4)、查询信息 输入4进入信息查询界面,用户可根据自己喜好选择按货物编号查询、按货物名称查询或者退出返回主菜单。
信息查询界面如图所示:
用户可根据自己喜好选择按哪种方式查询,查询结束后,按任意键返回信息查询界面。输入3则返回主菜单。以下是分别按照货物编号、货物名称查询的情况。
按货物编号查询情况:
按货物名称查询:
(5)、调用信息
为了避免每次运行程序时都要输入大量数据,在第一次运行程序后,就已经将信息自动存档,再次运行时,可以先直接调用信息,按任意键返回主菜单,再进行后续操作。调用的信息如图所示:
显示文件中读取的信息如图所示:
(6)退出系统 输入0则退出系统,并保存信息。如图所示:
3、调试分析
运行程序,进入主菜单界面,用户可以根据编号选择 测试数据:
选择1号功能进入输入信息模块,根据提示信息将以下信息输入系统中。 名称:苹果。编号:1。数量:10 名称:橘子。编号:2。数量:10 名称:馒头。编号:3。数量:10
存在问题的思考及算法的改进设想:
1显示的内容堆积在一个屏幕上,看着很混乱,用C语言里的clrscr()函数在VC++里似乎不能用,上网查了下资料,找到了一个头文件为的清屏函数system(”cls”)。
2调试程序时,遇到了屏幕一闪又回到原来界面的情况,没有输出想要得到的信息,原来是信息在屏幕上显示后,程序执行到了清屏函数,所以立马清屏了,为了看到输出信息,调用system(”pause”)函数,使程序暂停,以让用户看到输出地信息,然后再按任意键继续执行程序。
3对于读写文件不是很熟悉,fread和fwrite函数不是很会用,在读出文件里的信息并输出时花了很长时间,不过,最后总算是会用了。
4、设计总结
本次课程设计是围绕数据结构进行。根据问题描述可知,需要
解决问题并不复杂,整个问题只需要实现一个员工管理系统功能,那就是在这个系统中实现对职工信息的插入、删除、查询、排序、修改。但是,为了实现该功能,却需要一定的算法和数据结构以保证实现的时间和空间效率。把职工信息存储在一个单链表中,利用指针实现对
职工信息的各项基本操作。
经过这次数据结构课程设计,我们不仅及时巩固的了数据结构、算法、以及软件工程的知识,并明白数据结构和算法对于程序时间和空间性能的影响,及软件工程提供的开发流程和工具对于实现特定功能程序的重要意义。
当我们面对一个实际问题,应该迅速根据问题性质和特点抽象成特定的数据结构,当然每个问题都有可能能够抽象成多种数据结构,每种数据结构适应于不同的算法。因此应该综合考虑这样的数据结构、算法以及它们的空间和时间效率,然后从中选择一个作为实现程序的基础。
此外,对程序的测试应该要仔细,根据模块的特点和测试阶段,采用各种软件测试方法对程序进行测试,确保各个模块的正确性和完整性,最后集成起来测试其是否正确和完整地实现了问题描述中要求的功能。
7、 源程序清单
源代码:#include<> #include<> #include<> #define OK 1 #define ERROR 0 #define max 20
typedef struct dnode { int Number;
char Name[max]; int Counter;
struct dnode *prior,*next;
}dlnode,*dlinklist; int Menu() { int flag;
system(\"cls\"); printf(\"\\ 『欢迎进入仓库管理系统!』 \\n\"); printf(\"\\ --1、货物的入库和出库; \\n\"); printf(\"\\ --2、加载货物信息; \\n\"); printf(\"\\ --3、查看货物信息; printf(\"\\ --4、查询货物信息; printf(\"\\ --0、退出并保存信息; printf(\"\\ 请选择操作<0-4>:\"); scanf(\"%d\ return flag; }
int Menu1() { int flag;
system(\"cls\"); printf(\"\\\ 1、货物的入库;\\n\"); printf(\"\\\ 2、货物的出库;\\n\"); printf(\"\\\ 3、返回主菜单;\\n\"); printf(\"\\\ 请选择操作:\"); scanf(\"%d\ return flag; }
int Menu2() { int flag;
system(\"cls\"); printf(\"\\\ 1、按编号查询;\\n\"); printf(\"\\\ 2、按名称查询;\\n\"); printf(\"\\\ 3、返回主菜单;\\n\"); printf(\"\\\ 请选择操作:\"); scanf(\"%d\ return flag; }
int Menu3() { int flag;
system(\"cls\"); printf(\"\\\ 1、按名称出库;\\n\");
\\n\"); \\n\"); \\n\"); printf(\"\\\ 2、按编号出库;\\n\"); printf(\"\\\ 3、返回上一层;\\n\"); printf(\"\\\ 请选择操作:\"); scanf(\"%d\ return flag; }
void init_linklist(dlinklist *l) { *l=(dlinklist)malloc(sizeof(dnode)); (*l)->prior=NULL; (*l)->next=NULL; }
void Input(dlinklist L) { dlnode *s,*p; int number,counter; char name[max]; printf(\"\\\ 请输入货物编号:\"); scanf(\"%d\ printf(\"\\\ 请输入货物名称:\"); scanf(\"%s\ printf(\"\\\ 请输入货物的数量:\"); scanf(\"%d\ s=(dlnode*)malloc(sizeof(dnode)); s->Number=number; strcpy(s->Name,name); s->Counter=counter; if(L->next==NULL) { L->next=s; s->prior=L; s->next=NULL; } else { while((L=L->next)!=NULL) { if(s->Number<=L->Number)break; p=L; } if(L==NULL) { p->next=s; s->prior=p;
s->next=NULL; } else {
if(L->Number==s->Number)L->Counter=L->Counter+s->Counter; else { s->prior=L->prior; L->prior->next=s; s->next=L; L->prior=s; } } } printf(\"\\\ 入库成功!\\n\"); printf(\"\\\ \"); system(\"pause\"); }
void Show(dlinklist L) { dlinklist p; p=L->next;
printf(\"\\\名称\\编号\\数量\\n\"); while(p!=NULL) { printf(\"\\\%s\\%d\\%d\\n\ p=p->next; }
printf(\"\\\ \"); system(\"pause\"); }
void OutputByNum(dlinklist L,int num) { int num1; dlnode *p; p=L; while((p=p->next)!=NULL) { if(p->Number==num)break; } if(p==NULL) printf(\"\\\ 仓库中没有该编号的货物!\\n\"); else {
printf(\"\\\ 货物的信息是:\\n\"); printf(\"\\\ 货物的编号:\"); printf(\"%d\\n\
printf(\"\\\ 货物的名称:\"); printf(\"%s\\n\
printf(\"\\\ 货物的数量:\"); printf(\"%d\\n\ printf(\"\\\ 请输入货物出库的数量:\"); scanf(\"%d\ if(p->Counter>num1) { p->Counter=p->Counter-num1; printf(\"\\\ 出库成功!仓库中%s剩余的数量为:%d\\n\ }
else if(p->Counter==num1) { if(p->next==NULL) { p->prior->next=NULL; free(p); } else { p->prior->next=p->next; p->next->prior=p->prior; free(p); } printf(\"\\\ 出库成功!货物已经全部出库!\\n\"); } else printf(\"\\\ 仓库中货物数量不够出库数量,请核实货物信息!\\n\"); }
printf(\"\\\ \"); system(\"pause\"); }
void OutputByName(dlinklist L,char name[max]) { int num1; dlnode *p; p=L; while((p=p->next)!=NULL) { if(strcmp(name,p->Name)==0)break;
} if(p==NULL)printf(\"\\\ 仓库中没有叫该名称的货物!\\n\"); else { printf(\"\\\ 货物的信息是:\\n\"); printf(\"\\\ 货物的编号:\"); printf(\"%d\\n\
printf(\"\\\ 货物的名称:\"); printf(\"%s\\n\
printf(\"\\\ 货物的数量:\"); printf(\"%d\\n\ printf(\"\\\ 请输入货物出库的数量:\"); scanf(\"%d\ if(p->Counter>num1) { p->Counter=p->Counter-num1; printf(\"\\\ 出库成功!仓库中%s剩余的数量为:%d\\n\ }
else if(p->Counter==num1) { if(p->next==NULL) { p->prior->next=NULL; free(p); } else { p->prior->next=p->next; p->next->prior=p->prior; free(p); } printf(\"\\\ 出库成功!货物已经全部出库!\\n\"); } else printf(\"\\\ 仓库中货物数量不够出库数量,请核实货物信息!\\n\"); }
printf(\"\\\ \"); system(\"pause\"); }
void Save(dlinklist L) { dlnode *p; p=L->next;
FILE *fp;
if((fp=fopen(\"\ {
printf(\"\\\ 文件打开失败!!\\n\"); return; }
while(p!=NULL) { fprintf(fp,\"%d %s %d \ p=p->next; }
fclose(fp);
printf(\"\\\ 数据存储成功!!!谢谢使用!!!\\n\"); printf(\"\\\ \"); system(\"pause\"); }
void Load(dlinklist L) { dlnode *r,*s; r=L;
FILE *fp;
if((fp=fopen(\"\ {
printf(\"\\\\文件打开失败!!\\n\"); return; }
while(!feof(fp)) { s=(dlnode*)malloc(sizeof(dnode)); fscanf(fp,\"%d %s %d \ r->next=s; s->prior=r; r=s; r->next=NULL; } fclose(fp);
printf(\"\\\\加载数据成功!\\n\"); printf(\"\\\\\"); system(\"pause\"); }
dlnode *SrchByName(dlinklist L,char name[max]) { dlnode *p; p=L->next;
while (p!=NULL) { if (strcmp(p->Name,name)!=0) p=p->next; else break; } return p; }
dlnode *SrchByNumber(dlinklist L,int num) { dlnode *p; p=L->next; while (p!=NULL) { if (p->Number!=num) p=p->next; else break; } return p; }
void main() {
int num1,num2; int flag=1,flag1=1,flag2=1; char name1[max],name2[max]; dlinklist L; init_linklist(&L); while(1) { switch(Menu()) { case 1: while(1) { switch(Menu1()) { case 1: Input(L); break; case 2:
while(1) {
switch(Menu3()) { case 1: printf(\"\\\ 请输入要出库的货物的名称:\"); scanf(\"%s\ OutputByName(L,name1); break; case 2: printf(\"\\\ 请输入要出库的货物的编号:\"); scanf(\"%d\ OutputByNum(L,num1); break; case 3: flag=0; break; default: { printf(\"\\\ 选择错误!请重新选择<1-3>!\\n\"); printf(\"\\\ \"); system(\"pause\"); } } if(flag==0)break; } break; case 3:flag1=0;break; default: { printf(\"\\\ 选择错误!请重新选择<1-3>!\\n\"); printf(\"\\\ \"); system(\"pause\"); } }
if(flag1==0)break; } break; case 2:Load(L);break; case 3:Show(L);break; case 4: while(1) { switch(Menu2()) { case 1:
printf(\"\\\ 请输入您要查询的货物的编号:\"); scanf(\"%d\ if(SrchByNumber(L,num2)!=NULL) { printf(\"\\\ 查询成功!货物的信息是:\\n\"); printf(\"\\\ 货物的编号:\");
printf(\"%d\\n\ printf(\"\\\ 货物的名称:\");
printf(\"%s\\n\ printf(\"\\\ 货物的数量:\"); printf(\"%d\\n\ } else printf(\"\\\ 查询失败!\\n\"); printf(\"\\\ \"); system(\"pause\"); break; case 2: printf(\"\\\ 请输入您要查询的货物的名称:\"); scanf(\"%s\ if(SrchByName(L,name2)!=NULL) { printf(\"\\\ 查询成功!货物的信息是:\\n\"); printf(\"\\\ 货物的编号:\");
printf(\"%d\\n\ printf(\"\\\ 货物的名称:\");
printf(\"%s\\n\ printf(\"\\\ 货物的数量:\"); printf(\"%d\\n\ } else printf(\"\\\ 查询失败!\\n\"); printf(\"\\\ \"); system(\"pause\"); break; case 3:flag2=0;break; default: { printf(\"\\\ 选择错误!请重新选择<1-3>!\\n\"); printf(\"\\\ \"); system(\"pause\"); } } if(flag2==0)break; } break;
case 0: Save(L); exit(0); break; default: { printf(\"\\\ 选择错误!请重新选择<0-4>!\\n\"); printf(\"\\\ \"); } } }
system(\"pause\"); }
因篇幅问题不能全部显示,请点此查看更多更全内容