毕业设计(论文)C++数据结构算法演示系统设计_第1页
毕业设计(论文)C++数据结构算法演示系统设计_第2页
毕业设计(论文)C++数据结构算法演示系统设计_第3页
毕业设计(论文)C++数据结构算法演示系统设计_第4页
毕业设计(论文)C++数据结构算法演示系统设计_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘要数据结构算法演示系统数据结构在计算机科学中是一门综合性的专业基础课,它不仅设计到计算机硬件(特别是编码理论、存储装置和存取方法等)的研究范围,而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题。在研究信息检索时也必须考虑如何组织数据,以便查找和存取数据元素更方便。因此,它是介于数学、计算机硬件和计算机软件三者之间的一门核心课程。在计算机科学中,数据结构不仅是一般程序设计的基础,而且是设计和实现编译程序、操作系统、数据库系统及其他系统程序和大型应用程序的重要基础。本文充分利用c+ builder的rad优点,设计并建立了一套数据结构算法的

2、演示系统。讲解了线性表、堆栈和队列、树、图等数据结构的概念,该系统具有操作便捷、形象生动等特点,对于深化对数据结构算法的理解,提高计算机程序设计水平具有很好的促进作用,而且具有一定的实用价值,能有效地改善数据结构算法教学的质量和效率,对于其他类似系统也有很大的借鉴意义。关键字:数据结构;算法;c+ builderabstractdata structure algorithms demonstration systemdata structures,is a comprehensive professional foundation courses in computer science, n

3、ot only to studied computer hardware design (especially coding theory, storage devices and visit methods), and researched computer software in closer relationship, whether translation or operating system, data elements are involved in the allocation of memory. in information retrieval research, data

4、 must also consider how to organize in order to identify the data elements and visit more convenient. therefore, it is a door core curriculum between mathematics, computer hardware and computer software. in computer science, data structure is not only the basis for general programming, but also the

5、design and realization of heavy editing procedures, operating systems, database systems and other systems procedures and the essential foundation for large-scale applications.the full use of the rad advantage c+ builder design and build a data structure algorithms demonstration system. on the linear

6、 tables, duizhan and britain, trees, maps, and other data structure concept, the system has operated convenient, vivid image characteristics of the data structure to deepen the understanding of algorithms to improve the level of computer programming in good catalyst, but with some practical value to

7、 effectively improve data structure algorithms teaching quality and efficiency for other similar systems.key words: data structure;algorithms;c+ builder目 录1 绪论12 需求分析22.1 解决问题22.2 具备功能23 系统设计33.1 开发及使用环境33.2 系统结构103.3 详细设计124 系统操作284.1 主菜单操作284.2 线性表操作284.3 树操作294.4 算法说明操作30结束语30谢 辞32参考文献33附录34附录a 外

8、文翻译原文部分34附录b 外文翻译译文部分40附录c 源代码46 1 绪论数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。 数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。数据结构课程的主要目的是介绍一些常用的数据结构,阐明数据结构内在的

9、逻辑关系,讨论它们在计算机中的存储表示,并结合各种数据结构,讨论对它们实行的各种运算的实现算法。很多算法实际上是对某种数据结构施行的一种变换,研究算法也就是研究在实施变换过程中数据结构的动态性质。数据结构,作为计算机学科的基础性专业课程,其在计算机科学中的及其重要,课程学习的好坏,直接关系到学员后期计算机水平的高低。而这门课程一直因为过于抽象,难以理解,而让人望而止步。如果能够把这门抽象的课程变得具体而生动,必将提高学习人员兴趣,增加其积极性和主动性,也有利于人员的对此课程的学习。基于这些目的,我们开发了这个数据结构算法演示系统,数据结构是我们所做的系统的主要理论基础,我们完成了线性表、堆栈、

10、队列、树、图几个主要结构,在学习数据结构这门课程的时候,我们了解了这些结构的算法,当时也做过一些相关的程序,在此基础之上,我运用c+ builder开发工具,把这些算法演示出来。数据结构算法演示系统可以演示线性表、堆栈、队列、树、图等几个基础结构的算法,辅助一些算法说明,让使用者更好地掌握算法,在帮助中把演示的具体过程和操作做详细的介绍。 该系统具有操作简单、形象生动,能很好地改善人员对数据结构课程的学习理解,从很大程度上提高人员的学习质量和效率。2 需求分析2.1 解决问题做为一个数据结构演示系统,首先我们确定要演示的内容,在本系统中,我们对线性表、堆栈和队列、树、图几个主要数据结构做了讲解

11、;接着,对四种算法的说明也是必不可少的,这样配合演示,可以达到更好地效果;最后,作为我们设计的演示过程,使用者对操作不是太了解,我们有必要做个详细的操作过程,让使用者更好地操作系统。2.2 具备功能系统由数据结构、操作、帮助、程序四个部分组成。现分述如下:数据结构由线性表、堆栈和队列、树、图等四个部分组成,分别对应数据结构的四个部分。线性表又分为链表概念、链表模型、链表操作、双向链表四个部分,堆栈和队列分为基本堆栈、基本队列、循环队列三个部分,树分为数据二叉树、结构二叉树、类二叉树,图分为图表示、图搜索、最短路径。操作由线性表说明、堆栈说明、队列说明、树说明、图说明组成,对各数据结构的算法说明

12、。帮助由关于和帮助组成,是本系统的一些说明和对演示过程的操作详细说明。程序部分由退出组成,完成系统的终止。3 系统设计3.1 开发及使用环境 c+ builder3.1.1 c+ builder介绍提起borland c/c+,相信业界的许多朋友都会感慨万千,因为它曾带领很多人跨进了windows开发的大门。和美国inprise公司(原borland公司)其他面向企业分布式系统的开发工具(如delphi 、jbuilder )相比,新近推出的最新版本c+ rad(快速应用开发)工具borland c+ builder 4,无论是在开发环境、分布式应用系统开发、支持已有c+资源方面,还是在快速开

13、发web及internet应用程序、数据库处理等方面,都表现出了其独特的一面。(1)全新的集成开发环境c+ builder保留了使用framework(如:owl、mfc)的开发方式,融合了visual basic、delphi等开发工具的面向组件的开发方式。c+ builder的集成开发环境提供了120多个vcl组件,使开发人员不需太多编码,就能够实现很多复杂的功能,体现了软件的“重用性”原则。c+ builder的用户界面也非常友好,易于使用,并且采用了停驻式(docking)工具条,可以自由组合集成开发环境窗口和工具条的排放方式。在编码过程中,还可以使用codeexplorer技术对源代

14、码进行管理。codecompletion技术使编译器能够自动列出vcl组件的可用属性和方法供程序员选择,而不必手工输入冗长的代码。c+ builder的集成开发环境如图1所示。(2)简化了分布式应用系统的开发企业向多层分布式系统跨越已经成为了一种必然趋势,目前分布式运算标准主要有microsoft 的dcom和omg的corba,是否支持这两种标准决定了开发工具的适用领域和范围。c+ builder可以说是目前唯一同时支持corba和com的c+集成开发环境,因此既适用于基于orb的分布式开发,又适用于基于com的windows开发。c+ builder内置了visibroker3。3,它是目

15、前全球分发数量最多的corba orb,并且包含了event service和namingservice等标准corba服务,从而为开发corba应用提供了可能。c+ builder 将corba idl 编译器集成在其开发环境中,通过配合各种向导(wizard),可以快速生成corba client和server的源程序代码框架,这对于开发corba产品的朋友来说,确实是非常方便的。图2显示了c+ builder中建立corba对象的各种向导。在microsoft com方面,c+ builder 同样提供了各种向导,可以一步生成com标准组件、ole automation组件及active

16、x组件,您可以在windows环境下大显身手。 c+ builder 提供的midas2同时支持corbaiiop、dcom、dce rpc以及tcp/ip等多种连接方式,适用于分布式系统的开发。比如,非windows环境上的java应用程序,可以通过corba iiop使用c+ builder开发出来的应用程序服务器。从而使用户可以在原有系统基础之上构建跨平台、跨程序语言的分布式应用系统。(3)对已有c+资源的支持用户可能会关心,对于过去开发的基于borland c+ owl和microsoft mfc的程序,c+ builder是否能够兼容?回答是肯定的。c+ builder的另一特性就是

17、提供了mfc4。2版的函数库,强化了对microsoft visual c+源代码的兼容性,可以直接编译msdn与各种sdk中的范例程序。通过mfc向导,还可以生成mfc的代码框架。除此之外,c+ builder能够编译原有的borlandc+ owl程序码,因此就不必担心以前的工作白做了!c+ builder中提供了符合ansi/iso标准的c+编辑器,还能够开发可移植于非windows平台的c+程序。(4)快速开发web及internet应用程序目前,基于internet的开发已经成为一种时尚。c+ builder在开发web及internet应用方面的功能也非常强大。c+ builder

18、提供了21个internet通信协议组件,用于internet应用程序的开发。开发人员可以建立“零配置”、基于web浏览器的“瘦客户”应用程序。c+ builder同时支持cgi、wincgi、isapi及nsapi等标准,使开发人员利用现有的开发技术就可以用可视化的方式开发跨平台的web应用程序。运用activeform/atl及webdeploy技术,还可以实现activex组件的web分发。(5)强大的数据库处理功能c+ builder提供了对oracle8、microsoft sqlserver 7、informix 9、sybase、ibm db 2 universalserver、

19、interbase 5。5等大型数据库的高速驱动程序,并支持oracle8的对象关联延伸功能(如图3所示),如abstract data type、nested tables、variable lengtharrays、object pointers(refs)及external filereference等。同时c+ builder还保留了对microsoftaccess 97、foxpro、visual dbase及paradox等本地数据库的处理能力。因此,无论是大型的数据库应用系统开发,还是小型的数据库管理系统,c+ builder都有其用武之地。c+ builder还提供了mts 组

20、件向导,用于快速生成支持microsoft transaction server的com组件。bderesource dispenser使用户可以在mts中使用bde存取数据库,保证了mts对数据库的两阶段提交(two phasecommit)及资源管理的能力。(6)强大的调试功能c+ builder强化了原有的module view、eventlog view及inspect local variable等调试窗口的功能,并在windows nt环境中提供多线程调试的新功能,使用户可以在某一特定过程中跟踪程序代码。c+ builder针对多层分布式开发环境提供了远程调试能力,开发人员可以通过

21、网络直接对远端的应用程序服务器进行调试,从而简化了多层应用系统的开发和维护工作。(7)其他特点c+ builder还有很多新增的功能,如:针对windows 98提供了pagescroller、monthcalendar等windows 98格式的新组件,并支持windows98的多重屏幕显示功能及microsoft office97格式的选择选单和停驻式(docking)工具条。对界面的处理上,可以控制窗口的最大/最小尺寸以及窗口尺寸变动时其中组件的相对位置和比例,等等。总之,c+ builder 的强大功能并不是通过笔者有限的介绍所能够涵盖的,在c+海洋里遨游的朋友不妨亲自尝试一下c+ b

22、uilder,体验一下它的灵活与强大,相信您定会“恋恋不舍”的。3.1.2 c+ builder与visual c+对比首先,从它们的应用程序框架(application frame,有时也称为对象框架)进行比较。visual c+采用的框架是mfc。mfc不仅仅是人们通常理解的一个类库。(同样,del phi和c+builder使用的vcl的概念也不仅仅是一个控件库。)你如果选择了mfc,也就选择了一种程序结构,一种编程风格。mfc早在windows 3.x的时代就出现了,那时的visual c+还是16位的。经过这些年的不断补充和完善,mfc已经十分成熟。但由于原型出现得比较早,mfc相比

23、于vcl落后了一个时代。尽管微软对mfc的更新没有停止,我也经常读到持只要windows不过时,mfc就不会过时之类观点的文章,但就象inprise(原borland)的owl框架的淡出一样,mfc的淡出也是早晚的事。如果mfc青春永驻,微软的开发人员也不会私自开发出基于atl的wtl呀。当然,wtl的地位不能和mfc比,它并不是微软官方支持的框架,封装的功能也相当有限。但至少也反衬出了mfc存在的不足。 我以为,最能体现一个应用程序框架的先进性的是它的委托模型,即对windows消息的封装机制。(对windows api的封装就不用说了吧。大同小异,也没什么技术含量。 如果高兴,你也可以自己

24、写一个类库来封装。但对windows消息驱动机制的封装就不是那么容易的了。)最自然的封装方式是采用虚成员函数。如果要响应某个消息就重载相应的虚函数。但出乎我的意料,mfc采用的是古老的宏定义方法。用宏定义方法的好处是省去了虚函数vtable的系统开销。(由于windows的消息种类很多,开销不算太小。)不过带来的缺点就是映射不太直观。好在较新版本vc带的classwizard可以自动生成消息映射代码,使用起来还是比较方便的。但和vcl的委托模型相比,mfc的映射方法就显得太落后了。而c+builder对c+语言进行了扩展,以便引入组件、事件处理、属性等新特性。由于功夫做在编译器级,生成的源代码

25、就显得十分简洁。但是由于扩展的非标准特性,使用vcl的c+builder的源代码无法被其它编译器编译。而mfc的功夫做在源代码级,虽然消息映射代码较为复杂且不直观,但兼容性非常好。只要你有mfc库的源代码(随vc企业版的光盘提供),你的mfc程序理论上用任何符合ansi标准的编译器均可编译通过。c+builder 3以上版本可以原封不动直接编译visual c+程序,很多人认为这是c+builder的兼容性好,实际上很大程度应归功于mfc的兼容性好。微软辛辛苦苦用标准方法写mfc,却为对手制造了方便。不知他们作何感想?而因为c+builder对语言作了扩展,vc不能编译c+builder的程序

26、。看来在这方面vc要输给c+builder了。而且vcl所支持的组件、属性等都是mfc所缺乏的特性。虽然vc也能支持组件,但要通过appwizard先生成一个包裹类(wrapper),不如vcl来得简洁。有很多人使用c+builder就是冲着控件板上那一大堆组件来的,vc虽然能使用的组件也很多(也许不比c+builder少),但由于不方便而对rad程序员没有吸引力。 c+builder的vcl比visual c+的mfc先进的另一个特性是异常处理。但令人啼笑皆非的是,它的异常处理代码有bug,有时会无端抛出异常。不知道在最新的版本中有没有改正了。而vc的框架mfc也不是一无是处。经历了那么多年

27、的发展和完善,mfc功能非常全面,而且十分稳定,bug很少。其中你可能遇到的bug更少。而且有第三方的专门工具帮助你避开这些bug。如此规模的一个类库,能做到这一点不容易。不要小看了这一点,很多专业程序员就是为这个选择vc的。而c+builder的vcl的bug就相对较多了,而且有些它自己带的示例程序都有错误。看来inprise还有很长的路要走。 再从它们的易用性比较。vc有classwizard、sourcebrowser等一系列工具,还附带visual sourcesafe、visual modeler等强大的工具,易用性非常好。(vc自带建模工具visual modeler,也许说明了它

28、才是工程级的开发平台,与c+builder的定位不同。)它所带的msdn这部开发者的百科全书更是让你没有找不到的,只有想不到的。而且它的autocomplete之类小功能也比c+builder要体贴。c+builder的新版本虽然也提供了这一功能,但它的提示要等好几秒才出来,有时你不经意间把鼠标停在某一处,也要等硬盘响好几秒,这可是在566mhz的赛扬ii上呀。不要笑我琐碎,有时一个开发工具的成熟和易用,就是从这些小地方体现出来的。c+builder作为rad工具,理应强调易用性。但与vc相比还显出不成熟。这是不应该的。 再来看看它们的可移植性。inprise正在开发c+builder和del

29、phi的linux版本, 代号为kylix。也许通过kylix,用vcl构架编写的windows程序向linux移植成为可能。但这只是可能。因为在目前inprise的兼容性工作做得并不好。c+builder可以编译vc程序还要多谢微软使用标准方法写mfc,而它自己各个版本之间兼容性却不太好。低版本的c+builder不能使用高版本的vcl组件(这还别去说它),而高版本的c+builder竟然不能使用低版本的vcl组件。真是岂有此理,我很少看见软件有不向下兼容的。如果windows 98不能运行95的程序,windows 95不能运行3.x的程序,win 3.x不能运行dos程序,你 还会用wi

30、ndows吗?如果不是c+builder的其它某些方面太出色,光是这个向下不兼容就足以让我抛弃它。而且虽说通过捆绑编译器,c+builder可以编译delphi的object pascal代码,但c+builder仍不能使用为delphi开发的vcl组件。所以一个组件有for d1/d 2/d3/d4/d5/c1/c3/c4/c5这些不同版本是常有的事,而且随着c+builder版本的升级可 能还会增加。希望inprise能先解决同门兄弟的兼容性问题。而微软的vc就没有这类问题 mfc1.0的程序也可以毫无障碍地在vc6.0下编译通过。 再来看看它们的前景吧。实际上,技术的进步在很多时候是此消

31、彼长的。当初borland的turbo c和borland c+几乎是唯一的选择。微软的quick c(现在还有人知道这个产品吗?)和microsoft c/c+从来也没有成为过主流。但borland c+又流行了多少年呢?不久就被新崛起的microsoft visual c/c+压下去了。现在的c+builder又有后来居上的态势,如果稳定性再提高一些,bug再少一些,有希望成为主流。但inspires的总体实力不及微软,这也是无可争议的。从c+builder 5的release notes中的known issues部分,以及它们的帮助文档的规模和质量都可以看出。(哪个同类产品的帮助文档能

32、和msdn比呢?)inprise公司应从netscape吸取教训,不要让c+builder成为第二个netscape communicator。(communicator也是一度技术领先,甚至曾占据了大部分的浏览器市场,但似乎后劲不足,而且 6.0 pr1、2中bug多多,现在被ie压得抬不起头。)c+builder是inspires的旗舰产品之一,前景应当还是比较乐观的,而且inspires已经在向linux进军了,而微软还迟迟没有动作,难道非要到linux成燎原之势(或许已经成燎原之势了)才会奋起占领这个新兴市场?似乎他们对linux的态度与几年前对互联网的兴起的反应迟缓有些相似。但后来.

33、唉,真希望inprise不要步netscape的后尘。c+builder是一个很有前途的开发工具。遗憾的是,inprise公司delphi的创始人已经跳槽到微软去主持visual j+项目了。但愿对inprise冲击不会太大。微软的visual c+的前景又怎样呢?visual studio 7.0不久就要推出了。不知能不能在保持稳定性的同时在技术的先进性上赶上c+builder。另外,这一版本将加强网络开发的特性。看来微软虽然被判解体,开发实力可是一点没打折扣。 就技术(主要指应用框架)来说,c+builder目前领先于visual c+。但多多少少的不尽人意之处对inprise想说爱你不容

34、易。而vc尽管发展到今日已十分完善,但mfc框架已是明日黄花了。如果不使用mfc,目前又没有合适的替代品。wfc是支持组件、属性和事件的,但那是visual j+里边用的;atl也很先进,但是用来进行com/activex开发的;基于atl的wtl也不错,可惜是非官方作品,也未必比vcl先进。微软最近提出了c#(读作c sharp)语言方案,但那属于和java同一类的东西。看来是金无足赤啊。根据 你的需要做选择吧。实际上visual c+和c+builder也不是单单竞争关系。它们在许多领域并不重叠,甚至是互补的。到底怎样取舍,要根据你的项目特性决定。如果你开发系统底层的东西,需要极好的兼容性

35、和稳定性,选visual c+吧。你可以只调用windows的各种api,不用mfc。如果你写传统的windows桌面应用程序,visual c+的mfc框架是正统的选择。如果你为企业开发数据库、信息管理系统等高层应用(高层是相对于低层/底层而言的,不是说技术高级或低级。)而且有比较紧的期限限制,选c+builder比较好。如果你用的语言是object pascal,delphi是唯一的选择(如果gnu pascal等免费编译器不考虑的话)。如果你原先用delphi(object pascal语言),现在想改学 c+,应当先c+builder。熟悉的界面和相同的框架会让你的转轨事半功倍。 3.

36、1.3 bcb的调试程序的bugs越少,最终用户对这个程序的评价越高。而开发人员事先对bugs的处理越多,最终用户能提供的关于bugs的信息就越多,也越准确,这样,开发人员在接到最终用户反映之后,就能够快速找到出现bugs的那部分代码,并以最快速度发布程序的升级包。 (1)写易读的代码 第一点,大概也是最重要的一点,就是写干净易读的代码。易读的代码是很有价值的。请想象一下,如果随便扫视一眼代码或注释,就能立刻知道这段代码的的作用,以及在写代码的时候为什么要这样写,当时的思路是什么,那么就可以节约大量时间。这样的代码,在写的时候可能会稍稍慢一些,不过,当你调试程序时,就不会花上几个小时来寻找bu

37、gs,相反,你可以快速,简单的完成除错工作。这时,你就会觉得多花一些时间使程序易读是很值得的。所以,在写程序的时候,应该养成自己的风格,或是读一读scott的关于代码风格的文章。 (2)使用exceptions和exception的处理方法 除去一些少数的情况,开发人员不可能总是依靠于集成的调试工具。所以,学会用其它的方法来找到烦人的bugs是很重要的。一些重要的、处理的错误可能会在窗体之外发生。在c+标准制定出来之前的黑暗日子里,在程序里面发出发生错误的信号,通常是通过返回错误代码完成的(现在这种方法仍然应用于ole技术和一些winapi函数),这样的处理方法很容易就会被忽略。(比如说,你经

38、常检查winapi函数的返回值吗?)所以,出现问题的可能性并不小。由于以上的原因,需要一个这样的机制,它不能忽略这些错误,而且,这个机制应该能被我们控制和自定义的。在这样的需求下,异常处理机制出现了。需要一个特殊的错误类型吗?简单,定义一个新的异常类型就行了(和定义一个类的方法差不多),然后抛出(throw)它。 c+builder定义了try catch () 机制。这和刚刚定义的异常机制的结构很相似。这个机制完全可以按照需要自定义。要使用异常处理了,只要把要执行的代码放到try块里面,为了让程序知道出现异常后应该做什么,还需要定义一个catch()或是_finally块。catch()语句

39、里面可以指定一个要捕捉的类型或是变量,甚至可以用它来捕捉树结构或是继承类的异常,如果捕捉了基类的异常,它就能捕捉到继承这个基类的所有的类的异常。比如,在vcl中,所有的异常都是继承于exception类。所以,catch(exception& e)可以捕捉到除了esocketerror的所有vcl异常。为了让这个机制更强大,c+builder中还定义了catch()语句。(没错,就是三个点)使用这条语句可以捕捉到所有的异常。还有更多的功能吗?当然,你可以添加更多的catch()语句,可以向使用ifelse if语句那样使用它。注意,在一系列的catch()语句中,错误不会被重复的捕捉,也就是说

40、,如果前面的catch()语句捕捉到了错误,后面的catch()语句将不会捕捉这条错误。 这个机制还有更多的功能。如果你想处理异常,但是不想在处理的位置停止,那么可以重新抛出异常。这时,程序将继续寻找下一个catch()语句来处理这个异常。这个方法和“throw”差不多。这样,你处理过的异常会再次被抛出,继续寻找下一个catch语句来处理它。 最后一个要说的是_finally(这不是标准的用法,是borland添加的一个好方法),在_finally程序块中代码,无论是否发生异常都会被执行。这是一个清理程序中使用new分配的本地变量,设置用作旗标的变量值为正常的好位置。(比如,把一个等待状态的光

41、标图标设置为正常光标。) 就是这些了。有时间的话,请看看c+builder帮助文件中的exception类以及继承exception的类。这些将对于理解本节所说的内容有很大帮助。 (3)使用记录机制 不可能总是用调试器来调试代码,在某些情况下,可能无法使用内部集成的调试器,这时候,就不得不依靠其他手段调试程序了。(比如:windows nt服务程序,isapi/cgi程序,实时应用程序等等)。这时候,有经验的程序员可能会借助古老的调试方法,例如,使用一些分类的记录机制来确定程序实际运行的过程。现在有一系列的方法可以简单的完成这样的工作。下面将介绍3种方法。 第一个方法:outputdebugs

42、tring。(winapi: void outputdebugstring(lpctstr lpoutputstring);)很幸运,微软彻底的实现了调试子系统。它包括的一些特点可能让你想把自己的记录系统扔掉。应用程序在调试器进程中运行时outputdebugstring将用c字符串把调试器输出的信息打印出来。如果程序没有在调试器进程中运行,它将忽略这些调用。它会很好的在客户的机器上运行,不会弹出信息窗口。如果在发布给客户的时候,忘记去掉这些代码程序仅仅会变慢一点,不会有别的不良后果。 第二个方法:使用了gexperts,通过 dbugint.pas接口进行调试。它是个可以称之为伟大的程序,你

43、可以把它分发给客户。和outputdebugstring一样,如果客户没有这个程序,它就根本什么也不作。(它会自动检测机器上是否安装了客户端)。要使用dbugintf,它很容易被加入到你的工程中,加入#include dbugintf.hpp(要把它加入工程,然后会编译它的pascal文件)。然后,你就可以直接使用senddebug(要送到记录文件的字符串); 或者,你需要它更机警一些,可以使用senddebugex(它给tmsgdlgtype增加了一个新的消息类型)sendmethodenter, sendmethodexit, sendseparator等等(用法都差不多)。如果你打算给最

44、终用户分发客户端 (gdebug.exe),不要忘记include所需要的程序包。gexperts可以在 得到,它是免费的。 第三个方法:大概是最艰苦的方法,就是使用自己的记录控制。这个方法可能不是想象的这么简单。可能首先会想到“在窗体上扔一个richedit,把它设置为只读的,然后往里面写记录”是这样吧?理论上不错,但是,实施起来首先,使用richedit控件来做记录,会大大降低应用程序的速度,还会在内存中造成碎片,甚至丢失内存。通常,在运行10分钟左右之后,会使整个计算机的速度变慢!所以,如果希望在自己的记录中能够使用彩色和图标,那么最好自己创建

45、一个组件。如果没有这么高的要求,那么有一个简单有效的方法,就是使用listbox控件作记录,把listbox的style属性设置为lbownerdrawfixed,这样句柄将会自绘。(gexperts的控制台就是用这样的方法制作的)。 (4)将记录和异常处理结合使用 不用总是担心可能会发生什么偶然的异常。一般来说,通过很多的bugs测试后(尽量折磨程序,看看它会不会崩溃),应用程序在运行是应该不会出现什么错误。下面的这个技术,建议组件开发者,在第一次把组件放在ide环境测试的时候,很应该遵守。一个在ide中产生的异常会导致很多问题,甚至可能无法重新启动ide也不能恢复。这个技术很简单。在代码中

46、每一个函数或是主要的函数中加入: try /函数的代码 catch(exception &e) senddebugmessage(“exception caught in classname:functionname of type:” +e.classname() +” with the message:”+e.message); ; 把字符串中classname 和 functionname 替换成相应的类名和函数名。在出现错误时,你会立刻知道错误发生的位置。这样也就不至于强制重起ide的了。 classname()给了什么样的帮助呢?它只是用于返回字符串“exception”吗?每一次,

47、e都被声明为异常类型?这是vcl另一个优秀的地方,所有的类都从tobject继承,所以,这些类都能自动获得正确的类型和基类的类型,所有的更多的信息都可以在这里找到。(请参见tobject的帮助)所以,尽管使用了exception &e,其中的e.classname()将返回捕获到的产生异常的实际类名。得到这些好处需要付出的代价是编译出来的可执行文件变大了一些。所有的delphi/cbuilder用户都注意到了这一点,但是说没有付出就没有收获。在http:/www.bytamin- 3.2 系统结构主菜单模块由数据结构、操作、帮助、程序四个部分组成。数据结构模板由线性表、堆栈和队列、树、图等四个

48、部分组成。线性表又分为链表概念、链表模型、链表操作、双向链表四个部分,堆栈和队列分为基本堆栈、基本队列、循环队列三个部分,树分为数据二叉树、结构二叉树、类二叉树,图分为图表示、图搜索、最短路径。操作模板由线性表说明、堆栈说明、队列说明、树说明、图说明组成。帮助模板由关于和帮助组成。程序模块由退出组成。系统的功能模块如图3-1所示。本系统是由我与另外一个同学合作完成的,根据系统的结构,我们对各自的任务做了明确的分工。我在本系统中所做的工作是:1、详细分析了系统需求,提出了系统设计方案,并进行了论证;2、分析了rad设计方法的利弊,并选定了设计方案。3、主菜单、线性表、树、操作四部分模块的设计。

49、链表概念 链表模型退出程序链表操作双向链表线性表基本堆栈基本队列堆栈和队列数据结构循环队列数组二叉树树结构二叉树操作二叉树图图表示进入系统线性表说明图搜索最短路径操作堆栈说明队列说明树说明图说明关于帮助帮助图3-1 系统模块图3.3 详细设计3.3.1 主菜单(1)主菜单主要由一个菜单控件、一个显示文本、三个按纽、二个可供长文本输入/出等七个控件组成。如图3-2所示:图3-2 主菜单的显示图(2)设计思想:开始作为一个演示系统的菜单,应给人一个直观的感觉,有个醒目的标题,通过一个菜单控件,连接我们设计的各种数据结构的算法演示;两个文本输入,用于对算法的说明,辅助使用者对算法的学习;作为一个系统

50、,一个帮助模块是不可缺少的。主菜单的流程图如图3-3所示。帮助操作数据结构程序线性表说明图说明帮助关于树说明队列说明堆栈说明图树堆栈和队列线性表退出图3-3 主菜单流程图(3)控件介绍:c+ builder的组件工具箱(component palette)提供各种制作组件的工具,包括文字标签、文本框、图象组件等。在本系统中,用到了mainmenu(建立主菜单)、popupmemu(建立弹出式菜单元件)、label(在窗体上显示文本信息的工具)、edit(建立文本框的工具)、memo(可以让用户输入文字信息,功能较文字标签更多元化)、button(在窗体上建立命令按纽组件,在窗体上单击此按纽时,

51、可以执行对应的程序代码)、listbox(在窗体建立列表框组件,提供数据选项)、combobox(它可建立下拉式列表,是列表框与文本框的组合)、scrollbar(用来建立滚动条组件)、groupbox(在窗体上建立框架组件)、radiogroup(建立选择群组组件)、panel(存放其他组件的容器组件)、actionlist(存放执行动作的组件);bitbin(可有图标的按纽)、stinggrid(字符串)、image(显示图象图片)、shape(基本图形的建立)、bevel(建立边框面板)、tabcontrol(建立标签集)、imagelist(图象序列)、richedit(多功能编辑)、

52、statusbar(状态显示)、timer(时间时间控制)这些组件。3.3.2 线性表模块(1)在菜单中,我们通过调用winexec函数,以执行外部命令的方式,调用链表概念.exe程序,来完成链表概念的演示。源代码如下: newfilename=extractfilepath(application-exename)+链表概念.exe; i=winexec(newfilename.c_str(),sw_shownormal); 在链表概念的实现中,比较数组与链表的区别,两者最明显的差别在于存储空间的配置上,数组是固定配置存储空间,因此存取上受到限制,如果超过范围则会产生无法预期的状况。此程序是

53、用一组地址连续的存储单位依次存储线性表的数据元素,以此实现线性表的顺序存储结构,这种存储结构的线性表叫顺序表。如图3-4所示。图3-4 链表概念显示图 图3-5 链表概念流程图开始输入数据选择按纽显示链表顺序退出结束(2)在菜单中,我们通过调用winexec函数,以执行外部命令的方式,调用链表模型.exe程序,来完成链表模型的演示。源代码如下: newfilename=extractfilepath(application-exename)+链表模型.exe; i=winexec(newfilename.c_str(),sw_shownormal); 在链表模型的实现中,此程序是一个用c+类方

54、式编写的链表模型。线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素与其直接后继数据元素之间的逻辑关系,对数据元素来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息。根据以上思想,我设计该程序的运行页面如图3-6所示。图3-6 链表模型显示图开始输入内容选择争先夺后列席结束图3-7 链表模型流程图(3)在菜单中,我们通过调用winexec函数,以执行外部命令的方式,调用链表操作.exe程序,来完成链表操作的演示。源代码如下: newfilename=extractfilepath(appl

55、ication-exename)+链表操作.exe; i=winexec(newfilename.c_str(),sw_shownormal); 在链表操作的实现中,此程序是链表的基本操作模型,在这种存储结构中,容易实现线性表的某些操作, 在此程序中,我们重点实现了链表的插入和删除。假设我们要在线性表的两个数据元素a和b之间插入一个数据元素x,已知p为其链表存储结构中指向接点a的指针,如图3-8(a)所示:ababxpps(a)(b)图3-8 在单链表中插入结点时指针变化状况为插入数据元素x,首先要生成一个数据域为x的结点,然后插入在单链表中。根据插入操作的逻辑定义,还需要修改结点a中的指针域,令其指向结点x,而结点x中的指针域应指向结点b,从而实现3个元素a、b和x之间逻辑关系的变化。插入后的单链表如图(b)所示。假设s为指向结点x的指针,则上述指针修改用语句描述即为:s-next=p-next ; p-next=s;反之,如图3-9所示在线性表中删除元素b时,为在单链表中实现元素a、b和c之间的逻辑关

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论