




已阅读5页,还剩30页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
东北财经大学本科毕业论文Hanoi塔递归演示系统 为数据结构课程做CAI演示系统作 者 院 系 经济信息系 专 业 信息管理与信息系统 年 级 学 号 9 指导教师 答辩日期 成 绩 内 容 提 要论文的目的是使用sun公司开发的java语言,来为数据结构课程中关于递归调用方面的内容做一个hanoi塔的演示系统 。毕业论文是考察本人四年来所学习的知识,考察我的综合运用所学的基础理论和专业技能,独立分析和解决实际问题的能力,培养我从事计算机软件设计,开发及应用的高层次工程技术人才。我的毕业论文的题目是为数据结构课程做Hanoi演示系统,属于计算机辅助教学的一部分,本系统主要包含两个模块;用户控制区和系统演示区,通过把applet.java数据包内嵌在IE浏览器中,在J2SDK环境下编辑,最后在IE浏览器运行。本系统是为了使老师和同学之间更好的互动起来,而且操作简单,容易被大家接受。关键词:数据结构 java 计算机辅助教学AbstractThe thesis goal uses the java language which sun Corporation develops to make a hanoi tower for the construction of data curriculum about the recursion transfer aspect content the demonstration system.The graduation thesis inspects the knowledge which myself for four years studies, inspects basic theory and specialized skill which my synthesis utilization studies, the independent analysis and the solution actual problem ability, trains me to be engaged in the computer software design, the development and the application high level project technology talented person. My graduation thesis topic is makes the Hanoi demonstration system for the construction of data curriculum, belongs to the computer aided teaching a part, this system contains two modules; The user control area and the system demonstration area, passes applet.In the java data packet inlays in the IE browser, edits under the J2SDK environment, finally in IE browser movement. This system is for cause between teacher and the schoolmate a better interaction, moreover operates simply, easily is accepted by everybody.Key word: Construction of data, java, computer aided instruction目 录一、Hanoi塔演示系统的开发背景及意义1 CAI的概述1 CAI下的系统开发模型2 Hanoi塔演示系统的开发意义3二、Hanoi塔演示系统的开发环境4 java语言的特点4 java语言中对Applet类的阐述4 使用UltraEdit软件对hanoi塔演示系统进行编辑和运行4三、Hanoi塔演示系统的分析与设计5 Hanoi塔演示系统的需求分析5 Hanoi塔实现原理的分析6 Hanoi塔演示系统的详细设计6四、Hanoi塔演示系统的具体实现7 Hanoi塔演示系统实现的分步解析7 Hanoi塔演示系统的演示说明11 Hanoi塔演示系统核心代码的实现11五、总结15参考文献15Hanoi塔递归演示系统 为数据结构课程做CAI演示系统一、 Hanoi塔演示系统的开发背景及意义 CAI概述随着信息时代的到来,以Internet网络为代表的信息化浪潮滚滚而来。面对一个发展愈来愈快的世界,我们必然会想到传统教育如何与信息技术相结合,以跟上时代前进的步伐。信息技术为教学的改革提供了新的教学环境和工作平台,给教育带来了新的观点、方法、技术和手段,将产生不可估量的影响,这一点在CAI的不断发展中有着充分的展示。由于计算机具有存储、加工、输出和输入信息的功能,并能在程序的控制下自动工作,利用计算机去实现程序教学的各项功能是再合适不过了。因此,在50年代程序教学盛行,计算机得到较好发展的美国,首先出现计算机辅助教学这一新的教育技术是一种历史的必然。同时,也可以看出:CAI 的产生,不仅仅是教学手段和方法上变化,更重要的是教学观念上的革命。CAI的兴起有着它的社会基础、物质基础和理论基础。在CAI的发展过程中,这三种因素始终起着促进和制约作用,因此,只有通过CAI中应用的学习理论和计算机技术以及社会的需求,去观察和分析CAI的发展,才能真正把握CAI的本质及其发展的脉络。根据CAI 软件所运用的学习理论和使用的计算机技术,可以把CAI的发展分为三个阶段。 1. 第一阶段 从20世纪50年代到70年代这二十多年时间,可以认为是CAI发展中的第一阶段。在学习理论的应用上,多数CAI 软件采用行为主义学习理论,倡导的程序教学。行为主义学习理论强调刺激、反应和强化,通过反应后的强化建立反应与刺激间的正确联系2第二阶段 20世纪80年代的十年,是CAI发展的第二阶段,在这期间无论是CAI的发展规模,还是应用水平都有显著地提高。在这一时期,计算机技术得到了迅速发展,特别是多媒体技术的出现和应用,使CAI产生了巨大变化。在人-机交互方式上更加多样化,通过图、文、声、视频图象等多种形式表达教学信息;在信息组织方式上采用了超文本技术,形成超媒体系统,能较好地适应学习者的联想性思维。 3. 第三阶段 进入90年代后,CAI的发展产生了新的飞跃,进入到了一个新的发展阶段,主要表现在建构主义(Constructivism)学习理论的应用和计算机网络的使用。把CAI的发展分为三个阶段,这是从CAI的发展中学习理论的应用这一主线来讲的。当然,并不是说在一个阶段CAI软件的开发中就只能采用一种学习理论,即使在将要跨入21世纪的今天,操练型的CAI软件仍能在教学中起到很大作用。回顾CAI的发展,可以看出学习理论、计算机技术对CAI的巨大作用,同时也应注意到社会的发展现状对它的期望和约束,这种期望集中地表现在社会对人才培养的要求上,而社会发展的不平衡,它所能够提供的物质条件也存在较大的差异。基于此,CAI 的未来发展将会呈现出多态性。 1. 应用方式的多样化除了能提供交互环境的CAI软件之外,用于课堂演示和帮助教师备课的CAI软件也将得到发展。 2. 多种学习资源的集成化先进的学习理论为我们开发CAI软件提供了重要的理论依据,这是提高CAI软件质量的重要的保证。 3. 研究、使用和教师培训的互动对CAI软件的开发作理论上、技术上和应用方面的深入研究,是促进CAI不断发展的基础工作,必须给予充分重视。同时也应不断地解决CAI软件使用中的问题,其中教师的培训是一个关键。不仅要使教师掌握CAI软件的具体的使用方法,更重要的是观念的转变,以教学改革促进CAI的应用,反之又通过CAI的应用促进教学改革 CAI下的开发模型CAI演示系统作为一种辅助教学的工具,首先它必须是一种教学系统,也就是说它必须围绕学习者学习知识这一中心来展开。同时,演示系统也是一种具有一定教学功能的计算机软件,所以做为软件开发的管理技术和方法结合的软件工程,对于教学系统的开发也是同样适用和重要的,它有利于成功地开发教学系统。教学系统不同于一般的软件开发它要涉及到教育、心理、专业知识和计算机技术各个方面。Hanoi塔演示系统按软件工程的开发模型共分5个阶段:计划阶段、需求分析阶段、设计阶段、实现阶段和评价维护阶段,每个阶段都有明确的任务, 计划阶段:分析教学要求和教学对象,分析系统所需的技术支持条件和运行环境,确定该系统开发的可行性,制定开发计划。需求分析阶段:进行需求分析、按需准备材料,确定教学目标,把握教学重点,只有有了明确的教学目标,才能抓住那些难以通过常规教学手段达到教学目的的重点内容,来制作相适应的系统,这样制作出的系统才有它的实用性,才有辅助教学的意义,所以经过需求分析我制作了数据结构课程中我认为最难的递归调用方面的系统。设计阶段:该阶段完成的是系统设计和脚本编写。实现阶段:把设计阶段所得到的教学方式及教学内容选择利用各种开发工具通过软件制作加以实现。评价维护阶段:通过系统在实际教学中的试运行,教师和学生对系统的性能从教与学两方面进行评价,在实际使用过程中,可根据教师和学生的反馈意见或建议进行修改和完善,以保证系统的先进性和实用性。应用到本系统中情况如下: 图 1 课件开发瀑布模型图 Hanoi塔演示系统的开发意义对教师而言,通过本人开发的Hanoi演示系统可以使教师摆脱粉笔加黑板的传统教学方式,将精力集中在搞好课堂教学、解答问题、培养学生能力上,更好的和学生互动起来。对学生而言,本系统不仅有利于激发学生的学习兴趣和认知主体作用、有利于知识的获取和实现对教学信息的有效组织与管理,为教学提供一个较理想的环境,而且也是整个教育信息化所迫切要求的。二、Hanoi塔演示系统的开发环境 java语言的特点众所周知Java语言是一种简单的面象对象的分布式的解释的健壮的安全的结构中立的可移植的性能很优异的多线程的动态的语言。而我选择Java语言做Hanoi演示系统的原因主要是因为:1、Java提供了丰富的类库。如Applet类 (本程序所使用的主要类),它封装了java小型演示系统的基本内容,。在应用时得心应手,左右逢源给完成本系统提供了很大的方便。 2、Java的风格类似于C+,从某种意义上讲,Java语言是C及C+语言的一个变种,而C语言和C+语言是我所熟悉的,Java摒弃了C+中容易引发程序错误的地方,如指针和内存管理。3、Java语言的设计完全是面向对象的,它不支持类似C语言那样的面向过程的程序设计技术。Java支持静态和动态风格的代码继承及重用。4、当Java用来创建浏览器时,语言功能和浏览器本身提供的功能结合起来,使它更安全。Java语言在机器上执行前,要经过很多次的测试。它经过代码校验,检查代码段的格式,检测指针操作,对象操作是否过分以及试图改变一个对象的类型。5、Java语言的JVM的技术。大多数编译器产生的目标代码只能运行在一 种CPU上,即使那些能支持多种CPU的编译器也不能同时产生适合多 种CPU的目标代码。如果需要在三种CPU上运行同一程序, 就必须编译三次。 JAVA编译器就不同。JAVA编译器产生的目标代码(J-Code) 是针对一种并不存在的CPU-JAVA虚拟机,而不是某一实际的CPU。JAVA虚拟机能掩盖不同CPU之间的差别,使J-Code能运行于任何具有JAVA虚拟机的机器上。6、Java使用Unicode作为它的标准字符,这项特性使得Java的程序能在不同语言的平台上都能撰写和执行。可以把程序中的变量、类别名称使用中文来表示,当程序移植到其它语言平台时,还是可以正常的执行。 java语言中对Applet类的阐述Applet的概念相当简单,能够在网页上执行的程序叫Applet,它封装了一些小的应用程序的基本内容,需要支持Java的浏览器,并且applet支持动态的网页,这是很多其他语言所不能做到的.使用applet时在Web页面中加入一个标记就可以了。IE浏览器一遇到这个标记,就会下载对应的 Applet类文件,并启动自己的解释器运行这个Applet。在此过程中IE浏览器担当相当重要的角色,特别是它必需具备运行Java的能力,在电脑中装入JSDK等编辑器和JAVA控制台程序,就会在internet选项中出现运用 java选项,选择它,浏览器就可以运行applet了。在此过程中需要用到IE浏览器的ActiveX控件,运用它的目的是将显示Web页面和运行Java Applet这两个任务分离,IE浏览器的主要任务是负责各种页面部件(如图片、文本、Applet等)的布局。ActiveX控件就是一个能够负责特定页面区域的代码模块。IE浏览器只需要知道Applet应该保留的大小,然后就可以将它象图片或其它页面元素一样安排了,而运行Applet的任务则由ActiveX控件负责。 使用UltraEdit软件对Hanoi塔演示系统进行编辑和运行软件环境:使用java初学者常用的开发工具UltraEdit开发本系统,自己的电脑上安装了java虚拟机,用来支持Applet插件。硬件环境:一台康柏Pentium3笔记本电脑,使用的WindowsXP操作系统,IE为6.0版本。UltraEdit是共享软件,它的官方网址是: 。最新版本是V10.20b。它是一个功能强大的文本、HTML、程序源代码编辑器。UltraEdit是一个记事本和大多数编辑程序的替换程序,支持无限制的文件大小,100,000个词语的拼写检查,完整的十六进制编辑性能,可配置的适合程序设计的语法加亮、列编辑。UltraEdit可以同时处理多个文件,即使是以MB为计数的文件。它基于磁盘,甚至对于非常大的文件,也只需要很少的内存数量。UltraEdit-32是为Windows98/Me和WindowsNT/2000/XP/2003设计。作为源代码编辑器,它的默认配置可以对C/C+, VB, HTML, Java和 Perl进行语法着色。用它设计Java程序时,可以对Java的关键词进行识别并着色,方便了Java程序设计。它具有完备的复制、粘贴、剪切、查找、替换、格式控制等编辑功能。可以在Advanced菜单的Tool Configuration 菜单项配置好Java的编译器Javac和解释器Java,直接编译运行Java程序,配置Javac:在Command Line里输入:D:jspj2sdkbinJavac %f,这里Javac的路径要根据JDK的实际安装路径来指定,%f是指当前活动文档的全文件名。在Menu Item Name 里输入Javac ,它显示在Advanced菜单里,这样就可以直接执行它进行编译了。选中Output To List Box和Capture Output ,这样就可以在源代码下面的输出窗口里看到编译时的错误信息了。配置不带参数运行的解释器Java:在Command Line里输入:D:jspj2sdkbinJava %n,在Menu Item Name 里输入: Java filename,选中Output To List Box和Capture Output ,运行结果显示在输出窗口里。配置带参数运行的解释器Java:在Command Line里输入:d:jspj2sdkbinJava %n%modify%,在Menu Item Name 里输入:Java filename parameter,这样当执行这个菜单项的时候,会显示一个要求输入参数的对话框。UltraEdit的运行及配置示例见图2。图 2 UltraEdit的开发界面图三、Hanoi塔演示系统的分析与设计 Hanoi塔演示系统的需求分析很多同学在学习函数的时候,只知道函数的作用就是将一些需要多次使用的语句段合并在一起,使主函数可以多次调用它,也知道函数可以自我调用,但是并没有真正认识到函数调用的用处。本系统开发的原因在于让同学对函数递归调用的用处有进一步了解,懂得函数递归调用的定义和在基本算法上的应用,最后还要懂得如何更好的使用这一程序结构。我跟我们低年级的同学上了一段时间的数据结构课程,从中了解到数据结构课程内容和我本人学习时的变化不大,主要是目的是为了编写出一个“好”的程序,分析待处理的对象的特性以及各处理对象之间存在的关系。课程内容前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用,后半部分主要讨论查找和排序的各种实现方法及其综合分析比较,接下来我又找了几个同学进行调研,询问了他们在学习中遇到的问题,对数据结构这门课程的难点重点有了更深的了解。通过这次调研我发现大多数的学生和我有一样的感受,就是数据结构课程内容抽象,难于理解,而且算法较多,如果死记硬背,劳神费力不说,效果也不会好,尤其是递归调用这一部分内容都是抽象的算法,学生在学习这一部分内容时遇到了很大的困难。了解了这些为我的毕业设计软件提供了很好的建设模型的标准和参考,从而使我的软件设计标准和目的有了初步的规划。我会根据课程内容的整体要求和教学大纲确定系统总目标,充分考虑学生的层次、基础、特点和理解能力,制定系统的大体框架,涵盖该课程的递归调用内容。本阶段的任务是面向“问题”,而不是面向“解决”,要逐级确定出系统目标。复审时再和课程教师共同进行,还要注意所演示的教学单元是否充分包括了我所选择递归调用教学内容。 Hanoi塔递归调用实现原理的分析Hanoi塔是一个有名的递归问题,我看到的大部分计算机语言书中在谈到递归时都用Hanoi塔作为例子,问题是这样的古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在上,小的在下,要求把这64个盘子从A座移到C座但每次只允许移动一个盘子,且在移动过程中在3个座上都保持大盘在下,小盘在上,在移动过程中可以利用B座。可以肯定的说,任何人都不能直接的写出盘子的每一个具体步骤。但是假如有另外的一个人有办法将63个盘子从一个座移到令一座,那么,问题就解决了,我只需命令第二个人将63个盘子从A座移到B座,自己将1个盘子从A座移到C座,再命令第二个人将63个盘子从B座移到C座。任务就全部完成了,这就是递归方法,但是有一个实际问题没有解决,第二个人怎样才能将63个盘子从A移动到B呢,第二个人又会想,如果有人能将62个盘子从一个座移动到令一个座,我就能将63个盘子从A移动到B,因此,他命令第三个人将62个盘子从A移到C,自己将一个盘子从A移到B座,再命令那个人将62个盘子从C移到B,再进行一次递归,如此层层下放,直到后来找到63个人,让他完成将1个盘子从一个座移到令一个座,至此问题就全部解决了。可以看出,递归的结束条件是最后一个和尚只需移一个盘子,否则递归还要进行下去。递归算法在可计算性理论中占有重要地位,它是算法设计的有力工具,对于拓展编程思路非常有用。就递归算法而言并不涉及高深数学知识,只不过对于我们开始学习递归的同学来说要建立起递归概念不十分容易。综上所述,Hanoi塔的实现原理是一个函数在它的函数体内调用它自身,在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身。每调用一次就进入新的一层。为了防止递归调用无终止地进行, 必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。 Hanoi塔演示系统的详细设计1、Hanoi塔演示系统的窗体设计Hanoi塔演示系统的窗体包括演示区域和控制面板区域,其背景颜色以灰白为主。在演示区域内含有三个圆棍,用土黄色标记,盘子移动的空间用浅黄色背景颜色,为了配合盘子的颜色。盘子和棍子的底部用接近土地的深棕色表示,这样既美观形象,又和整个演示区的色调一致。演示系统上面有该系统的版权介绍,上面写着“董宁制作”的字样。演示区域的下面最开始显示把所有的碟子移动到最合适的盘子的棍子上,随着盘子的移动可以显示“解决中” 、“完成”等字样。演示区域的右边是控制区域,了使整个系统的底色和整个窗体一致,我选折了灰色来配合演示区域。控制区最上边是一个加、减的选择按扭,用来调节盘子的数量,从3个到12个不等,这个是我自认为满意的地方,因为它可以充分的演示Hanoi的递归原理,很多书中介绍Hanoi塔时都是三个盘子,这样学生无法真正的了解到Hanoi塔的运行规律,而我做的Hanoi塔演示系统基本上能够满足盘子的数量要求,充分演示递归原理。下面是重新开始和开始的按扭,用来开始系统,和去掉所有线程,来控制系统的演示过程。在此基础我还曾加了速度调节功能,用来控制演示的速度,起一个修饰的作用,让同学们可以根据自己的喜好来控制系统运行,而且不仅在系统运行钱调节速度,还可以在系统运行中根据自己的需要调节。接下来是时间间隔窗体,用来显示间隔的时间。在控制区域的最下端是移动次数窗体,用来统计整个演示的过程中盘子的移动次数。下面是Hanoi塔演示系统的初始情况和完成时的情况 初始情况 完成情况图 3 Hanoi塔的始末情况图2、Hanoi塔演示系统的文件结构和内部结构设计Java程序的源文件有三种,后缀名分别是.java,.class和.jar。本文原始的java文件有两个,分别为Hanoi.java和sample.htm文件,前一个是本系统的源代码,后一个是Applet的控制代码。但是.java文件是不能直接应用的,必须用编译器把它编译成.class文件才能直接插入网页。编译后的文件分别为:Board.class BoardCanvas.class ControlPanel.class Hanoi11.class StatusPanel.class Timer.class,这是和本文的内部结构相对应的编译结果。而.jar文件,在中加上archive=*.jar,则可以在最新的浏览器中加快载入速度。四、Hanoi塔演示系统的具体实现 Hanoi塔演示系统的具体实现分步解析1在A柱上只有一只盘子,假定盘号为1,这时只需将该盘从A搬至C,一次完成,记为move 1 from A to C图4 hanoi塔分布解析图12在A柱上有二只盘子,1为小盘,2为大盘。第(1)步将1号盘从A移至B,这是为了让2号盘能移动;第(2)步将2号盘从A移至C;第(3)步再将1号盘从B移至C;这三步记为:move 1 from A to B;move 2 from A to C;move 1 form B to C;图5 hanoi塔分布解析图23在A柱上有3只盘子,从小到大分别为1号,2号,3号第(1)步将1号盘和2号盘视为一个整体;先将二者作为整体从A移至B,给3号盘创造能够一次移至C的机会。这一步记为move( 2, A, C, B),意思是将上面的2只盘子作为整体从A借助C移至B。第(2)步将3号盘从A移至C,一次到位。记为move 3 from A to C第(3)步处于B上的作为一个整体的2只盘子,再移至C。这一步记为move( 2, B, A, C)意思是将2只盘子作为整体从B借助A移至C。图6 hanoi塔分布解析图34从题目的约束条件看,大盘上可以随便摞小盘,相反则不允许。在将1号和2号盘当整体从A移至B的过程中move(2, A, C, B)实际上是分解为以下三步第(1).1步:move 1 form A to C;第(1).2步:move 2 form A to B;第(1).3步:move 1 form C to B;经过以上步骤,将1号和2号盘作为整体从A移至B,为3号盘从A移至C创造了条件。同样,3号盘一旦到了C,就要考虑如何实现将1号和2号盘当整体从B移至C的过程了。实际上move(2, B, A, C)也要分解为三步:第(3).1步:move 1 form B to A;第(3).2步:move 2 form B to C;第(3).3步:move 1 form A to C;5看move(2, A, C, B)是说要将2只盘子从A搬至B,但没有C是不行的,因为第(1).1步就要将1盘从A移到C,给2盘创造条件从A移至B,然后再把1盘从C移至B。因此,在构思搬移过程的参量时,要把3个柱子都用上。6定义搬移函数move(n, A, B, C),物理意义是将n只盘子从A经B搬到C考虑到前面已经研究过的(1)(2)(3)步,可以将搬移过程用如下的与或结点图表示。图 7 hanoi塔与或结点图这里用与或结点的含义是分解为(1)(2)(3)步。这3步是相关的,相互依存的,而且是有序的,从左至右执行。move(n, A, B, C) 分解为3步(1)move(n-1, A, C, B)理解为将上面的n-1只盘子作为一个整体从A经C移至B;(2)输出n:A to C,理解将n号盘从A移至C,是直接可解结点;(3)Move(n-1, B, A, C)理解为将上面的n-1只盘子作为一个整体从B经A移至C。图 8 hanoi塔分布解析图4这里显然是一种递归定义,当着解move(n-1, A, C, B)时又可想到,将其分解为3步:第1步:将上面的n-2只盘子作为一个整体从A经B到C,move(n-2, A, B, C);第2步:第n-1号盘子从A直接移至B,即n-1:A to B;第3步:再将上面的n-2只盘子作为一个整体从C经A移至B,move(n-2, C, A, B);下面,我们以3只盘子为例画出递归的与或图。图9 hanoi塔与或递归图这个图很象一颗倒置着的树,结点move(3, A, B, C)是树根,与结点是树的分枝,叶子都是直接可解结点。 Hanoi塔演示系统的演示说明图 10 系统运行演示界面图在开始运行系统前调节盘子的数量,根据演示的需要可以选择3到12个盘子,点击加号按钮为增加盘子,点击一次曾加一个盘子,减号按钮则正好相反。调整好盘子数量以后,调整下面的速度按钮,可以根据演示需要调节演示的快慢程度,在演示开始前最下面的黑色区域显示把所有的碟移动到最合适的棍子上的字样。准备工作完备以后按开始按钮,系统则会自动演示,在演示过程中也可以调节速度来达到更好的演示效果。在演示过程中最下面的黑色区域上显示解决中的文字字样,移动框中的黑色区域显示演示的步骤,表明每一次移动在第几步实现。在演示完成后,移动框中显示总共的移动次数。最下面显示完成的字样。演示完成以后点击重新开始按钮,盘子又重新回到第一个棍子上。也可以在演示过程中点击重新开始按钮,让系统重新演示。 Hanoi塔演示系统核心代码的实现Hanoi塔演示系统代码具体实现分为六大部,分步实现初始化APPLET面板,开始程序自动解决运行线程,处理盘子移动等程序:第一部分为Hanoi主函数继承Applet通过接口实现,初始化Applet类。首先主函数Hanoi塔继承一些Applet的参数如背景颜色、Applet背景颜色、题目等。其次是对这些参数进行具体的函数定义。接下来是对整个系统的版面进行定义和规划,包括装载版面图形、初始化Applet布局,标题面版、控制面版、静态面版的设定,并且创建Applet面版等,第四步是对开始系统的设定,第五步是重新开始系统,去除所有的线程的设定,第六步是繁殖自动运行的线程和运行线程,再下面是本系统的核心递归调用的算法。算法下面则是一些鼠标移动事项的,包括处理鼠标的拉动事项,处理鼠标的向上的运动,处理鼠标的向下运动和鼠标向上向下运动的连接等。第二部分是控制时间线程,创建时间线程,运行时间线程,和以hh:mm:ss返回时间线程。主要是定义一些与时间有关的函数。第三部分是控制盘子的位置,规定盘子的运行规则,按顺序依次是创建盘子,把所有的盘子放到第一个棍子上,计算盘子的宽度,盘子的最小移动规则,人工移动和自动移动等。在这一部分我加入了自动增加盘子数量的功能,它是整个系统的特色。第四部分用双倍的缓冲器绘制面版,传递画布上的鼠标移动事件给主函数。按顺序依次为创建,绘制面版,绘制盘子,绘制盘子的拖动,设定开始时盘子为15像素高和鼠标移动处理。第五部分为主要的用户界面组件,包括创建控制面版,对盘子的定义,速度按扭的实现,时间按扭的实现,构造面版,处理按扭点机事件等。第六部分用户界面的静态信息和计数器的移动。1、 递归调用算法的实现它是Hanoi演示系统的核心算法也是整个系统的核心,实现了递归调用逻辑关系。具体的代码如下:void solve(int discs,int source,int aux,inttarget) if (discs=0) return ; solve(discs-1,source,target,aux) ;bd.moveDisc(source,target) ; sp.setMoveCount(bd.getMoveCount() ;bc.drawBoard(bd,boardImage,0,0,0) ;try solveThread.sleep(cp.getDelay() ; catch (InterruptedException e) solve(discs-1,aux,source,target) ;算法的流程图如下:Solve(dicse,source,aux,target)If (dics=(0)?Bd.move(source,target)移动最后一个盘子是否Solve (dics-1,source,target,aux) Bd.move(source,target) Solve (dics-1,aux,source,target)图11 hanoi塔递归调用程序流程图2、人工控制盘子的数量这个是我自认为满意的地方,因为他可以充分的演示Hanoi的递归原理,而在一定的范围内不受盘子的限制,由于棍子的高度和盘子的高度,本系统只能曾加盘子曾加到12个,点击加号曾加一个盘子,点击减号则减少一个盘子。这项功能代表了整个系统的特色,具体的代码实现为:discsPanel.add(West,bDiscsMinus=newButton(main.MINUS) ; bDiscsMinus.setFont(main.monoFont) ; discsPanel.add(Center,tfDiscs) ; discsPanel.add(East,bDiscsPlus=newButton(main.PLUS) ; bDiscsPlus.setFont(main.monoFont) ; discsPanel.validate() ;void setDiscs(int i) String s = Integer.toString(i) ; if (s.length()=1) s = + s ; else if (s.length()=2) s = + s ; tfDiscs.setText(s) ; 3、 开始按钮和重新开始按钮的实现这两个按钮控制整个系统的运行,点击开始按钮系统自动运行,点击重新开始按钮系统回到原位准备再次运行,其具体实现代码如下:void newGame() int discs = cp.getDiscs() ; System.gc() ; gameOver = false ; bd = new Board(discs,this) ; bc.drawBoard(bd,boardImage,0,0,0) ; sp.setMoveCount(0) ; if (cp.isTimerOn() timer = new Timer(cp) ; else cp.setTimer( ) ; if (solveThread = null) sp.setStatus(INSTRUCT) ; bc.requestFocus() ; void restartGame() stop() ; cp.setAutoSolveEnable(true) ; newGame() ; 4、 速度调节和时间按钮这个是本系统添加的一些起到修饰作用的功能按钮,可以根据自己的喜好通过拉动滚动条来确定演示速度,不仅在系统运行前可以调节,在系统运行中也可以调节,具体实现为:sbSpeed = new Scrollbar(Scrollbar.HORIZONTAL, (MAX_DELAY-delay),0,0,(MAX_DELAY-9) ; sbSpeed.setBackground(Color.lightGray) ; sbSpeed.setPageIncrement(int)(MAX_DELAY/10) ; sbSpeed.setLineIncrement(int)(MAX_DELAY/100) ; bSolve = new Button(main.SOLUTION) ; cbTimer = new Checkbox( +main.TIMER) ; cbTimer.setBackground(Color.lightGray) ; tfTimer = new TextField(10) ; tfTimer.setFont(main.monoFont) ; tfTimer.setForeground(Color.white) ; tfTimer.setBackground(Color.black) ; tfTimer.setEditable(false) ;5、 对按钮点击和拉动滚动条的处理这一部分起到激活按钮和滚动条的作用,具体实现为:public boolean action(Event e,Object o) if (main.SOLUTION.equals(o) setAutoSolveEnable(false) ; main.startSolveThread() ; else if (main.PLUS.equals(o) setDiscs(+discs) ; else if (main.MINUS.equals(o) setDiscs(-discs) ; setPlusMinusEnable() ; main.restartGame() ; return true ; public boolean handleEvent(Event e) if (e.target instanceof Scrollbar) delay = MAX_DELAY - sbSpeed.getValue() ; return true ; else return super.handleEvent(e) ; 6、 控制盘子的位置和盘子移动的规则这是Hanoi塔的实现原理的详细说明,描述的是在每一个棍子上怎么样曾加盘子和减少盘子具体实现如下:final class Board static final int PEGS=3, DISC_SIZES= 68,18,76,16,84,14,92,13,100,12, 108,12,112,11,116,10,120,9,124,9 ; private int peg, pegTop=new intPEGS, discWidth ; private int discs, moveCount, minMoves ; private Hanoi main ; Board(int discs,Hanoi main) this.discs = discs ; this.main = main ; peg = new intdiscsPEGS ; for (int i=0; idiscs; i+) pegimain.PEG1 = discs-i ; pegTopmain.PEG1 = discs-1 ; for (int i=1; i=0; i-) discWidthi = DISC_SIZESdiscs-main.MIN_DISCS0 - (DISC_SIZESdiscs-main.MIN_DISCS1 * (discs-1-i) ; moveCount = 0 ; minMoves = (int)Math.pow(2.0,discs) - 1 ; void setDisc(int d,int p) peg+pegToppp = d ; int getDisc(int d,int p) return pegdp ; int getTopDisc(int p) return p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋转让合同书
- 屋顶分布式光伏发电项目施工组织设计
- 工业互联网平台云计算资源动态分配在智慧旅游领域的应用策略报告
- 未来旅游体验:2025年主题公园沉浸式体验项目可行性研究报告
- 工业互联网平台安全多方计算技术在工业大数据分析中的应用报告
- 中医院面试题及答案详解
- 中医心血管考试题及答案
- 汽车a1理论考试试题及答案
- 智能家居软装搭配智能家居产品市场品牌传播效果评估报告
- 白居寺地理题目及答案
- 人教版2024年小学升学考试数学模拟测试卷(共5套)(含答案解析)
- 测量基础能力测试
- 光伏发电站运行规程
- 医院系统瘫痪应急预案
- 光伏项目技术标准清单
- 117湖南省怀化市雅礼实验学校2023-2024学年七年级下学期开学考试数学试题
- 水电站全套课件
- 输气管线破裂漏气应急处置方案
- 老年患者呼吸系统疾病的护理重点
- 脑卒中急救中的辅助检查与影像学应用
- 野外蚊虫叮咬预防知识讲座
评论
0/150
提交评论