资源描述
。
《数据结构与算法》
课程设计说明书
题 目: 进销存货物管理系统
学 院: 计算机科学与工程学院
专 业:
姓 名:
学 号:
指导教师: 张瑞霞
2014年 10 月 11 日
目 录
引言 3
1 系统概述 3
2 需求分析 3
2.1 系统需求 3
2.2 开发环境 4
3 详细设计 4
4 所遇到的问题和分析解决 17
5 系统特色及关键技术 20
6 结论 21
参考文献 22
-可编辑修改-
。
引言
随着计算机技术的发展,经济大环境的变化使得规模经济的优势不再突出。固定的硬设备、人员数量、大量资金等资源投入占企业效益的比重变少,而软投入如管理、人力资源价值、服务、品牌附加值、渠道等要素资源的投入却能增加企业的效益。“速度冲击规模”的速度经济概念已经向企业提出,计算机技术已经渗透到各个领域,成为各个行业必不可少的工具,特别是internet技术的推广和信息高速公路的建立,使IT产业在市场竞争中越发显示独特的优势,步入信息化的时代,有巨大的数据信息等待加工处理和传输,这使得对数据的进一步开发和利用显得尤为迫切。
仓库作为一总货品资源的集散地,货品的种类繁多,包含很多的信息数据管理。据调查得知,以前仓库进行信息管理的方式主要是基于文本、表格等纸介质的手工处理,对于货品的出入库情况的统计和核实等往往采用对账本的的人工检查,对管理者的管理权限的不受约束,任何人都可以查看,引起资料外泄。另外,数据信息处理工作量大,容易出错,不宜查找。而且,一般储存情况是记录在账本上的,仓库货物管理人员也只是当时记得比较清楚,时间长了进行查询会造成费事、费时、费力,如对很长时间的货物以及大量货物进行管理就更加困难了。因此我们很有必要建立一个仓库进销存货物管理系统,使货物管理工作更加规范化、系统化、程序化,提高信息处理的速度和准确性。
1 系统概述
进销存货物管理系统主要运用了数据结构中线性表的链式存储,链式存储空间的可扩展性大,将链表中的数据以文件的形式保存,程序功能包括初始化、创建表、插入、删除和查找等,以最少的内存使用和最高的效率为原则,实现客户的需求。进入主菜单,选择相应的功能按照提示即可进入相应的操作。
本系统的主要功能如下:
(1)用户自行注册登录,保证仓库货物信息的保密性。
(2)仓库各种货物信息的输入,主要包括货物标号、名称、产地、入库价格、入库
时间、现存货物数量、已经销售数量、平均销售价格等。
(3)仓库各种货物信息的查询、修改和维护。
(4)对仓库中损坏货物信息的删除。
(5)仓库货物信息列表的生成显示。
(6)实现货物信息对文本中的保存。
2 需求分析
2.1 系统需求
为了能够提高内存的利用及各功能的实现,程序主要使用了:
(1)线性表的链式存储,分配存储空间,空间可扩展性强,方便频繁的录入、插入、查找、删除和排序等而不占用多余的内存。(主要应用)
(2)文件文本的读取与写入,为了方便用户更加快速的执行管理操作。
(3)结构体的定义,定义了货物结构体。
(4)登录用户时的字符串读取及验证。
进销存货物管理系统主要实现以下函数模块功能:
(1)录入货物信息函数 LinkList CreateList(void) //运用链式存储
货物信息写入文件的函数 void file_write(ListNode *p)
文件中的信息读出的函数 LinkList file_read()
(2)查找货物函数 vvoid FindNode()
(3)修改信息函数 void ModNode()
(4)插入货物函数 void InsertNode()
(5)删除货物函数 void DelNode()
(6)货物信息排序函数 void goodsrank()
(7)统计货物信息函数 void goods_count()
(8) 密码登陆系统函数 void apply();int load();void key()
系统能够实现初始化、创建表、插入、删除和查找等功能,使得货物管理更加规范化、系统化、程序化,方便货物管理员对仓库进行科学高效管理。
2.2 开发环境
系统主要在Microsoft Visual C++ 6.0的环境下开发。
Visual C++ 6.0,简称VC或者VC6.0,是微软推出的一款C++编译器,将“高级语言”翻译为“机器语言(低级语言)”的程序。Visual C++是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C++1.0后,随着其新版本的不断问世,Visual C++已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C++.NET(Visual C++7.0),但它的应用的很大的局限性,只适用于Windows 2000、Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C++6.0为平台。
Visual C++6.0不仅是一个C++ 编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。
3 详细设计
3.1 设计框架
图 3.1:设计框架图
3.2 程序主要流程图
图 3.2:程序主要流程图
3.3 主要函数设计
3.3.1 登陆函数
启动系统,进入界面,会有两个选项:
1、 新用户注册
2、 新用户登陆
新用户注册:
执行此函数,程序会在工程目录下自动生成一个key.txt文件,用于保存新用户申请的账号和密码。
void apply() //新用户注册
{
int i,flag=1;
FILE *fp;
char name[20],key[20];
flushall();
printf("\n****新用户注册****\n");
printf("\t\t\t用户名(不能为空):");
scanf("%s",name);
flushall();
printf("\t\t\t密码(不能为空):");
for(i=0;i<=20;i++)
{
key[i]=getch();
if(key[i]==13)
{
key[i]='\0';
break;
}
printf("*");
}
fp=fopen("key.txt","w");
if(fp==NULL)
{
printf("the file can not open!");
flag=0;
exit(1);
}
fprintf(fp,"%s %s",name,key);
fclose(fp);
}
新用户登陆:
函数通过读取key.txt文件获取新用户之前申请的账号和密码,以验证输入是否正确,从而是否允许用户进入系统。
int load() //用户登录
{
FILE *fp;
int i;
char name[20],key[20];
char name1[20],key1[20];
fp=fopen("key.txt","r");
fscanf(fp,"%s %s",name,key);
fclose(fp);
printf("\n**新用户登陆**\n");
printf("\t\t\t用户名(不能为空):");
scanf("%s",name1);
flushall();
printf("\t\t\t密码(不能为空):");
for(i=0;i<=20;i++)
{
key1[i]=getch();
if(key1[i]==13)
{
key1[i]='\0';
break;
}
printf("*");
}
printf("\n");
if(strcmp(name1,name)==0&&strcmp(key1,key)==0)
{ printf("登陆成功!\n\n");
return 1;
}
}
密码系统登陆界面:
图 3.3:密码系统登陆界面
3.3.2 主函数设计
程序启动进入主函数,进入主菜单界面和用户进行交互。用户可以直接明了的清楚软件的功能项目,调用各个模块的功能项目,进行选择。
主菜单一共有十个选项,分别为:
1--- 货物管理的建立
2--- 货物管理的插入
3--- 货物管理的查询
4--- 货物管理的删除
5--- 货物管理的输出
6--- 货物管理的修改
7--- 货物管理的销售更新
8--- 货物管理的信息排序
9--- 货物管理的信息统计
10-- 清屏
0--- 退出货物管理系统
选择其中的选项后,会执行相应的函数:
case 1:head=CreateList( );//建立链表
case 2: InsertNode(); //插入节点
case 3: FindNode(); //查找节点
case 4:DelNode(); //删除结点
case 5: PrintList(); //输出
case 6: ModNode(); //修改
case 7: UpdatedNode(); //更新
case 8: goodsrank(); //排序
case 9: goods_count();//统计
case 10: system("cls");//清屏
case 0:system("cls"); //退出
主菜单界面:
图 3.4:主菜单界面
3.3.3 货物信息的建立
数据建立是该软件必备的基本功能,当链表为空时,对货物信息变量“货物标号”判断并进行录入,系统调用录入函数,在用户输入货物信息后添加到链表里,在添加过程中按提示自动插入到相应位置。添加成功后,返回主菜单并提示用户保存到自建的文本中,并可以根据各个模块要求进行读取修改。
利用尾插法建立带头结点的货物管理链表,
LinkList head=(ListNode *)malloc(sizeof(ListNode)); //申请头结点
ListNode *p,*rear;
rear=head; //尾指针初始指向头结点
scanf("%s",p->data.NO);//输入货物标号
scanf("%s",p->data.name);//输入货物名称
scanf("%s",p->data.area);//输入货物产地
scanf("%f",&p->data.price);;//输入货物入库价格
scanf("%s",p->data.time);//输入货物入库时间
scanf("%d",&p->data.number1);//输入货物入库数量
scanf("%d",&p->data.number2);//输入货物已经销售数量
scanf("%f",&p->data.sellprice);//输入货物销售价格
rear->next=p; //新结点连接到尾结点之后
rear=p; //尾指针指向新结点
rear->next=NULL; //终端结点指针置空
file_write(head);// 保存输入的货物信息
建立货物信息界面:
图 3.5:建立货物信息界面(1)
图 3.5:建立货物信息界面(2)
3.3.4 货物信息的插入
本系统设置了货物一共有八个属性,分别是货物的标号、货物名称、货物产地、入库价格、入库时间、现存货物数量、已经销售货物数量、销售平均单价。在进行货物信息的插入时应该按照上面的顺序依次插入,插入的位置也可以自由选择。插入完成后系统会提醒文件需要保存的位置。
在进行货物信息的插入前,系统会提示用户输入插入点。根据以下函数可以找到相应的插入点
while(p2&&k<i-1)
{
p2=p2->next;
k=k+1;
} i为货物插入的点。
p1=(ListNode*)malloc(sizeof(ListNode));
节点申请成功后输入货物的信息,p1节点将保存货物的信息。
p1->next=p2->next;
p2->next=p1;//将新节点插入
货物信息插入的界面:
图 3.6:货物信息插入的界面(1)
图 3.6:货物信息插入的界面(2)
3.3.5 货物信息的查询
查找货物是信息管理的基本功能,当数据很多时怎么快速找到货物对管理员来说很重要,系统调用查找函数模块,显示查找菜单。根据提示输入需要查找的“货物标号”或者“货物名称”进行查找,查找成功,用户会看到查找货物的详细信息,如没有该货物,则查找失败,查找的主要函数设计:
p=p0=file_read();//读取文件
p=p->next;
scanf("%s",&pp);//输入查找的方式,a为按照货物的标号查找,b为按照货物的名称查找,设计两种方式查找货物的信息,更利于管理员对货物进行管理
getchar();
if (pp=='a'||pp=='A')
{
printf("请输入要查找的货物标号:");
scanf("%s",&num);
while (p&&strcmp(p->data.NO,num)!=0)
p=p->next;
}
else //按照货物的名称查找
if (pp=='b'||pp=='B')
{
printf(" 请输入要查找的货物名称:");
scanf("%s",&name);
while(p&&strcmp(p->data.name,name)!=0)
p=p->next;
}
以上函数是找到货物的储存位置,而找到货物之后将货物打印出来,用户就可以看到所要查找的货物的相应信息了。
货物查询的界面:
图 3.7:货物查询的界面
3.3.6 货物信息的删除
删除是一项对数据管理的功能,将过期的货物信息删除,以免影响仓库管理,删除函数的原理和查找函数原理一样,只是在输入“货物标号”找到对应的货物后删除该结点,就会删除该货物的所有详细信息,并提示用户保存!
p0=file_read();//调用此函数读取所要删除的文件信息
while(p!=NULL)
{
if(strcmp(p->data.NO,no)==0)//找到相应的结点
{
p1->next=p->next;
free(p);//删除链表中的结点
flag=1;
break;
}
p1=p;
p=p->next;
flag=0;
}
删除成功后,新的货物信息会打印出来,并提示用户保存。
货物信息删除的界面:
图 3.8:货物信息删除的界面
3.3.7 货物信息的输出
软件的此功能能够使用户获得货物的全部信息,利于管理员对货物的管理。
p0=file_read();
p0=p0->next;
printf("货物标号 货物名称 货物产地 入库价格 入库时间 现存数量 已售数量 销售均价\n");
while(p0!=NULL)
{ printf("%7s %10s %10s %8.2f %10s %10d %10d %8.2f",
p0->data.NO,p0->data.name,p0->data.area,p0->data.price,p0->data.time,
p0->data.number1,p0->data.number2,p0->data.sellprice);
p0=p0->next;
}
货物信息输出界面:
图 3.9:货物信息输出界面
3.3.8 货物信息的修改
软件的此项功能限制用户只能修改货物的标号,货物名称,货物产地,入库价格,入库时间,不能修改货物的已售数量和销售平均单价两个属性,如需要修改此两项信息,需要进入“货物管理的销售更新”选项进行操作。
对货物的信息修改,就是对链表的操作,首先需要找到所要修改的结点,根据函数:
scanf("%s",snum);//系统提示用户输入所要修改货物的标号
while(p1!=NULL)
{
if(strcmp(p1->data.NO,snum)==0)
{ flag=1; break; }
p1=p1->next;
}
货物信息的修改界面:
图 3.10:货物信息修改界面
3.3.9 货物信息的销售更新
对货物的销售更新,需要对其销售数量和销售均价进行更新。在输入的时候,系统会提示用户输入销售的数量和后面销售的均价,完成这两个输入后,系统会自动更新货物的已经销售数量、现存数量和销售均价。
p1->data.sellprice=(p1->data.number2*p1->data.sellprice+num1*price1)/(p1-> data.number2+num1);//更新货物的销售均价
p1->data.number1=p1->data.number1-num1;//更新货物的现存数量
p1->data.number2=p1->data.number2+num1;//更新货物的已经销售数量
货物信息的更新界面:
图 3.11:货物信息更新界面
3.3.10 货物信息的排序
货物信息排序,为了可以更清楚的了解到货物库存量的多少,方便于管理者对仓库货物的销售政策和对即将过期货物的多少有所了解,使仓库管理员更直观的了解到仓库库存。该函数找到货物的记录信息按照货物数量从小到大重新排序,排序完后,返回主菜单并提示用户保存! 在对货物排序时,用户可以根据货物的现存数量、货物的入库价格、货物的已经销售价格、货物的销售均价进行排序。在对货物的现存数量进行排序时,应用了冒泡排序的方法,大体算法如下:
while(p->next)//冒泡排序
{ k=p;q=p->next;
while(q)
{ if((k->data.number1)>(q->data.number1))
k=q;q=q->next;
}
if(p!=k)
{ t=*p; *p=*k; *k=t;
t.next=p->next;
p->next=k->next;
k->next=t.next;flag=1;
}
p=p->next;
}
对货物的入库价格进行排序时,应用了直接插入的排序方法,充分利用数据结构与算法的内容进行设计系统。
ListNode *ptr1,*ptr2;
q=L;
ptr2=ptr1=p->next; //待排序链表
p->next=NULL;
while(ptr1)
{ while(p)
{
if(p->data.price>ptr1->data.price)
{
ptr2=ptr1->next; //记录无序链表下一个节点
q->next=ptr1; ptr1->next=p;
ptr1=ptr2; //ptr1指向下一个节点
break;
}
else {q=p;p=p->next;}
}
if(p==NULL)
{
ptr2=ptr1->next; //从无序链表取出节点元素
q->next=ptr1;
ptr1->next=NULL;
ptr1=ptr2; //无序链表节点后移
}
q=L;p=L->next; //有序链表
}
货物信息的排序界面:
图 3.12:货物信息排序界面
3.3.11 货物信息的统计
对货物的信息统计时,系统会自动计算出仓库里的剩余货物件数,已经销售的件数,利润总数。当货物的总数量少于200件时,会提示:仓库里的货物偏少,请适当进货!
当货物的总数量大于1100件时,会提示:仓库里积压的货物太多,请及时清仓!当货物的数量在200到1100件之间时,系统会提示:仓库里总件数大于200件,小于1100件,无需进货,清仓!
通过对链表的操作,可以实现上面的功能。
货物信息的统计界面:
图 3.13:货物信息统计界面
4 所遇到的问题和分析解决
在进行系统设计开始时,我花了一段时间思索设计了系统的主体框架。本次课程设计,重要的是将已学的算法应用到自己的设计当中,因此在构建完系统主体框架之后,我又花了很长的时间去思考系统的算法。整个系统应用了链表的内容,通过对链表的操作,可以对数据进行输入,修改,查询,和更新等。
软件的设计应用了流文件,在操作流文件时,程序出现了各式各样的问题,刚开始在建立文件的时候,文件不能写入,经过后面的调试,发现是文件的写入格式不对,将货物的入库价格和销售平均价格由double型改为float型,原来的问题就不会再出现了。
软件的货物信息录入、插入、更新、统计等功能都是在链表的基础上操作,在写系统之前就应该对这方面做足了功课,否则将无从下手。货物的信息录入,也就是链表的创建,在设计软件之初时,我利用尾插法进行创建。正确的算法大概为:LinkList head=(ListNode *)malloc(sizeof(ListNode)); rear=head;p=(ListNode *)malloc(sizeof(ListNode)); rear->next=p;
rear=p; 刚开始时在写创建链表的代码时可能因为粗心,忘记为节点申请新空间,导致后面的货物信息写入总是出现错误。
软件在对货物的信息进行更新时,用户只需要输入后面货物的销售数量和销售平均价格,而软件需要自动更新文件的现存数量、已经销售数量和销售平均价格。虽然这个算法不是太难,但如果不够细心去写的话,也可能会导致系统的更新失败。比如刚开始的时候我就把它们之间的代码顺序搞乱,结果出现了更新错误。
p1->data.sellprice=(p1->data.number2*p1->data.sellprice+num1*price1)/(p1->data.number2+num1);
p1->data.number1=p1->data.number1-num1;p1->data.number2=p1->data.number2+num1;
上面的三行代码是正确的排列顺序,如果将第一行代码跟第二行代码或者第三行代码交换,就会出现更新错误!
在写货物的信息插入的代码时候也遇到过问题,软件刚开始的时候会提示用户输入插入的位置,但在调试软件的时候老是出现插入位置不对的情况,经过检查发现是查找i的位置不对! 正确的算法为:while(p2&&k<i-1){p2=p2->next;k=k+1;} 而开始写代码的时候居然写成了k<=i-1,这才导致了后面不应该出现的错误。
货物的排序应用了冒泡排序和直接插入排序的算法,冒泡排序由于引用的次数比较多,写起来也就很顺手,但是对于直接插入排序的算法不是很经常用,所以重新翻开书籍阅读了这方面的知识才动手写算法。
在启动软件的时候,会出现密码登陆界面,这个登陆系统是后面才完善的。密码登陆系统在工程文件下创建一个"key.txt",用以保存用户注册的密码。所以已经注册过的用户无需再次注册,直接登陆即可。但直接登陆的账号仅对于上次新注册的用户有效。
以上都是在设计软件时出现的比较大的问题,做课设过程中出现的问题当然就不止上面所列举出来的。总的来说,完成这个课程设计不仅可以使自己巩固了以前所学的数据结构与算法的知识,更为以后自己写大型程序打下了坚实的基础。
5 系统特色及关键技术
系统整体都是在对链表进行操作,关键内容都用上了链表,链表的知识贯穿整个系统的设计。
软件基本上现实了课程设计的大体要求,并且在完成要求上的基本上添加了一些功能,比如清屏功能,这能使用户很好的清屏屏幕上的信息,保持界面的整洁美观。在进行货物信息的排序时,应用了两种排序方法,一种是冒泡排序,一种是直接插入排序。冒泡排序的主要算法为:
while(p->next) //冒泡排序算法
{
k=p;q=p->next;
while(q)
{
if((k->data.number1)>(q->data.number1))
k=q;q=q->next;
}
if(p!=k){
t=*p;*p=*k; *k=t;t.next=p->next;
p->next=k->next;
k->next=t.next;flag=1;
}
p=p->next;
}
直接插入的主要算法为:
ListNode *ptr1,*ptr2;
q=L; ptr2=ptr1=p->next; //待排序链表
p->next=NULL;
while(ptr1)
{ while(p)
{
if(p->data.price>ptr1->data.price)
{
ptr2=ptr1->next; //记录无序链表下一个节点
q->next=ptr1; ptr1->next=p;
ptr1=ptr2; //ptr1指向下一个节点
break;
}
else
{ q=p;p=p->next;}
}
if(p==NULL)
{
ptr2=ptr1->next; //从无序链表取出节点元素
q->next=ptr1;ptr1->next=NULL;
ptr1=ptr2; //无序链表节点后移
}
q=L;p=L->next; //有序链表
}
通过两种算法,丰富了代码的数据结构与算法,使得排序更加多样化。
软件可以自由读取计算机储存设备上的文件进行操作,有利于仓库管理员对货物进行信息更新、删除、修改等操作。
6 结论
经过近两周的数据结构课程设计实习过程中我学到了很多东西,我做的是进销存货物管理系统,这个系统基本完成了预期的一些基本功能(货物信息的录入、删除、查找和修改等),实现了仓库管理的信息化,满足了客户对于基本仓库管理的需求。这次课程设计中,各个功能模版的执行主要运用了上学期学习的数据结构中的线性表链式存储的方式,节点的插入删除等 。让我们再一次在应用中对线性表的运用有所提高,并加深了数据结构与实际应用的联系。
此外,这次的课程设计,还加强了我们动手、思考和解决问题的能力。巩固和加深了对数据结构的理解,提高综合运用本课程所学知识的能力。培养了我选用参考书,查阅手册及文献资料的能力。培养独立思考,深入研究,分析问题、解决问题的能力。通过实际编译系统的分析设计、编程调试,掌握应用软件的分析方法和工程设计方法。而且做课程设计同时也是对课本知识的巩固和加强,平时看课本时,有些问题就不是很能理解,做完课程设计,那些问题就迎刃而解了。而且还可以记住很多东西。认识来源于实践,实践是认识的动力和最终目的,实践是检验真理的唯一标准。所以这个课程设计对我们的作用是非常大的。自己从本次课设中所收获的点滴,都会为我们以后的程序之路提供强硬的基石。
参考文献
[1] 李丽娟.c/c++语言程序设计教程(从模块化到面向对象)(第3版).北京:人民邮电出版社.2012.
[2] 张乃孝.算法与数据结构.北京:高等教育出版社.2002.
[3] 严蔚敏.吴伟民. 数据结构(C语言版). 北京: 清华大学出版社. 1997.4.
[4] 严蔚敏.吴伟民. 米宁. 数据结构题集(C语言版). 北京: 清华大学出版社.1999.2.
[5] (美)Brian W.Kernighan,Dennis M.Ritchie.C程序设计语言(第2版·新版).
机械工业出版社.2004.
THANKS !!!
致力为企业和个人提供合同协议,策划案计划书,学习课件等等
打造全网一站式需求
欢迎您的下载,资料仅供参考
展开阅读全文