范例算法与数据结构课程设计.docx
《范例算法与数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《范例算法与数据结构课程设计.docx(21页珍藏版)》请在冰豆网上搜索。
![范例算法与数据结构课程设计.docx](https://file1.bdocx.com/fileroot1/2022-12/31/d58bad20-9dd5-4baf-8ca4-d53d60de4075/d58bad20-9dd5-4baf-8ca4-d53d60de40751.gif)
范例算法与数据结构课程设计
编号:
120
数据结构与算法课程设计
说明书
进销存货物管理系统
学 院:
计算机科学与工程学院
专业:
计算机科学与技术
学生姓名:
学号:
指导教师:
2016年6月26日
摘要
本课程设计报告系统地阐述了我使用C++编写的进销存货物管理系统。
首先,我对系统进行一个简要的概述。
然后,我就系统的需求进行了详细的分析,这是设计工作中不被人们重视但却非常重要的一步。
接下来,我把系统中所有的设计简明清晰地展现出来,并把我在设计中遇到的问题和分析解决问题的办法一一做了分析。
当然,我还讲到系统中的关键技术和让人眼前一亮的特色。
最后,在结论中,我对自己的课程设计做了总体的评价同时简述了我在这次课程设计中的收获和经验。
关键词:
数据结构与算法课程设计;进销存货物管理系统;C++;
引言
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。
计算机的发明应用,被视为人类的第三次重大的科学技术革命,是一次飞跃。
过去的革命最高成就就是“用机器制造机器”,是手的延长,而计算机的出现却能做到“用机器控制机器”,是脑的延伸。
计算机是提高生产效率的主要工具及途径。
在信息化快速发展的今天,企业与顾客、企业与供方的关系变得更加密切和复杂。
强化管理,规范业务流程,提高透明度,加快商品资金周转,为流通领域信息管理全面网络化打下基础,是商品销售公司乃至众多商业企业梦寐以求的愿望。
随着技术发展,计算机操作及管理日趋简化,计算机知识日趋普及,同时市场经济快速多变,竞争激烈,企业采用计算机管理进货、库存、销售等诸多环节也已成为趋势及必然。
进销存管理系统依靠现代化的计算机信息处理技术来管理进货,从而节省了大量的人力、物力,改善了员工的工作条件,减轻了劳动强度,并且能够快速反映出商品的进、销、存等状况和各种反馈信息分析,使管理人员快速对市场的变化做出相应的决策,从而掌握市场先机。
二十一世纪是信息时代,计算机的应用已普及经济和社会生活的各个领域,越来越多的公司、企业、学校等单位都不同程度的利用电脑来进行资源管理。
随着电脑应用的普及,单纯人工操作管理方式也即将被淘汰。
所以计算机化管理已经成为一种必然的趋势。
本系统运用C++进行开发,它能够呈现出简明清晰的界面,并被人们能够很好地理解和使用,并能在一些方面给人们更好的服务,相信它能够被大多数用户所接受。
在通过运用数据结构与算法相结合的课程设计,来完成进销存货物管理系统时,一方面是为了检查我们的学习成果,另一方面是为了更进一步对数据结构与算法的掌握和运用,同时也让我们清楚的知道自己的掌握水平和不足之处。
1系统概述
在这次课程设计中,我经过近两个星期的努力,克服了种种困难并向同学和老师请教过不少问题,终于完成了进销存货物管理系统。
为了做好这次课程设计,我认真做好了需求分析和系统的详细设计。
本进销存货物管理系统使用C++编写,能够完成货物入库、货物删除、货物信息修改、货物信息统计、货物信息查询、货物信息排序、建立货物管理表和文件读写等功能。
其中,我使用的数据结构有链表类、时间类、货物类,使用的算法有求和、直接选择排序等。
进销存货物管理系统界面简洁、清楚、功能齐全,使用方便,交互界面良好,让没用过这个系统的人一看就知道如何操作。
2需求分析
2.1系统需求
该系统能进行简单的货物管理,进货,销售货物,退货等管理,并建立货物管理表。
货物管理表中至少包括如下信息:
货物标号,货物名称,货物产地,入库价格,入库时间,现存货物数量,已经销售数量,销售平均单价。
每次销售后,都需要对现存货物数量进行更新,对已销售数量进行更新,也需要对销售平均单价进行更新。
功能要求:
1.具有建立数据文件(货物管理表)的功能;
2.具有数据输入功能;
3.具有数据修改功能;
4.具有数据删除功能(当一些已经过时陈旧的商品被特价处理后,将其删除,不再进货);
5.能查询(查找)一些基本信息(如能查询剩余件数小于某个特定值的商品,以便于及时进货);
6.具有多种统计功能(如统计每种货物是否有盈利(将销售平均单价跟入库价格进行比较),所有货物的盈利或亏损等等)
7.具有排序功能(比如对货物盈利水平进行排序比较等等)
2.2开发环境
开发语言:
C++
开发环境:
win764位操作系统
开发软件:
MicrosoftVisualC++6.0
2.3界面需求
系统界面要具有广泛的实用性,便于移植。
界面友好,操作简便。
根据软件的使用环境、用户的要求,系统界面应该简单、友好、易于使用、方便查看、简洁明快。
而且系统是在Windows环境下的应用软件,软件产品的界面应该与操作系统的界面相切合,产品的主界面应该功能齐全,分类明确,让用户一眼看去就能明白大致的功能。
2.4输入输出格式
本系统是一个进销存货物管理系统,采用VC++6.0编译器作为开发环境,输入数据类型主要是string、int、float、double等数据类型,输入内容包括:
货物名称、编号、入库价格、入库时间等数据。
用户在输入学生数据时不需要保证输入数据格式的正确性,系统会自动检测输入的数据是否正确,输出形式与输入形式类似,根据需要可以选择显示输入的各项内容,还可以选择显示计算好盈利后并排序后的记录,显示内容包括:
货物名称、货物编号、入库价格、货物数量、总利润等数据。
3详细设计
3.1货物管理表:
编号
名称
地址
入库价格
入库时间
库存数量
已销售数量
平均单价
1
牙膏
1号
1
200211
3
5
1
2
电刀
2号
2
200522
2
0
2
3
山楂
9号
3
200633
3
3
3
4
红茶
5号
5
199855
3
4
5
3.2系统功能结构图:
进销存货物管理系统
货物入库
货物删除
货物信息查询
货物信息修改
货物信息统计
货物信息排序
退出
3.3各功能模块详细设计:
(1)主函数模块:
用主函数main()来实现。
主要是通过设计一个test()函数并让主函数调用它来显示主菜单,让用户选择操作。
在test()函数中,我应用了while循环和switch-case语句来进行选择,是个比较简单实现的模块。
最后若选择“Y”则继续循环,若选择“N”则退出循环。
退出此系统之前如若未进行更新数据之后的保存操作,则会提示用户是否进行更新数据后的保存,然后才退出系统。
主要代码如下:
intmain()
{
test();
return0;
}
voidtest()
{
LISTlist;
goodsg;
goodsresult;
goodsgg[50];
inti=0,h;
charj='Y';
intchoice,number;
doublerevise;
intlength=inlength();
i=length+1;
for(intk=1;k<=length;k++)
{
in(k,gg);
list.insert_data(gg[k],k);
}
menu();
cin>>choice;
while(j=='Y')
{
switch(choice)
{
case1:
system("cls");
cout<<"您将进行货物信息添加"<cout<<"请输入货物的编号:
"<cin>>g.number;
in(length,gg);
for(h=0;hif(gg[h].number==g.number)
{
cout<<"货物的编号不能重复,请重新输入"<cin>>g.number;
}
cout<<"请输入货物的名称:
"<cin>>g.name;
list.insert_data(g,i);
list.show_data();
i=i+1;
break;
}
Continue();
cin>>j;
if(j=='Y')
{
system("cls");
menu();
cin>>choice;
}
}
system("cls");
charsave;
Save();
cin>>save;
if(save=='Y')
{
list.out_data();
outlength(list);
cout<<"已保存!
(按任意键键退出程序)"<}
exit(0);
}
(2)货物入库模块:
用函数boolinsert_data(goodsdata,inti);来实现。
主要功能用来对货物的信息进行收集和输入。
函数首先进行的是对读取的数据文件的数据收集工作,如若在指定路径找不到数据文件,系统则会创建新的数据文件;如果找到数据文件,系统则根据指定的文件读取方式度数据文件中的数据进行读取,之后会有个提示“您将进行货物信息添加”,这样就可以按照系统的提示输入货物的信息了。
货物入库模块可以录入货物的所有信息,比如编号,入库价格,入库时间等。
在本操作中,不允许有重复的货物编号出现。
录入数据完毕后按“Y”即可返回主菜单。
主要代码如下:
boolLIST:
:
insert_data(goodsdata,inti)
{
goods*current,*previous,*newnode;
intj=1;
newnode=newgoods;
if(newnode==NULL)
{
cout<<"内存无空闲空间,不能插入:
";
returnfalse;
}
newnode->number=data.number;
newnode->next=NULL;
previous=head;
current=head->next;
while(current!
=NULL&&j
{
previous=current;
current=current->next;
j++;
}
newnode->next=current;
previous->next=newnode;
returntrue;
}
(3)货物删除模块:
用函数booldelete_data(doublei);来实现。
主要功能是用来删除货物信息。
首先有个链表判空的操作,如果链表不为空则显示删除前的货物信息记录。
之后会有输入货物编号的判断,对链表中货物编号相匹配的结点进行删除操作,并释放其空间。
删除成功后打印删除后的全体学生信息记录。
主要代码如下:
boolLIST:
:
delete_data(doublei)
{
goods*current,*previous;
intj=0;
if(isempty())
{
cout<<"表已空,不能删除!
\n";
returnfalse;
};
previous=head;
current=head->next;
while(current!
=NULL&¤t->number!
=i)
{
previous=current;
current=current->next;
j++;
}
if(j==length())
{
cout<<"没有该信息,不能删除!
"<returnfalse;
}
previous->next=current->next;
deletecurrent;
returntrue;
}
(4)货物信息修改模块:
用函数boolrevise_data(doublei)来实现。
主要功能是用来修改货物信息记录。
首先是判断用户需要修改的货物编号是否存在,因为货物编号是不会有重复的,如果货物编号存在,则系统会提示修改货物记录。
最后将修改过后的记录打印出来,并提示修改成功!
主要代码如下:
boolLIST:
:
revise_data(doublei)
{
intj=0;
goods*current=head;
current=head->next;
while(current!
=NULL&¤t->number!
=i)
{
j++;
current=current->next;
}
if(j==length())
{
cout<<"没有找到该货物的信息!
"<returnfalse;
}
cout<<"输入您要修改的货物管理信息:
1编号、2名称、3地址、4入库价格、5入库时间、6库存数量、7已销售数量、8平均单价."<switch(revise)
{
case1:
cout<<"您将修改编号,请输入新的编号"<cin>>number;
current->number=number;
}
returntrue;
}
(5)货物信息统计模块:
用函数voidcount_data()来实现。
主要功能是统计货物数量、亏损货物数量、总利润、库存货物总数、已销售货物总数。
其中主要是求和算法,代码比较容易实现。
主要代码如下:
voidLIST:
:
count_data()
{
intsum=0,kssum=0,temp1=0,lrsum=0,temp2=0,kcsum=0,temp3=0,yxssum=0;
intchoice;
goods*current;
cin>>choice;
switch(choice)
{
case1:
current=head->next;
while(current!
=NULL)
{
sum=sum+1;
current=current->next;
}
cout<<"货物总数为"<break;
}
}
(6)货物信息排序模块:
用voidsort_data()函数来实现。
这里主要使用了直接选择排序算法来对链表进行排序,为了降低算法的复杂度,在对链表节点进行交换时,直接对节点中的货物信息进行交换。
主要代码如下:
voidLIST:
:
sort_data()
{
cout<<"请输入您需要排序的项目:
1货物编号,2货物库存数量,3货物盈利"<intchoice;
cin>>choice;
goods*p,*q,*small,*temp;
temp=newgoods;
switch(choice)
{
case1:
for(p=head->next;p->next!
=NULL;p=p->next)
{
small=p;
for(q=p->next;q!
=NULL;q=q->next)
if(q->numbernumber)
small=q;
if(small!
=p)
{
temp->number=p->number;
p->number=small->number;
small->number=temp->number;
}
}
}
}
(7)货物信息查询模块:
用函数voidfind_data(goods&result);来实现。
这里的函数参数使用了一个货物类的引用变量,使得查找到的货物信息赋给这个引用变量,然后能够进行输出。
查找的信息包括:
货物编号、亏损货物信息、库存数量小于某数信息、已销售数量小于某数信息。
主要代码:
voidLIST:
:
find_data(goods&result)
{
goods*current;
current=head->next;
intchoice,x,i=0,j=0,k=0;
cin>>choice;
intNumber;
switch(choice)
{
case1:
cout<<"请输入货物编号"<cin>>Number;
while(current!
=NULL)
{
if(current->number!
=Number)
current=current->next;
else
{
result.number=current->number;
cout<<"查找结果如下:
"<cout<<"编号"<<"\t"<<"名称"<<"\t"<<"地址"<<"\t"<<"入库价格"<<""<<"入库时间"<<""<<"库存数量"<<""<<"已销售数量"<<""<<"平均单价"<cout<break;
}
}
if(current==NULL)
cout<<"无此货物编号!
"<break;
}
}
(8)文件读写:
使用标准的C++文件输入输出流进行文件读写。
主要代码如下:
voidLIST:
:
out_data()
{
goods*current;
current=head->next;
ofstreamout("goods");
if(!
iout)
{
cout<<"文件打开失败!
"<return;
}
while(current)
{
out<number<<"\t"<name<<"\t"<GoodsAddress
<<"\t"<IncomingPrice<<"\t"<time.year<<""<time.month<<""<time.day<<"\t"<StockNumber<<"\t"<SoldNumber<<"\t"<AveragePrice<current=current->next;
}
out.close();
cout<}
3.4数据结构:
为了对数据进行封装,我使用了链表类、货物类、时间类。
为了能够方便的使用类中的数据,我把所有的数据成员都设为公有。
其中,链表类的数据成员有:
头结点。
货物类的数据成员有:
编号、名称、地址、入库价格、入库时间、库存数量、已销售数量、平均单价。
时间类的数据成员有:
年、月、日。
3.5算法:
主要是求和以及直接选择排序算法。
同时使用到下面的技术:
文件访问与操作、合理的常量与全局变量及函数接口变量定义、数据输入与数据格式检查、数据类型转换、错误处理、工程设计技术。
3.6测试:
系统测试是系统质量保证的主要活动之一,在系统开发的过程中,在各个阶段都有可能存在错误和缺陷。
通过测试是可以发现系统设计中存在的种种问题,并可以及时改正。
避免在系统投入使用时才出现不必要的错误,导致其他损失。
测试是质量保证一个临界和决定惩罚,它提供对系统规格说明、设计和编码的最终评审。
是发现系统缺陷和错误的有力手段。
本系统测试的内容主要有:
(1)软件的正常运行、关闭及退出时保存记录的提示(默认为是)。
(2)用户登录界面友好,可操作性及安全性能较好,能对不同管理级别者进行限制,以保证数据库的安全。
(3)可维护性好,数据的录入、删除及更改均能顺利完成,并能实现动态更新。
(4)数据查询便捷,能对各种不同的查询条件进行搜索,以找到最合适的答案。
(5)数据溢出、越界均能进行非法提示,以警告用户正确使用。
对用户的非正常操作方式也提出警告。
(6)数据类型填写错误时,系统能够报错。
(7)软件对操作系统的兼容性良好,可移植性完好。
主界面:
货物删除模块界面:
货物统计模块界面:
货物排序模块界面:
4所遇到的问题和分析解决
(1)
问题:
需求分析的不明确
解决:
在课程设计指导书的帮助下,自己在做课设的过程中不断明确和修正自己的需求分析,不断添加新功能。
(2)
问题:
数据结构的选择
解决:
经常尝试和修改,考虑到链表在动态修改中的快捷方便性,我建立了一个链表类,并把我建立的货物类的数据储存在链表上。
在链表上,我的数据能够方便地进行添加、删除、修改等操作。
(3)
问题:
如何能在下次登录时使用上次登录时存储在文件里的数据
解决:
经过同学的帮助和自己的努力,我掌握了如何对存储在文件里的数据进行使用的办法。
只要在每次程序运行结束时把货物管理表的长度写入到文件当中,当下次登录时再读取出货物管理表的长度,然后根据这个长度把存储在文件中的货物管理表的记录一个个添加到链表去,之后你就可以任意使用这些数据了。
(4)
问题:
我曾经遇到无论我往文件里面写入多少条记录,但文件中只显示一条的记录的问题
解决:
对于这样的逻辑问题,我调试了很多次也找不到问题的原因所在,遇到这样纠结的问题,我只好去请教老师。
只见老师使用了断点跟踪调试法,很快就发现了问题的原因所在,原来是我的out.close();语句竟然写在循环里面,导致我只写入了一次便无法再写入了。
从中,我不仅了解到写程序时当局者迷,旁观者清,应该多向他人虚心请教的道理,更懂知道了调试程序的方法。
我相信经过我的努力,我调试程序的水平一定会越来越好。
(5)
问题:
异常错误如何考虑,如何处理
解决:
一个系统在运行中可能会遇到许多异常,如果不对这些异常进行处理,就会让使用系统的用户在系统出现异常时不知所措,程序也无法正常地运行和终止。
那么我应该如何考虑异常处理呢?
首先,我应该保证程序中尽可能少的出错,以避免异常的出现。
所以我应该先做到一下几点:
1只引用属于自己的存贮空间。
2防止引用已经释放的内存空间。
3函数中分配的内存,在函数退出之前要释放。
4函数中申请的(为打开文件而使用的)文件句柄,在函数退出前要关闭。
5防止内存操作越界。
6时刻注意表达式是否会上溢、下溢。
7认真处理程序所能遇到的各种出错情况。
8系统运行之初,要初始化有关变量及运行环境,防止未经初始化的变量被引用。
9系统运行之初,要对加载到系统中的数据进行一致性检查。
10不能随意改变与其它模块的接口。
11充分了解系统的接口之后,再使用系统提供的功能。
12时刻注意易混淆的操作符。
当