数据结构课程设计进销存货物管理系统论文.docx
- 文档编号:30759920
- 上传时间:2023-08-20
- 格式:DOCX
- 页数:21
- 大小:152.13KB
数据结构课程设计进销存货物管理系统论文.docx
《数据结构课程设计进销存货物管理系统论文.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计进销存货物管理系统论文.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构课程设计进销存货物管理系统论文
课程设计(论文)说明书
题目:
进销存货物管理系统
学院:
计算机与信息安全学院
专业:
物联网工程
姓名:
张小婷
学号:
1400370206
指导教师:
王代君
2106年9月30日
摘要
本论文主要描述了“进销存货物管理系统”的设计与实现。
此系统是运用数据结构的相关知识来实现的,采用C++编程语言进行编写。
系统界面简洁美观,系统包含商品的进货、销售、退货以及商品管理等模块功能,可以使人们方便、快速、有效地管理商品的信息。
论文首先对此系统进行简单的阐述,然后对系统需求进行详细的分析,接着对系统中所有的设计简单清晰的展现出来,并把设计中遇到的问题以及解决方法一一作分析,还对系统特色和关键技术进行详细解说,最后对此设计的总结以及收获与经验的分享。
关键字:
数据结构;C++;进货;销售;退货;管理系统;
引言
随着计算机技术以及信息产业的飞速发展,经济大环境的变化使得规模经营的优势不再突出。
固定的硬设备、人员的数量、大量资金等资源投入占企业效益的比重变少,而软投入如管理、人力资源价值、服务、品牌附加值等要素资源的投入却能增加企业的效益。
“速度冲击规模”的速度经济观念已向企业提出,计算机技术已经渗透到各个领域,成为各个行业必不可少的工具,特别是internet计算推广和信息高速公路的建立,使IT产业在市场竞争中越发显示独特的优势。
仓库作为总货品资源的集散地,货品的种类繁多,包含很多的信息数据管理。
据调查得知,以前的仓库进行信息管理的方式主要是基于文本、表格等资质的手工处理,对于货品的出入库情况的统计和核实往往采用对账本的人工检查,对管理者的管理权限不受约束,任何人都可以查看,引起资料外泄。
另外数据信息处理工作量大,容易出错,不宜查找,而且,记录在账本上的信息,时间长了进行查询会造成费时、费力,若对很长时间的货物以及大量货物管理就更加困难。
二十一世纪是信息时代,信息管理已经引入并应用到各行业管理领域,各种形式的百货商场、大型仓储超市、便利店、连锁超市等形式的零售、批发业鳞次栉比,不断改变、影响着人们的价值观和生活方式。
要提升企业的竞争力,就要大力推进企业信息化的建设,利用先进的办公自动化系统来实现企业内部信息管理、共享及交流。
才能使企业在竞争激烈的21世纪取得先机。
本课程设计主要解决一个小型仓库中,商品从进货、存储到销售、退货以及商品的各种管理的进销存信息管理系统。
使货物管理工作更加规范化、系统化,提高信息处理的速度和准确性。
1系统概述
进销存货物管理系统主要运用数据结构中线性表的链式存储,将链表中的数据以文本的形式保存,程序功能包括创建表、插入、删除、修改、统计查找等。
进入主菜单,选择相应的功能按照提示即可进入相应的操作。
本系统的主要功能如下:
(1)各种商品信息的输入,即进货功能,主要包括商品编号、商品名称、产地、入库价格等。
(2)各种商品信息的查询、修改和维护。
(3)对过期或损坏的商品进行删除。
(4)进行货物的销售以及退货操作。
(5)查看仓库中所有商品信息和查看所有销售记录,以及查看某种商品的销售记录。
(6)统计现存商品种数,每种商品的盈利亏损情况,以及统计总盈利等。
(7)按照各种情况排序,如按编号、入库价格、现存数量、销售数量、平均售价排序等。
(8)实现货物信息以及销售信息对文本中的保存。
2需求分析
2.1系统需求
为了提高内存的利用率及各功能的实现,程序主要使用了如下内容:
(1)线性表的链式存储,分配存储空间,空间可扩展性强,方便信息的录入、查询、修改、删除、排序等功能。
(2)文件文本的读取和写入,以及文件文本的重写,方便用户执行操作。
(3)定义商品的和销售商品两个结构体,区分销售模块与其他模块,减少编写程序时的混淆。
进销存货物管理系统主要实现以下函数模块功能:
(1)进货函数linklistcreat_good()//运用链式存储
商品信息写入文件函数linklistfile_write(node*p1)
读取文件信息函数linklistfile_read()
(2)查找商品函数intfind_good()
(3)查看所有商品函数intall_good()
(4)修改商品信息函数linklistxiugai_good()
商品信息重新写入文件函数linklistfile_write1(node*p1)
(5)删除函数linklistdelete_good()
(6)插入函数linklistinsert_good()
(7)排序函数linklistsort_good()
(8)统计函数inttongji_good()
(9)销售函数linklistsale_good()
售出商品信息存入文本文件函数salelistSale_out(snode*p1)
售出商品文本文件读取函数salelistread_sale()
(10)查看销售情况函数salelistvisit()
(11)退货函数intreturn_good()
售出商品信息重写入文本文件函数salelistSale_out1(snode*p1)
(12)商品管理函数intadmin()
(13)主页面函数intzhuyemian()
(14)主函数intmain()
这些函数功能使货物管理更加规范化、系统化、程序化,页面简洁美化,方便管理员对仓库进行科学管理。
2.2开发环境
此系统主要在code:
:
blocks13.12C++的环境下开发。
Code:
:
Blocks是一个开放源码的全功能的跨平台C/C++集成开发环境。
Code:
:
Blocks是开放源码软件。
Code:
:
Blocks由纯粹的C++语言开发完成,它使用了著名的图形界面库wxWidgets(2.6.2unicode)版。
Code:
:
Blocks优点有很多方面,比如编译时,有错误的地方它会帮你自动跳转到错误行,关键字输入一半就可以显示出来等,它可以减少很多不必要的麻烦。
而且对于追求完美的C++程序员,再也不必忍受Eclipse的缓慢,再也不必忍受VS.NET的庞大和高昂的价格。
C++是在C语言的基础上开发的一种面向对象编程语言,属于编译型语言,应用广泛,C++支持多种编程范式—面向对象、泛型编程和过程化编程,C++编程领域众广,常用于系统开发,引擎开发等应用领域等。
3详细设计
3.1设计框架
该系统从整体结构看,主要分为四大模块:
进货模块、销售模块、管理模块、退货模块。
管理模块下又有几个小模块,小模块下又有小模块,这样把各模块细化,目的是使系统结构清晰、功能齐全,让用户更加方便的使用系统。
系统各个模块之间相对独立,使用其一个中模块之后,只有返回上一级才能使用另外的模块。
设计框架如下图:
(图2.1设计框架)
3.1主要函数设计
3.1.1主函数
启动系统,进入界面,会动态输出“欢迎进入进销存货物管理系统”这些字样。
然后弹出“按任意键进入主页面”,此时按下任意键便可进入主页面。
动态输出主要运用延时程序Sleep(50),每输出一个字就用一次Sleep(50),便可动态输出。
3.1.2主页面函数
主页面函数包括有如下选项:
1--货物管理
2--进货
3--销售货物
4--退货
0--退出系统
这几个选项,用户需要进行哪些操作便可一目了然。
用户选择0—4就可以进入相应的页面,当然要是输入不是这一范围,便有提示输入错误,让用户重新输入。
截图如下:
(图2.2主页面)
3.1.3商品管理函数
在主页面中选择“1”时,便进入商品管理页面,此页面有十个选项分别是:
1---查找商品信息
2---修改商品信息
3---插入商品信息
4---删除商品信息
5---排序商品信息
6---统计商品信息
7---查看所有商品信息
8---查看商品销售信息
9---返回上一级
0---退出系统。
用户可以直接明了的清楚此模块的功能。
选择其中的选项会执行相应的函数,截图如下:
(图2.3商品管理页面)
3.1.4进货函数
进货函数是整个系统的关键,这里的“进货”其实就是数据的建立,此系统运用链表来建立货物信息,利用尾插法带头结点的货物信息链表。
用户进入到“进货”页面时,会有提示需要输入的内容,并且提示时间的年月日用空格隔开,编号为0时结束进货。
在此页面中,用户需要输入货物的编号、货物名称、产地、入库价格、保质期、进货数量,这几个信息,因为新进货,所以销售数量和平均售价都设置为“0”,入库时间则用获取系统时间的方法使其自动生成。
当输入的货物编号为“0”时,按回车键,便结束“进货”,然后提示“是否保存?
”选择“1”时便进货成功,货物的相应信息便存入文本文件,而要是选择“0”时便进货失败,不对文本文件进行编写。
接着提示“按任意键返回上一级”,按下任意键后,就会返回到主页面。
3.1.5销售货物函数
用户进入此页面时,系统需要读取商品信息的文本文件,然后系统会显示仓库中现存商品的必要信息,即:
货物编号、名称、产地、入库价格、保质期、销售数量、现存数量、平均售价等信息。
然后提示输入销售的商品编号,输如相应的编号后,系统会判断商品是否过期(保质期和系统时间进行对比,保质期时间小于系统时间,便是过期商品),若是过期商品,就有提示“此商品已过期!
是否销售?
是--1,否--0:
”,按下“0”时就取消销售,按下“1”时,提示输入销售的数量,当输入的数量大于现存数量,提示“此货物数量不足。
重新输入数量按1,结束按0。
”按下“0”时就取消此商品的销售,接着提示“结束销售按0,继续销售按1:
”,若按下“1”又可以销售其他商品,如此循环着,直到结束销售按0为止。
当输入的数量小于等于现存数量时,便有提示输入销售的价格,输入完后,销售的信息便存入销售的文本文件中(尾插法带头结点的销售的货物信息链表),销售的时间,便是系统当时的时间,接着提示销售成功,然后显示此次销售共得的人名币。
接着提示“结束销售按0,继续销售按1:
”此信息。
当输入的货物编号与显示的所有货物信息的货物编号没有相对应时,系统便提示“此商品不存在!
结束销售按0,继续销售按1:
”,然后就和以上情况相同。
当结束销售时,系统就对商品信息文本文件进行重写,换一种说法就是:
对销售掉的货物的销售数量、现存数量、平均售价,进行修改,为保存的信息与实际信息相同,系统就需要进行相应的运算,即:
某商品的销售数量为此次销售此商品的总数量加上之前的销售数量。
现存数量为,当前的现存数量减去此次销售此商品的总数量。
而平均售价为,修改前的销售数量乘上修改前的平均售价加上每次销售时的销售数量乘上每次销售的价格,再除于总的销售数量。
然后,系统将会提示按任意键返回上一级。
按下任意键,便返回到主页面。
相应截图如下:
(图2.4销售页面)
3.1.6退货函数
退货模块是整个系统的最难点,因为一种商品有不同的消费者购买,所以就有多条销售记录,销售的时间不同,售出的价格也有可能不同(比如节假日打折等,比平时价格少),退货时,就需要退掉购买的相应记录,才能准确的退货。
因此,在显示销售记录,让用户选择退货时,就有必要给每条销售记录记上编号,以便准确退掉货物。
每退掉一次,便刷新销售信息,如再次退货,则显示执行过退货的销售信息。
货物退掉之后,还需要对商品信息文本和销售文本进行重写,重写方式差不多同理于上文的销售商品使对商品信息文本的重写。
有区别地方在于,当商品信息文本中已经不存在将要被退货的商品时(信息已被删除),就需要在商品信息文本的后面加上此商品的信息(尾插法插入此商品),而当退货的商品件数等于销售的商品件数时,就需要在销售的文本文件中把相应的销售记录给删除掉。
用户进入退货页面时,系统需要读取销售信息的文本文件,如果没有销售记录,就会提示“没有销售记录!
”,再让用户输入任意键返回主页面。
如果有销售记录,就会显示销售的所有记录,并且给每条记录标上编号。
然后提示“请输入选择退货的序号”,用户输入相应序号后,接着提示输入退掉的个数,如果退掉的个数大于销售的个数,系统就会提示“输入的个数大于销售的商品个数,不合理,请重新输入!
”,直到输入个数小于等于销售个数时。
如果等于销售数量,就需要把销售的文本文件中此条销售信息给删除,小于就不需要删除,只进行修改。
完成输入后,系统便读取商品的文本文件,从而判断文件中是否存在被退货的商品,如果不存在,就在商品信息的文本文件后面加上此商品信息,如果存在,只进行修改。
每次退货,都显示退掉多少的人民币,然后对销售的文本文件进行修改。
接着提示“继续退货按1,结束退货按0!
”按下“1”,则再次选择退货,按下“0”,则结束退货。
结束退货后,便对商品的文本文件进行重写。
然后提示“按任意键返回上一级!
”,按下任意键,返回到主页面。
相应截图如下:
(图2.5退货页面)
3.1.7查找函数
用户进入查找页面时,系统会读取商品文本文件,然后提示“输入查找的商品编号”,如果此商品存在,便输出此商品的信息,要是不存在,则提示“此商品不存在!
”。
然后提示“结束查找按0,继续查找按1”,按下“1”则继续查找,按下“0”,则提示“按任意键返回上一级!
”按下任意键后,便返回到商品管理页面。
3.1.8修改函数
用户进入此页面时,系统会读取商品文本文件,然后输出仓库现存所有商品的信息。
然后提示“输入修改的商品编号”,如果输入的编号与现存商品编号有对应,则显示此商品的所有信息。
接着有如下提示:
1:
货物编号
2:
货物名称
3:
货物产地
4:
入库价格
5:
销售数量
6:
现存数量
7:
平均销售价格
8:
保质期
输入修改的类型1~8:
选择修改类型的序号后,系统将会提示输入修改后的内容(货物编号/货物名称/货物产地等)。
修改后便显示出修改后的商品所有信息。
接着提示“重新修改按1,结束修改按0;”按下“1”,则再次修改,按下“0”则结束修改。
如果输入的编号与现存商品编号没有对应,则提示“次商品号不存在,修改失败”。
接着提示“重新修改按1,结束修改按0;”按下“1”,则再次修改,按下“0”则结束修改。
结束修改后,系统会提示“是否保存?
是--按1;否--按0。
”,按下“1”则对商品文本文件进行重写,保存所有的修改,按下“0”,则不会对本次修改保存。
然后提示“按任意键返回上一级!
”按下任意键后,便返回到商品管理页面。
3.1.9插入函数
用户进入此页面时,系统会读取商品文本文件,然后提示“输入插入的位置”,如果插入位置小于等于商品总的种类数时,系统会提示输入商品的信息,即“货物编号货物名称货物产地入库价格保质期销售数量现存数量平均售价”,按回车,就提示“插入成功!
”,此时便成功插入,接着提示“继续插入按1,结束插入按0。
”按下“1”,再次插入商品,按下“0”,结束插入。
如果插入位置大于商品总的种类数时,便提示“插入位置不合理。
”接着提示“继续插入按1,结束插入按0。
”按下“1”,再次插入商品,按下“0”,结束插入。
结束插入时,系统将提示“按任意键返回上一级!
”按下任意键后,便返回到商品管理页面。
3.1.10删除函数
用户进入此页面时,系统会读取商品文本文件,然后显示如下选项:
1:
删除过期商品。
2:
删除某编号的商品。
当用户选择1时,系统会将所有的商品的保质期与系统的时间进行比较,要是有比系统时间小的商品保质期,则输出此商品,直到输出所有过期商品。
然后提示“输入想要删除的过期商品编号:
”,再输出此商品信息,并且提示“确定删除?
是--1;否--0:
”按下“1”,此时就要在链表中对此商品进行删除,显示“删除成功!
”按下“0”,则显示“删除失败!
”。
要是没有比系统时间小的商品保质期,则显示无过期商品!
当用户选择2时,提示“输入删除的商品编号”,当输入编号存在时,便输出此商品信息,再提示“确定删除?
是--1;否--0:
”同上理。
接着提示“是否保存?
是--按1;否--按0。
”按下“1”,则对商品文本文件进行重写,并且保存删除之后的信息。
接着显示“按任意键返回上一级!
”。
按下任意键,返回商品管理页面。
3.1.11排序函数
用户进入此页面时,系统会读取商品文本文件,然后显示如下选项:
1:
按商品编号排序
2:
按入库价格排序
3:
按销售数量排序
4:
按现存数量排序
5:
按平均销售价格排序
:
请输入排序类型:
输入以上类型序号后,便显示出按此类型排好的次序。
然后提示“是否保存?
是--按1;否--按0:
”按下“1”,则将排好的次序存入商品文本文件,此时需要对文本文件进行重写。
按下“0”,则不保存。
接着提示“按任意键返回上一级!
”按下任意键后,便返回到商品管理页面。
3.1.12统计函数
用户进入此页面时,系统会读取商品文本文件,然后显示如下选项:
-----------1:
统计现存商品总类。
-----------2:
统计每种货物盈利(亏损)情况。
-----------3:
统计总盈利或总亏损。
当用户选择1时,便统计出仓库商品现存种类。
然后提示“继续统计按1,结束统计按0”。
当用户选择2时,系统会计算每一件除去卖出的所有商品成本共盈利或亏损的人民币,即:
盈利或亏损=(销售均价-入库价格)*销售数量,然后显示出来。
然后提示“继续统计按1,结束统计按0”。
当用户选择3时,系统会统计卖出去的所有商品销售均价减去入库价格后的盈亏情况,若等于“0”则,显示“收支相抵”,若小于“0”则,显示共亏损的人民币,若大于“0”则,显示共盈利的人民币。
然后提示“继续统计按1,结束统计按0”。
按下“1”,再次选择统计,按下“0”时,结束统计。
结束时,系统将提示“按任意键返回上一级!
”按下任意键后,便返回到商品管理页面。
相应截图如下:
(图2.6统计页面)
3.1.13查看所有商品函数:
用户进入此页面时,系统会读取商品文本文件,要是文本文件为空,则提示“还没有任何一件商品!
”要是不为空,则显示所有商品信息。
然后系统将提示“按任意键返回上一级!
”按下任意键后,便返回到商品管理页面。
3.1.14查看销售记录函数
用户进入此页面时,系统会读取销售文本文件,然后显示如下选项:
-------1:
查看所有的销售记录
-------2:
查看某商品的销售记录
当用户选择1时,将会显示出所有销售记录;当选择2时,会有提示“请输入查找的商品编号:
”如果输入的商品编号在销售文本中存在时,就会显示出此商品的所有销售记录,当不存在时,会提示“此编号商品不存在!
”然后提示“<继续按1,退出按0>”,按下“1”,继续查看,按下“0”,结束查看。
结束时,系统将提示“按任意键返回上一级!
”按下任意键后,便返回到商品管理页面。
4所遇到的问题和分析解决
4.1文件存储问题
“进销存货物管理系统”的一个主要特点是“进货”,而每一次新进的货物存入文本时应是追加到文本后。
刚开始编写文件存储时,使用C语言进行编写,并且没有使用追加的方法,因此,每新进一次货物,文件就被覆盖掉,只保留新进货物信息。
这与现实极大不符。
因此查阅了很多书籍,根据书籍介绍,C语言文件读写的方法有两种一种是文本文件的读写,另外一种是二进制文件的读写。
读写文件需要使用一个fopen函数打开一个特定的文件,并把一个流和这个文件相关联。
它的原型如下:
FILE*open(constchar*name,constchar*mode);name参数是你希望打开的文件或设备的名字。
mode参数标识流用于只读、只写还是既读又写,以及它是文本流还是二进制流。
下面表格里列出了一些常用的模式:
读取
写入
添加
文本
“r”
“w”
“a”
二进制
“rb”
“wb”
“ab”
刚开始编写程序时写入文件只用“w”的方式,如下:
FILE*fp;
fp=fopen("f:
//Good.txt","w+");
所以每次进货原文件中的内容都会被覆盖掉,因此使用了添加“a”的方式。
为了能学到更多知识,又尝试用C++的方式来存储文件。
查阅书籍介绍使用C++存储数据时,打开某一文件使用ofstreamfout.open()函数,然后在fout.open()里面写上需要打开的文件名或位置如ofstreamfout.open("f:
//Good.txt");然后在以“fout<<(存储的内容)”,进行文件存储。
因此使用这种方法进行尝试。
编写完成后,进行测试,发现跟之前用c语言书写时一样,没有追加到文件尾部,而是将原来的内容给覆盖掉。
又经过大量翻阅资料,以及上网查询资料,才了解到C++对于格式化数据的影响,加上ios:
:
app即可解决这问题,然后又以如下方式进行修改,
ofstreamfout.open("f:
//Good.txt",ios:
:
app);
然而几次测试,依然没有解决问题。
询问其他同学才得知:
ofstream类里的函数open()原型为:
voidopen(constchar*filename,intmode,intaccess);filename表示要打开的文件名,mode表示要打开文件的方式,access表示打开文件的属性。
mode有很多值:
以追加的方式打开ios:
:
app,文件打开后定位到文件尾ios:
:
ate,以二进制方式打开ios:
:
binary,以输出方式打开ios:
:
out,以输入方式打开ios:
:
in;对于格式化数据的影响,加上ios:
:
app即可解决这问题,但数据存储按常理是每次在原来基础的最后继续添加数据,以文本的信息存储最好,因为后台打开就可以看到数据对与错,所以打开方式使用ios:
:
ate|ios:
:
in|ios:
:
out条件值是最优的,每次以文本形式打开文件并定位到文件尾,数据存储也是以文本的形式存储,而access打开文件的属性选择默认就可以。
根据他的观点,便在原来的基础上进行如下修改
ofstreamfout.open("f:
//Good.txt",ios:
:
ate|ios:
:
in|ios:
:
out);几次测试后结果正确,所以源代码中文件的存储方式都用C++的方式进行存储。
4.2删除问题
根据要求,已经过时陈旧的商品应该能够及时处理掉,这里就需要能在第一时间知道商品有无过期,一一查看每种商品的保质期,这种方法工作量大,并且不符合实际。
所以需要系统能够根据系统时间来与保质期进行对比,保质期小于系统时间便是过期商品。
到这里又遇到如何获取系统时间的问题。
上网查了资料,有多种读取系统时间的方法,本系统用如下方法获取系统时间:
GetLocalTime(&now_time);//获取系统时间函数,头文件为#include
p1->data.y_date=now_time.wYear;//系统年
p1->data.m_date=now_time.wMonth;//系统月
p1->data.d_date=now_time.wDay;//系统日
还需要在外部定义now_time为SYSTEMTIME类型。
这样便可获取系统时间。
系统经过比较之后,就可以快速查询过期商品,并将其删除了。
4.3退货问题
刚开始的编写的退货模块,没有解决退货到具体的哪一条销售记录,只能“强行退货”。
这里的“强行退货”是指只在商品的文本文件中进行修改,没有修改销售的文本文件,并且退回的价钱也不能根据销售时的价钱进行退款,只能按照销售均价或者是键盘输
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 进销存 货物 管理 系统 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)