编号:
数据结构与算法课程设计
说明书
题 目: 进销存货物管理系统
学 院: 计算机科学与工程学院 专 业: 计算机科学与技术 学生姓名: 潘飞达 学 号: 1100310120 指导教师: 唐麟
2013年 9 月 26 日
桂林电子科技大学综合设计说明书用纸
摘 要
本课程设计报告系统地阐述了我使用C++编写的进销存货物管理系统。首先,我对系统进行一个简要的概述。然后,我就系统的需求进行了详细的分析,这是设计工作中不被人们重视但却非常重要的一步。接下来,我把系统中所有的设计简明清晰地展现出来,并把我在设计中遇到的问题和分析解决问题的办法一一做了分析。当然,我还讲到系统中的关键技术和让人眼前一亮的特色。最后,在结论中,我对自己的课程设计做了总体的评价同时简述了我在这次课程设计中的收获和经验。
关键词:数据结构与算法课程设计;进销存货物管理系统;C++;
桂林电子科技大学综合设计说明书用纸
目 录
引言 ...................................................... 错误!未定义书签。 1 系统概述 ............................................... 错误!未定义书签。 2 需求分析 ............................................... 错误!未定义书签。 2.1 系统需求 .............................................. 错误!未定义书签。 2.2 开发环境 .............................................. 错误!未定义书签。 3 详细设计 ............................................... 错误!未定义书签。 4 所遇到的问题和分析解决 ................................. 错误!未定义书签。 5 系统特色及关键技术 ..................................... 错误!未定义书签。 6 结论 ................................................... 错误!未定义书签。 参考文献 .................................................. 错误!未定义书签。
桂林电子科技大学综合设计说明书用纸
引言
随着科学技术的不断提高,计算机科学日渐成熟,其强大的功能已为人们深刻认识,它已进入人类社会的各个领域并发挥着越来越重要的作用。计算机的发明应用,被视为人类的第三次重大的科学技术革命,是一次飞跃。过去的革命最高成就就是“用机器制造机器”,是手的延长,而计算机的出现却能做到“用机器控制机器”,是脑的延伸。计算机是提高生产效率的主要工具及途径。
在信息化快速发展的今天,企业与顾客、企业与供方的关系变得更加密切和复杂。强化管理,规范业务流程,提高透明度,加快商品资金周转,为流通领域信息管理全面网络化打下基础,是商品销售公司乃至众多商业企业梦寐以求的愿望。
随着技术发展,计算机操作及管理日趋简化,计算机知识日趋普及,同时市场经济快速多变,竞争激烈,企业采用计算机管理进货、库存、销售等诸多环节也已成为趋势及必然。进销存管理系统依靠现代化的计算机信息处理技术来管理进货,从而节省了大量的人力、物力,改善了员工的工作条件,减轻了劳动强度,并且能够快速反映出商品的进、销、存等状况和各种反馈信息分析,使管理人员快速对市场的变化做出相应的决策,从而掌握市场先机。
二十一世纪是信息时代,计算机的应用已普及经济和社会生活的各个领域,越来越多的公司、企业、学校等单位都不同程度的利用电脑来进行资源管理。随着电脑应用的普及,单纯人工操作管理方式也即将被淘汰。所以计算机化管理已经成为一种必然的趋势。
本系统运用C++进行开发,它能够呈现出简明清晰的界面,并被人们能够很好地理解和使用,并能在一些方面给人们更好的服务,相信它能够被大多数用户所接受。在通过运用数据结构与算法相结合的课程设计,来完成进销存货物管理系统时,一方面是为了检查我们的学习成果,另一方面是为了更进一步对数据结构与算法的掌握和运用,同时也让我们清楚的知道自己的掌握水平和不足之处。
桂林电子科技大学综合设计说明书用纸
1 系统概述
在这次课程设计中,我经过近两个星期的努力,克服了种种困难并向同学和老师请教过不少问题,终于完成了进销存货物管理系统 。为了做好这次课程设计,我认真做好了需求分析和系统的详细设计。本进销存货物管理系统使用C++编写,能够完成货物入库、货物删除、货物信息修改、货物信息统计、货物信息查询、货物信息排序、建立货物管理表和文件读写等功能。其中,我使用的数据结构有 链表类、时间类 、货物类,使用的算法有求和、直接选择排序等。
进销存货物管理系统界面简洁、清楚、功能齐全,使用方便,交互界面良好,让没用过这个系统的人一看就知道如何操作。
2 需求分析
2.1 系统需求
该系统能进行简单的货物管理,进货,销售货物,退货等管理,并建立货物管理表。
货物管理表中至少包括如下信息:
货物标号,货物名称,货物产地,入库价格,入库时间,现存货物数量,已经销售数量,销售平均单价。
每次销售后,都需要对现存货物数量进行更新,对已销售数量进行更新,也需要对销售平均单价进行更新。
功能要求:
1.具有建立数据文件(货物管理表)的功能; 2.具有数据输入功能; 3.具有数据修改功能;
4.具有数据删除功能(当一些已经过时陈旧的商品被特价处理后,将其删除,不再进货);
5.能查询(查找)一些基本信息(如能查询剩余件数小于某个特定值的商品,以便于及时进货);
6.具有多种统计功能(如统计每种货物是否有盈利(将销售平均单价跟入库价格进行比较),所有货物的盈利或亏损等等)
7.具有排序功能(比如对货物盈利水平进行排序比较等等)
2.2开发环境 开发语言:C++
开发环境:win7 64位操作系统 开发软件:Microsoft Visual C++ 6.0
桂林电子科技大学综合设计说明书用纸
2.3 界面需求
系统界面要具有广泛的实用性,便于移植。界面友好,操作简便。根据软件的使用环境、用户的要求,系统界面应该简单、友好、易于使用、方便查看、简洁明快。而且系统是在Windows环境下的应用软件,软件产品的界面应该与操作系统的界面相切合,产品的主界面应该功能齐全,分类明确,让用户一眼看去就能明白大致的功能。
2.4 输入输出格式
本系统是一个进销存货物管理系统,采用VC++6.0编译器作为开发环境,输入数据类型主要是string 、int、float、double等数据类型,输入内容包括:货物名称、编号、入库价格、入库时间等数据。用户在输入学生数据时不需要保证输入数据格式的正确性,系统会自动检测输入的数据是否正确,输出形式与输入形式类似,根据需要可以选择显示输入的各项内容,还可以选择显示计算好盈利后并排序后的记录,显示内容包括:货物名称、货物编号、入库价格、货物数量、总利润等数据。
3 详细设计
3.1货物管理表: 编号 名称 地址 入库价入库时库存数已销售平均单格 1 2 3 4
牙膏 电刀 山楂 红茶 1号 2号 9号 5号 1 2 3 5 间 量 数量 5 0 3 4 价 1 2 3 5 2002 1 1 3 2005 2 2 2 2006 3 3 3 1998 5 5 3 桂林电子科技大学综合设计说明书用纸
3.2系统功能结构图:
3.3各功能模块详细设计:
(1)主函数模块:
用主函数main()来实现。主要是通过设计一个test()函数并让主函数调用它来显示主菜单,让用户选择操作。在test()函数中,我应用了while循环和switch-case语句来进行选择,是个比较简单实现的模块。最后若选择“Y”则继续循环,若选择“N”则退出循环。退出此系统之前如若未进行更新数据之后的保存操作,则会提示用户是否进行更新数据后的保存,然后才退出系统。
主要代码如下:
int main() { } void test() {
LIST list; test(); return 0;
进销存货物管理系统 货物入库 货物删除 货物信息查询 货物信息修改 货物信息统计 货物信息排序 退出 桂林电子科技大学综合设计说明书用纸
goods g; goods result; goods gg[50]; int i=0,h; char j='Y'; int choice,number; double revise; int length=inlength(); i=length+1;
for(int k=1;k<=length;k++) { } menu(); cin>>choice; while(j=='Y') {
switch(choice) { case 1:
system(\"cls\");
cout<<\"您将进行货物信息添加\"< cout<<\"请输入货物的名称:\"< cout<<\"货物的编号不能重复,请重新输入\"< in(k,gg); list.insert_data (gg[k],k); 桂林电子科技大学综合设计说明书用纸 } } 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\"); } char save; Save(); cin>>save; if(save=='Y') { } exit(0); list.out_data(); outlength(list); cout<<\"已保存!(按任意键键退出程序)\"< 用函数 bool insert_data(goods data,int i); 来实现。主要功能用来对货物的信息进行收集和输入。函数首先进行的是对读取的数据文件的数据收集工作,如若在指定路径找不到数据文件,系统则会创建新的数据文件;如果找到数据文件,系统则根据指定的文件读取方式度数据文件中的数据进行读取,之后会有个提示“您将进行货物信息添加”,这样就可以按照系统的提示输入货物的信息了。货物入库模块可以录入货物的所有信息,比如编号,入库价格,入库时间等。在本操作中,不允许有重复的货物编号出现。录入 桂林电子科技大学综合设计说明书用纸 数据完毕后按“Y”即可返回主菜单。 主要代码如下: bool LIST::insert_data ( goods data,int i) { goods*current ,*previous,*newnode; int j=1; newnode=new goods; if( newnode==NULL) { } cout<<\"内存无空闲空间,不能插入:\"; return false; newnode->number=data.number ; newnode->next=NULL; previous=head; } current=head->next; while(current!=NULL&&jnewnode->next=current; previous->next=newnode; return true; previous=current; current=current->next; j++; (3)货物删除模块: 用函数 bool delete_data(double i); 来实现。主要功能是用来删除货物信息。首先有个链表判空的操作,如果链表不为空则显示删除前的货物信息记录。之后会有输入货物编号的判断,对链表中货物编号相匹配的结点进行删除操作,并释放其空间。删除成功后打印删除后的全体学生信息记录。 主要代码如下: bool LIST::delete_data (double i) 桂林电子科技大学综合设计说明书用纸 { goods *current ,*previous; int j=0; if(isempty()) { }; cout<<\"表已空,不能删除!\\n\"; return false; previous=head; } current=head->next; while(current!=NULL&¤t->number !=i) { } if(j==length()) { } previous->next=current->next; delete current; return true; cout<<\"没有该信息,不能删除!\"< (4)货物信息修改模块: 用函数 bool revise_data(double i) 来实现。主要功能是用来修改货物信息记录。首先是判断用户需要修改的货物编号是否存在,因为货物编号是不会有重复的,如果货物编号存在,则系统会提示修改货物记录。最后将修改过后的记录打印出来,并提示修改成功! 桂林电子科技大学综合设计说明书用纸 主要代码如下: bool LIST::revise_data (double i) { int j=0; goods *current =head; current=head->next; while(current!=NULL&¤t->number !=i) { } if(j==length()) { } cout<<\"输入您要修改的货物管理信息:1编号、2名称、3地址、4入库价格、5入库时间、6库 cout<<\"没有找到该货物的信息!\"< 存数量、7已销售数量、8平均单价.\"< cout<<\"您将修改编号,请输入新的编号\"< current->number =number; (5)货物信息统计模块: 用函数 void count_data()来实现。主要功能是统计货物数量、亏损货物数量、总利润、 桂林电子科技大学综合设计说明书用纸 库存货物总数、已销售货物总数。其中主要是求和算法,代码比较容易实现。 主要代码如下: void LIST::count_data () { } int sum=0,kssum=0,temp1=0,lrsum=0,temp2=0,kcsum=0,temp3=0,yxssum=0; int choice; goods *current ; cin>>choice; switch(choice) { case 1: } current=head->next; while(current!=NULL) { } cout<<\"货物总数为 \"< (6)货物信息排序模块: 用 void sort_data()函数来实现。这里主要使用了直接选择排序算法来对链表进行排序,为了降低算法的复杂度,在对链表节点进行交换时,直接对节点中的货物信息进行交换。 主要代码如下: void LIST::sort_data() { cout<<\"请输入您需要排序的项目: 1货物编号,2货物库存数量,3货物盈利\"< goods * p,*q,*small,*temp; temp= new goods; 桂林电子科技大学综合设计说明书用纸 switch (choice) { case 1 : for(p=head->next;p->next!=NULL;p=p->next) { small=p; for(q=p->next ;q!=NULL;q=q->next) if(q->number small=q; if(small!=p) { temp->number=p->number; p->number=small->number; small->number=temp->number; } } } } (7)货物信息查询模块: 用函数 void find_data(goods &result);来实现。这里的函数参数使用了一个货物类的引用变量,使得查找到的货物信息赋给这个引用变量,然后能够进行输出。查找的信息包括:货物编号、亏损货物信息、库存数量小于某数信息、已销售数量小于某数信息。 主要代码: void LIST::find_data (goods &result) { goods *current ; current=head->next; int choice,x,i=0,j=0,k=0; 桂林电子科技大学综合设计说明书用纸 cin>>choice; int Number; switch(choice) { case 1: cout<<\"请输入货物编号\"< else { result.number=current->number; cout<<\"查找结果如下:\"< } if(current==NULL) cout<<\"无此货物编号!\"< (8)文件读写: 使用标准的C++文件输入输出流进行文件读写。 主要代码如下: \"<<\"入库时间\"<<\" 桂林电子科技大学综合设计说明书用纸 void LIST::out_data() { goods *current; current=head->next; ofstream out(\"goods\"); if(!iout) { } while(current) { out< <<\"\\"< 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时刻注意易混淆的操作符。当编完程序后,从头至尾检查一遍这些操作符。 然后,我开始对各个功能模块进行异常处理检查。对于功能模块中的每次输入输出,函数分配的内存空间、文件的打开关闭我都进行了异常的处理。比如在进行文件读写时,如果文件无法打开,则对用户做出提醒“文件无法打开!”,当函数结束时也及时关闭文件。比如当用户要删除货物记录时,如果用户删除的是不存在的货物编号,程序会显示提醒“货物不存在,无法删除!”。在每次数据输入我都会进行数据格式检查,防止用户输入不能使用的数据。比如当用户输入入库时间时,如果入库时间的月份小于0或者大于12,天数小于0 或者大于31,程序都会做出提醒“输入的时间格式不对,需要重新输入!”。 (6) 问题:当我给链表设计排序算法时,发现排序算法无法对链表进行排序 解决:我选择的排序算法是直接选择排序,但是当我使用这个排序算法给链表进行排序时发现链表中的节点并没有进行排序。经过对排序函数进行测试,发现排序中的交换只执行了一次,但是我还是不明白为什么只交换了一次。当我问了老师之后,我才恍然大悟,原来是排序时我交换节点时改变了节点的指针域,使得链表发生了断裂,无法再继续交换。为了解决这个问题,同时为了降低算法的复杂度,我选择将链表节点中所有的数据进行交换,这样就不会是链表发生断裂了。最终,我成功完成了排序算法。 桂林电子科技大学综合设计说明书用纸 5系统特色及关键技术 关键技术:我认为系统中最关键的技术有 : 1建立了一个链表类,并在类中定义了一个货物类的头结点 ,这样就能在使用链表存储货物数据时很方便地使用头结点 2使用通过链表和货物类以及链表的插入函数建立一个货物信息管理表 3把货物管理表的长度写入文件中,然后下次就可以从文件中在读取长度,然后根据这个长度把存储在文件中的货物管理表的记录一个个添加到链表去 系统特色: 1合理的输入输出提示以及良好的用户交互界面 2类的接口和实现方法的分离,类的声明放在一个头文件中,类成员函数的定义放在另一个源文件中 3合理的异常处理机制,允许用户在排除错误后继续运行程序或者给出适当错误提示。 6 结论 (1)系统完成情况 在两周的时间里,虽然历经重重困难和挫折,但是在我自己的努力和老师的帮助下终于完成了进销存货物管理系统的设计。尽管系统在功能和性能上可能还有一些缺陷,但是我已经完成了系统设计的任务和目标,达到了需求分析的基本要求,成功完成了算法与数据结构课程设计。 (2)未能完成的和有待改进之处 未完成的:在对货物进行销售时,对现存货物数量进行更新,对已销售数量进行更新,也需要对销售平均单价进行更新;设计快速排序算法对链表进行排序;使用函数模板和类模板实现代码简化和程序复用; 有待改进:能够直接交换链表节点,实现对链表的真正排序;实现用户自定义多条件查询; (3)课程设计期间的收获 在完成此次的课程设计的过程中,我跨越了传统方式下的教与学的体制束缚,通过自己的思考和设计,培养了自学能力和动手能力。并且由原先的被动的接受知识转换 桂林电子科技大学综合设计说明书用纸 为主动的寻求知识,这可以说是学习方法上的一个很大的突破。在以往的传统的学习模式下,我们可能会记住很多的书本知识,但是通过课程设计,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结合的问题。 通过这次课程设计,我认识到数据结构与算法是计算机科学的基础课程,是我们学习的核心课程。我对数据结构和算法又有了新的认识。数据结构的研究不仅涉及到计算机软件,而且和计算机硬件的研究也有着密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必须考虑如何组织数据,以便使查找和存取数据元素更为方便。可以认为数据结构是介于数学、计算机硬件和计算机软件三者之间的一个核心内容,是从事计算机科学研究及其应用的人必须掌握的重要内容。 这次的课程设计有效的培养了我们独立思考的能力,提高了我们的动手操作水平。在具体设计中,我们巩固了上学期所学的数据结构与算法的理论知识,进一步提高了自己的编程能力。这也是课程设计的目的所在。通过编程实践,不仅开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力,更充分锻炼了我们的编程能力。 在这次课程设计中我也知道了自己的动手能力不强,有待于进一步提高,但在老师和同学的帮助下,我坚持到了最后。我在这次课程设计中学到很多,我会更加自信的走下去。 在课程设计中我体会到:一个好的程序应该是一个高内聚低耦合的程序。而要做出一个好的程序则应该通过对算法与其数据结构的时间复杂度和空间复杂度进行实现与改进。然而,实际上很难做到十全十美,原因是各要求有时相互制约,要节约算法的执行时间往往要以牺牲更多的存储空间为代价:而为了节省存储空间又可能要以更多的时间为代价。因此,只能根据具体情况有所侧重:如果程序的使用次数较少,则应该力求算法简单易懂;如果程序反复多次使用,则应该尽可能选用快速算法或者设置为内联函数;如果解决问题的数据量极大,但是机器的内存空间不是很充足,则在编写算法时应该考虑如何节省空间。 学习了《数据结构与算法》这门课,我们在编写程序时就应该注意到所编写程序的时间复杂度和空间复杂度,以及是否运用了良好的算法,而不是只是象以前编写程序时单纯使用C++的知识。我们要充分考虑程序的性能,从而编写出更好的程序。 在设计报告的写作过程中我也学到了做任何事情都要有的心态,首先我明白了做学问要一丝不苟,对于出现的任何问题都不要轻视,要通过正确的途径去解决,在做事情的过程中要有耐心和毅力,不要一遇到困难就打退堂鼓,只要坚持下去就可以找到思路去解决问题的,在遇到问题时,有必要向老师和同学请教,合作沟通的意义是巨大的。 在这次课程设计中,我认识到了自己的不足之处同时我也收获了很多知识和经验,在今后的学习中,我一定勤于思考,并灵活运用所学知识,多进行编程实践。在总结反思和编程训练中,不断提升自己的编程能力。相信在我的努力下,我的程序设计水平一定会不断提高。 桂林电子科技大学综合设计说明书用纸 参考文献 [1]罗建军、朱丹军.C++程序设计教程(第2版)[M].北京:高等教育出版2007.8:202-355 [2]谭浩强.C++程序设计[M].北京:清华大学出版社,2008.10:103-233 [3]李鹏程.C++宝典[M].北京:电子工业出版社,2005.5 :44-97 [4]钱丽萍.C++数据结构与程序设计 [M].北京:清华大学出版社 ,2000.1:103-209 [5]张乃孝.算法与数据结构[M].北京:高等教育出版社,2000.5:300-346 因篇幅问题不能全部显示,请点此查看更多更全内容