数据结构课程设计进销存货物管理系统.docx

上传人:b****6 文档编号:7359279 上传时间:2023-01-23 格式:DOCX 页数:24 大小:485.68KB
下载 相关 举报
数据结构课程设计进销存货物管理系统.docx_第1页
第1页 / 共24页
数据结构课程设计进销存货物管理系统.docx_第2页
第2页 / 共24页
数据结构课程设计进销存货物管理系统.docx_第3页
第3页 / 共24页
数据结构课程设计进销存货物管理系统.docx_第4页
第4页 / 共24页
数据结构课程设计进销存货物管理系统.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

数据结构课程设计进销存货物管理系统.docx

《数据结构课程设计进销存货物管理系统.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计进销存货物管理系统.docx(24页珍藏版)》请在冰豆网上搜索。

数据结构课程设计进销存货物管理系统.docx

数据结构课程设计进销存货物管理系统

《数据结构与算法》

课程设计说明书

题目:

进销存货物管理系统

学院:

计算机科学与工程学院

专业:

姓名:

学号:

指导教师:

张瑞霞

 

2014年10月11日

 

引言

随着计算机技术的发展,经济大环境的变化使得规模经济的优势不再突出。

固定的硬设备、人员数量、大量资金等资源投入占企业效益的比重变少,而软投入如管理、人力资源价值、服务、品牌附加值、渠道等要素资源的投入却能增加企业的效益。

“速度冲击规模”的速度经济概念已经向企业提出,计算机技术已经渗透到各个领域,成为各个行业必不可少的工具,特别是internet技术的推广和信息高速公路的建立,使IT产业在市场竞争中越发显示独特的优势,步入信息化的时代,有巨大的数据信息等待加工处理和传输,这使得对数据的进一步开发和利用显得尤为迫切.

仓库作为一总货品资源的集散地,货品的种类繁多,包含很多的信息数据管理。

据调查得知,以前仓库进行信息管理的方式主要是基于文本、表格等纸介质的手工处理,对于货品的出入库情况的统计和核实等往往采用对账本的的人工检查,对管理者的管理权限的不受约束,任何人都可以查看,引起资料外泄.另外,数据信息处理工作量大,容易出错,不宜查找。

而且,一般储存情况是记录在账本上的,仓库货物管理人员也只是当时记得比较清楚,时间长了进行查询会造成费事、费时、费力,如对很长时间的货物以及大量货物进行管理就更加困难了。

因此我们很有必要建立一个仓库进销存货物管理系统,使货物管理工作更加规范化、系统化、程序化,提高信息处理的速度和准确性。

1系统概述

进销存货物管理系统主要运用了数据结构中线性表的链式存储,链式存储空间的可扩展性大,将链表中的数据以文件的形式保存,程序功能包括初始化、创建表、插入、删除和查找等,以最少的内存使用和最高的效率为原则,实现客户的需求。

进入主菜单,选择相应的功能按照提示即可进入相应的操作.

本系统的主要功能如下:

(1)用户自行注册登录,保证仓库货物信息的保密性。

(2)仓库各种货物信息的输入,主要包括货物标号、名称、产地、入库价格、入库

时间、现存货物数量、已经销售数量、平均销售价格等。

(3)仓库各种货物信息的查询、修改和维护。

(4)对仓库中损坏货物信息的删除。

(5)仓库货物信息列表的生成显示.

(6)实现货物信息对文本中的保存。

2需求分析

2。

1系统需求

为了能够提高内存的利用及各功能的实现,程序主要使用了:

(1)线性表的链式存储,分配存储空间,空间可扩展性强,方便频繁的录入、插入、查找、删除和排序等而不占用多余的内存.(主要应用)

(2)文件文本的读取与写入,为了方便用户更加快速的执行管理操作。

(3)结构体的定义,定义了货物结构体。

(4)登录用户时的字符串读取及验证.

进销存货物管理系统主要实现以下函数模块功能:

(1)录入货物信息函数LinkListCreateList(void)//运用链式存储

货物信息写入文件的函数voidfile_write(ListNode*p)

文件中的信息读出的函数LinkListfile_read()

(2)查找货物函数vvoidFindNode()

(3)修改信息函数voidModNode()

(4)插入货物函数voidInsertNode()

(5)删除货物函数voidDelNode()

(6)货物信息排序函数voidgoodsrank()

(7)统计货物信息函数voidgoods_count()

(8)密码登陆系统函数voidapply();intload();voidkey()

系统能够实现初始化、创建表、插入、删除和查找等功能,使得货物管理更加规范化、系统化、程序化,方便货物管理员对仓库进行科学高效管理.

2.2开发环境

系统主要在MicrosoftVisualC++6.0的环境下开发。

VisualC++6.0,简称VC或者VC6。

0,是微软推出的一款C++编译器,将“高级语言"翻译为“机器语言(低级语言)”的程序.VisualC++是一个功能强大的可视化软件开发工具.自1993年Microsoft公司推出VisualC++1。

0后,随着其新版本的不断问世,VisualC++已成为专业程序员进行软件开发的首选工具。

虽然微软公司推出了VisualC++.NET(VisualC++7。

0),但它的应用的很大的局限性,只适用于Windows2000、WindowsXP和WindowsNT4.0。

所以实际中,更多的是以VisualC++6.0为平台.

VisualC++6。

0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrateddevelopmentenvironment,IDE)。

VisualC++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导ClassWizard等开发工具。

3详细设计

3。

1设计框架

图3.1:

设计框架图

3.2程序主要流程图

图3。

2:

程序主要流程图

3。

3主要函数设计

3.3.1登陆函数

启动系统,进入界面,会有两个选项:

1、新用户注册

2、新用户登陆

新用户注册:

执行此函数,程序会在工程目录下自动生成一个key.txt文件,用于保存新用户申请的账号和密码.

voidapply()//新用户注册

{

inti,flag=1;

FILE*fp;

charname[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("thefilecannotopen!

");

flag=0;

exit

(1);

}

fprintf(fp,"%s%s",name,key);

fclose(fp);

}

新用户登陆:

函数通过读取key。

txt文件获取新用户之前申请的账号和密码,以验证输入是否正确,从而是否允许用户进入系统。

intload()//用户登录

FILE*fp;

inti;

charname[20],key[20];

charname1[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");

return1;

}

密码系统登陆界面:

图3.3:

密码系统登陆界面

3.3。

2主函数设计

程序启动进入主函数,进入主菜单界面和用户进行交互。

用户可以直接明了的清楚软件的功能项目,调用各个模块的功能项目,进行选择。

主菜单一共有十个选项,分别为:

1——-货物管理的建立

2---货物管理的插入

3---货物管理的查询

4—--货物管理的删除

5——-货物管理的输出

6—-—货物管理的修改

7--—货物管理的销售更新

8———货物管理的信息排序

9-—-货物管理的信息统计

10—-清屏

0—-—退出货物管理系统

选择其中的选项后,会执行相应的函数:

case1:

head=CreateList();//建立链表

case2:

InsertNode();//插入节点

case3:

FindNode();//查找节点

case4:

DelNode();//删除结点

case5:

PrintList();//输出

case6:

ModNode();//修改

case7:

UpdatedNode();//更新

case8:

goodsrank();//排序

case9:

goods_count();//统计

case10:

system(”cls”);//清屏

case0:

system("cls”);//退出

主菜单界面:

图3。

4:

主菜单界面

3。

3.3货物信息的建立

数据建立是该软件必备的基本功能,当链表为空时,对货物信息变量“货物标号”判断并进行录入,系统调用录入函数,在用户输入货物信息后添加到链表里,在添加过程中按提示自动插入到相应位置。

添加成功后,返回主菜单并提示用户保存到自建的文本中,并可以根据各个模块要求进行读取修改.

利用尾插法建立带头结点的货物管理链表,

LinkListhead=(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型,原来的问题就不会再出现了.

软件的货物信息录入、插入、更新、统计等功能都是在链表的基础上操作,在写系统之前就应该对这方面做足了功课,否则将无从下手。

货物的信息录入,也就是链表的创建,在设计软件之初时,我利用尾插法进行创建。

正确的算法大概为:

LinkListhead=(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&&knext;k=k+1;}而开始写代码的时候居然写成了k<=i—1,这才导致了后面不应该出现的错误。

货物的排序应用了冒泡排序和直接插入排序的算法,冒泡排序由于引用的次数比较多,写起来也就很顺手,但是对于直接插入排序的算法不是很经常用,所以重新翻开书籍阅读了这方面的知识才动手写算法.

在启动软件的时候,会出现密码登陆界面,这个登陆系统是后面才完善的.密码登陆系统在工程文件下创建一个"key.txt”,用以保存用户注册的密码.所以已经注册过的用户无需再次

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1