汉诺塔课程设计论文.doc_第1页
汉诺塔课程设计论文.doc_第2页
汉诺塔课程设计论文.doc_第3页
汉诺塔课程设计论文.doc_第4页
汉诺塔课程设计论文.doc_第5页
免费预览已结束,剩余34页可下载查看

下载本文档

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

文档简介

淮阴工学院C+程序设计课程设计报告选题名称: 汉 诺 塔 系(院): 计算机工程系 专 业:计算机科学与技术(网络工程方向)班 级: 网络1071 姓 名: 孟永吉 学 号: 1071304115 指导教师: 戴峻峰 学年学期: 2007 2008 学年 第 2 学期2008年 06 月 14 日设计任务书课题名称汉诺塔设计目的1. 调研并熟悉汉诺塔的基本功能、数据流程与工作规程;2. 学习汉诺塔的非递归算法和基于VC+集成环境的编程技术;3. 通过实际编程加深对基础知识的理解,提高实践能力;4. 学习开发资料的收集与整理,学会撰写课程设计报告。实验环境1. 微型电子计算机(PC);2. 安装Windows 2000以上操作系统,Visual C+6.0开发工具。任务要求1. 利用课余时间去图书馆或上网查阅课题相关资料,深入理解课题含义及设计要求,注意材料收集与整理;2. 在第15周末之前完成预设计,并请指导教师审查,通过后方可进行下一步工作;3. 本课题主要实现用两种方法,递归和非递归方法实现盘子的移动;要求输入盘片数目,显示移动过程及结果。4. 结束后,及时提交设计报告(含纸质稿、电子稿),要求格式规范、内容完整、结论正确,正文字数不少于3000字(不含代码)。工作进度计划序号起止日期工 作 内 容12008.06.092008.06.10在预设计的基础上,进一步查阅资料,完善设计方案,形成书面材料。22008.06.102008.06.11设计总体方案,构建、绘制流程框图,编写代码,上机调试。32008.06.112008.06.13测试程序,优化代码,增强功能,撰写设计报告。42008.06.142008.06.14提交软件代码、设计报告,参加答辩,根据教师反馈意见,修改、完善设计报告。指导教师(签章): 年 月 日 摘要:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上到下用1, 2, ., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上;要求编写程序打印出移动盘子的步骤。编写代码,用递归解法和非递归解法解决盘子的移动问题对于“汉诺塔”问题的解法,主要有:递归法和非递归法,而递归法是人们用了最多的,因为它既简单又易懂。以下是我做的一些工作:(1)课题综述(课题来源,意义,预期目标,面对的问题,需要解决的关键技术)。(2)需求(系统)分析(知识基础,解题的基本思路,总体方案,功能模块框图)。(3)设计模块和算法(算法描述,实现方法,详细流程图)。(4)编辑代码(主要模块的代码分析)。(5)收集参考资料(主要从图书馆和网上获取)。关键词:汉诺塔;递归思想;函数调用;非递归思想;基本控制结构;数组;指针目 录1课题综述41.1 课题描述及任务要求41.2 课题来源、意义51.3预期目标51.4面对的问题51.5需解决的关键技术62 需求(系统)分析62.1涉及的知识基础62.2解决问题的基本思路102.3总体方案103模块及算法设计113.1算法描述113.2详细流程图154 代码编写185 程序调试23总结26致谢28参考文献30附录311课题综述1.1 课题描述及任务要求有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点,可以从上到下用1, 2, ., n编号。要求借助柱子C,把柱子A上的所有的盘子移动到柱子B上。移动条件为:1、一次只能移一个盘子;2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。要求编写程序打印出移动盘子的步骤。图1.1 汉诺塔的初始模型设计要求:编写代码,用两种方法解决盘子的移动。运行程序后,显现下面的参考界面:汉诺塔= = = = = = = = = = = = = = = = = = = = = = = = = = = = =1 递归解法2 非递归解法 请选择(1或2,0:退出)图1.2 汉诺塔初始界面1.2 课题来源、意义汉诺塔问题(也被称为梵塔问题或河内塔问题)在几乎任何一种计算机高级程序设计语言的书籍中,都用作解题的典型例子,因此已广为人知。曾有笔者1980年在德国做访问学者时,在一个德国朋友家中曾见过这种梵塔智力玩具,可见他在国外已深入到家庭之中。汉诺塔问题起源于中东地区的一个古老的传说:在梵城地下有一个僧侣的秘密组织,他们有3个大型的塔柱,左边的塔柱上由大到小套这64个金盘。僧侣们的工作是要把这64个金盘从左边塔柱转移到右边塔柱上去。但转移过程有严格规定,即每次只能搬动一只盘子;盘子只能在3个塔柱上安放,不允许放地上去;在每个塔柱上,只允许把小盘子叠在大盘子上,而不允许大盘子压在小盘子上。据传说,僧侣们完成这个任务时,世界的末日就来临了。19世纪的法国大数学家鲁卡曾经研究过这个问题,他正确地指出,要完成这个任务,僧侣们搬动金盘的总次数(把1个金盘从某个塔柱转移到另1个塔柱叫做1次)为:18,446,744,073,709,551,615次。假设僧侣们个个身强力壮,每天24小时不知疲倦地不停工作,而且动作敏捷快速,1秒钟就能移动1个金盘,那么,完成这个任务也得花5800亿年!1.3预期目标 通过在编写汉诺塔的程序代码的过程中,来了解汉诺塔的本质与历史,来巩固和加深对C+这一门课程的了解和兴趣,并且熟悉上课所学的东西,更能够通过去图书馆个上网查阅资料来学到很多课外的东西。1.4面对的问题 汉诺塔问题是一个古老而又具有历史意义的问题,要通过C+程序来做的话,就回面临很多大大小小问题,在这一过程中,我主要面临的问题有: 递归方法的详细解释 非递归方法的理解 WORD编排方面的小问题这些问题,我通过查阅资料,询问老师,与同学讨论,都基本得到解决。在着一过程中,我对C+这一课程有了更加深刻的了解。并且对所学的知识掌握的更加深刻。1.5需解决的关键技术Word编辑与排版Visual C+ 6.0的运行与调试图象的截取 C+程序设计的相关内容2 需求(系统)分析2.1涉及的知识基础2.1.1分支结构if语句if 语句也称条件语句,其功能是根据给定的条件选择程序的执行方向。IF语句的基本格式为:if(表达式) 语句1;else语句2;其中的表达式为条件表达式,他可以是C+中的任意合法表达式,如算术表达式,关系表达式,逻辑表达式或逗号表达式。表达式的值非0,即为“真”;为0则为“假”。语句1和语句2称为内嵌语句,在语法上各自表现为一条普通语句,可以是普通语句,也可以是复合语句,还可以是空语句。当条件语句的内嵌套语句是条件语句时,称为嵌套的条件语句.if语句可以解决二分支问题,那么通过嵌套if语句则可以解决多分之支问题。嵌套if语句有两中形式。一种是嵌套在else分支中,格式为:if( 表达式子1 ) 语句1;else if( 表达式2 ) 语句2;else ifelse 语句n; 第二种是嵌套在if分支中,格式为:if( 表达式子1 )if( 表达式2 ) 语句1; else 语句2;else 语句3;2.1.2 分支结构switch语句switch语句又称开关语句,也可用来实现多分支。它根据给定条件从多个分支语句序列中选择一个作为执行入口。格式为: switch(表达式) case 常量表达式1: case 常量表达式2: case 常量表达式n:其中,是任何一符合C+语法规则的表达式,但表达式的值只能是字符型或是整型;只能由常量所组成的表达式,其值也孩子能是字符型常量或是整形型常量;任何一个均是任选择的,它可以是由一个湖哦多个语句组成;关键字 break也是任意选择的。开关语句的执行过程:先求出表达式的值,再依次与case后面的常量表达式比较,若与某一常量表达式的值相等,则转去执行该case后面的语句序列,一直执行下去,直至遇到语句或开关语句的闭括号为止.若表达式的只与case后面的任何一常量表达式的蚶子不等,若有default分支,则执行该分支后面的语句序列,否则什么也不执行.关于switch语句,有几点需要注意: 各个case (包括default)分支出现的次序可以是任意的,通常将default放在最后。 break语句可选,如果没有 break语句,则每一个 case分支都只做为 switch语句的执行入口,执行完该分支后,还将继续执行其后的所有分支。 每个常量表达式的取值必须各不相同,否则将引起歧义。 允许多个常量表达式对应同一个语句序列。 从形式上看,switch 语句的可读性比嵌套if语句好,但不是所有的多分支问题都可用 switch语句来完成,这是因为 switch语句中限定了条件表达式的取值只能是开关量不能是连续量。在有些情况下,尽管条件条件表达式本本身不符合数据类型的要求,但经过处理后仍可用switch语句来实现。2.1.3 数据类型规定了函数返回值的类型。当执行函数体中的语句后,通常会产生一个结果,这就是函数的返回值,它可以是任何有效类型。如果函数执行后不返回值,数据类型习惯用void来表示。如果在函数定义时没有数据类型出现,则默认表示函数返回一个整数值(int)。2.1.4 函数调用在C+中,除了主函数main()外,任何一个函数均不能单独构成一个完整的程序,任何一个函数的执行(函数调用)都必须又main()直接或间接地调用该函数,来完成实现。调用一个函数就是把控制转去执行该函数的函数体。当函数有返回值,函数调用可以出现在表达式中,并且把执行函数体后返回的值参与表达式的运算或把返回的值赋给一个变量。函数调用也可以作为一个函数调用语句来实现,即在以上调用的格式后加一个分号,构成函数调用语句。对于没有返回值的函数,函数调用只能同过函数调用语句来实现。函数的嵌套和递归调用:在定义一个函数时,C+语言不允许在其函数体内再定义另一个函数,任何一个函数的定义均是独立的。函数之间都是平等的,平行的。函数之间的嵌套调用是可以的,即在调用一个函数时,在函数体内又调用另一个函数。当在一个函数A的定义中出现调用函数A的情况时,或在A的函数定义过程中调用B函数,而在B的定义过程又调用了A的函数。这种调用关系称为调用递归。前一种情况是直接递归,后一种情况称为间接递归。在设计递归程序时,通常是先判断递归结束条件,再进行递归。在使用递归方法的设计程序时,在递归程序中一定要有递归结束条件;否则,在执行程序时,则会产生无穷尽的递归调用。2.1.5 指针和数组 数组 是一种顺序容器,是单一类型元素组成的一个有序集合。例如,为了定义和初始化一个数组以存放Fibonacci数列的前10个数,可以这样定义一个数组:Int fibon10=0,1,1,2,3,4,8,12,21,32;其中,数组名为fibon,这是一个包含10个元素的整型数组。需要注意的是: 数组是一种组合类型,它是不能作为一个整体进行访问和处理的,只能按元素进行个别访问和处理。 C+数组中的第1个元素的下标为0,而不是1,且下标表达方式是固定的。 数组元素在内存中是从低地址开始顺序排列的,各元素的存储单元的其始地址计算出任一个元素的存储单元的其始地址。 C+不对数组的边界进行检测,定义一个int fibon10,只分配了10个数组元素的储存单元,可是当在程序访问fibon12时,系统不会发现错误。数组使用是否出界完全是由程序员来控制的指针是一种按变量的地址直接存取变量方法的“直接访问”方式。存储该变量的内存空间的首地址称为该变量的地址。指针类型变量的定义语句格式如下: 类型 *变量名1;其中,“*”是一个定义变量为指针类型的说明符,而不是指针变量的一部分。“*”前后可以加空格,也可不加。必须指出,定义时每一个指针变量都需要一个指针变量说明符。例如: int *lp1, *lp2;如果写成 int *lp1, lp2;则编译器认为lp2是整型变量,只有lp1是指向整型变量的指针变量。指针与数组联系 在C+中指针与数组有着密切的联系.可用指针来访问数组中任何一个元素.数组的起始地址称为数组的指针,而把指向数组元素的指针变量称为指向数组的指针变量.使用数组的指针变量来处理数组中的元素,不仅可使程序紧凑,而且还可以提高程序的运行速度.用指针访问数组的元素,在C+中,当说明了一个数组后,数组名可以作为一个指针来使用,它的值为整个数组的起始地址,即数组的第0个元素的起始地址.但数组名不同与指针变量,编译程序要为指针变量分配内存空间.而编译程序并不为数组名分配内存空间,只是为每一个数组的元素依次分配一片连续的内存空间.因此,在程序中,可以把数组名作为指针来使用,但不能对数组名进行赋值, “+运算或”-运算”2.2解决问题的基本思路汉诺塔是一个具有历史意义的问题,要解决这一问题,必须先了解汉诺塔的历史由来。我通过上网查阅资料解决了这一问题。题目要求中要用两种方法来处理,一种是递归的方法,这种方法很好理解,正好可以处理汉诺塔这种有重复操作的问题。而另一种是非递归,对于这一方法我没有任何思路,我是通过努力查阅资料来获取代码的,并且翻阅书本来理解它,C+课程设计用到最多的就是书本了,在制作的过程中,我不断的翻阅书本,把一些主要知识都复习了几便。使自己的C+语言知识得到巩固。2.3总体方案请输入一个数(0,1,2或其他)输入0 输入1 输入2 输入其他退出递归解法非递归解法输入错误!重新输入!图2.1 总体方案当在主菜单时,会有3个输入选项,但会有4种输入方法。当输入0时,就会执行退出的程序。当输入1时,就会执行递归的解法的程序。当输入2时,就会执行非递归的解法的程序。当输入其他数字时,系统就会提示“输入错误,重新输入”,从而执行重新输入的程序。3模块及算法设计3.1算法描述3.1.1汉诺塔递归讲解设A上有n个盘子。 如果n=1,则将圆盘从A直接移动到C。 如果n=2,则: 1.将A上的n-1(等于1)个圆盘移到B上; 2.再将A上的一个圆盘移到C上; 3.最后将B上的n-1(等于1)个圆盘移到C上。 如果n=3,则: A. 将A上的n-1(等于2,令其为n)个圆盘移到B(借助于C),步骤如下: (1)将A上的n-1(等于1)个圆盘移到C上。 (2)将A上的一个圆盘移到B。 (3)将C上的n-1(等于1)个圆盘移到B。 B. 将A上的一个圆盘移到C。 C. 将B上的n-1(等于2,令其为n)个圆盘移到C(借助A),步骤如下: (1)将B上的n-1(等于1)个圆盘移到A。 (2)将B上的一个盘子移到C。 (3)将A上的n-1(等于1)个圆盘移到C。 到此,完成了三个圆盘的移动过程。 从上面分析可以看出,当n大于等于2时,移动的过程可分解为三个步骤: 第一步 把A上的n-1个圆盘移到B上; 第二步 把A上的一个圆盘移到C上; 第三步 把B上的n-1个圆盘移到C上;其中第一步和第三步是类同的。 当n=3时,第一步和第三步又分解为类同的三步,即把n-1个圆盘从一个针移到另一个针上,这里的n=n-1。 显然这是一个递归过程。这种解法可以一直递归下去,直到变成移动一个盘子时,递归结束。以上3个步骤可以分为2类操作:第一类,是将m(m1)个盘子从第一根柱子移动到另一根柱子,这是一个递归的过程,第二类操作是将第一根柱子上的一个盘子移动到另一根柱子上。主程序采用递归方式;认真看了下面的思想,应该会明白的: 首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了: 1将上面的63个盘子移到b杆上; 2将a杆上剩下的盘子移到c杆上; 3将b杆上的全部盘子移到c杆上。 将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子.的工作。 为了更清楚地描述算法,可以定义一个函数hanoi(n,a,b,c)。该函数的功能是:将N个盘子从A杆上借助C杆移动到B杆上。这样移动N个盘子的工作就可以按照以下过程进行:第一次调用递归 图3.1第一次调用递归 将一个盘子从A移动到B上;图3.2 将一个盘子从A移动到B上第二次调用递归图3.3 第二次调用递归重复以上过程,直到将全部的盘子移动到位时为止。对于汉诺塔问题的解决,一般采用递归的方法解决,比较容易分析和实现。现在我们采用非递归的思想对其进行分析。首先测试递归程序,分析移动的盘子的号数和盘子每一次移动的方向。1分析盘子移动的基本规律:通过对递归程序的测试,我们不难得出n个盘子的移动序列.对于n个盘子,总共需要移动2n-1。对于推论我们可以很容易通过数学归纳法进行证明(证明过程略)。通过刚才的分析我们可以随机得到某一步所移动的盘子。2分析盘子的移动方向:对递归程序的测试可以发现,在盘子总数为n的情况下,1号盘子的移动方向总是一定的,也就是说,总是按照1-2-3-1或者1-3-2-1的方向移动,从而想到是否所有的盘子的移动方向也总是一定的。再次进行测试,又可以发现,奇数号盘子的移动方向都相同,同样偶数号盘子的移动方向也相同,而奇数号和偶数号盘子的移动方向正好相反。进一步发现盘子的移动方向是由盘子总数n决定的,n为偶数时奇数号的盘子向右移动,偶数号的向左移动;n为奇数时奇数号的盘子向左移动,偶数号的向右移动。例如最大号的盘子,它总是只移动一次,并且是从1号柱子移到3号柱子。也可以用数学归纳法进行证明。3通过上面的分析,我们已经得到了盘子移动序列和每个盘子的移动方向,而每个盘子的起始状态都是相同的,都在1号柱子上,这样就可以随机取得某一步移动的具体情况了。这取决于n和k的奇偶性。3.1.2汉诺塔非递归讲解Hanoi塔问题移动次数的递推公式: 令h(n)表示n个圆盘所需要的转移次数,根据递归的算法,先把前面的n-1格盘子转移到B上,然后把第n个盘子转移到C上,最后再一次将B上的n-1个盘子转移到C上, 于是有: h(n)=2h(n-1)+1, h(1)=1, (1) 下面利用母函数来解上面的递归式: 设母函数 H(x)=h(1)x+h(2)x2+.+h(n)xn+., (2) 将H(x)和-2xH(x)相加得到: (1-2x)H(x) = h(1)x+h(2)-2h(1)x2+h(3)-2h(2)x3+. 根据递归式(1)可以得到h(2)-2h(1) = 1, h(3)-2h(2)=1,. 于是: (1-2x)H(x) = x+x2+x3+.=x/(1-x) 整理得到: H(x)= x/(1-x)(1-2x) (3) 我们可以将H(x)化为: H(x) = 1/(1-2x) - 1/(1-x) = (1+2x+(2x)2+(2x)3+.) - (1+x+x2+.) =(2k-1)xk, k=1,2,. (4) 比较(2)(4)得到: h(k) = 2k-1 也就是说,对于n个盘子,必须移动2n-1次才可以算法要点有二:1、确定哪一个盘子要移动。有n个盘子的汉诺塔需要移动2n -1次,设m为n位的二进制数,则m的取值范围为02n -1。让m每次递增1,可以发现,m中最低一位的刚刚由0变为1的位置的位置编号,和即将要移动的盘子编号有确定关系。 2、这个盘子往哪个柱子上移(1)第一次需要移动1号盘,n为奇数时,1号盘首先移动到柱子b,为偶数时首先移动到柱子c。 (2)接下来如果移动的盘子不是1号盘。你有两个柱子可以选择。先找到1号盘所在的柱子,因为移动的盘子不能叠放到1号盘上,所以该盘可以移动的位置就是没有1号盘的那个柱子。 (3)如果移动的盘子是1号盘。也有两个柱子可以选择。找到1号盘原先是从哪个柱子上移来的,因为移动的顺序(顺时针或逆时针)一旦确定,就不会更改,所以排除原来的那个柱子后,移动方向也就唯一了。总体方案:先定义递归函数和非递归函数,后调用使用.用switch循环语句,case条件语句实现选择.当按1时,实行递归函数,当按2时,实行非递归函数.当按0时,则退出运行,当按其他数字时,则要重新输入。3.2详细流程图开始输入0输入1输入2输入其他退出请输入n请输入n输入错误重新输入非递归解法n等于1从A移到CY结束N将A上面的n-1个盘通过C 移动到B把A上的第n个盘移到C上把B上的n-1个盘通过A移到C图3.4 总流程图4 代码编写#include#include#include#define maxn 10000#includeint n;void move(char,char);void hanoi1(int,char,char,char);int output1();void hanoi2(int n);void output2();void main()b:coutsetw(40)汉诺塔endl;coutsetw(47)=endl;coutendl;coutsetw(42)1. 递归解决endl;coutsetw(44)2. 非递归解决endl;coutendl;coutsetw(50)请选择(1 或2, 0 :退出):endl;a:int m; /a为语句标号coutm;cout-endl; switch(m) /用switch语句处理分支情况 case 1: output1(); /执行第一种递归方法汉诺塔程序 cout-endl; goto b; case 2: output2(); /执行第二种非递归方法汉诺塔程序 cout-endl; goto b; case 0: break; /跳出switch语句 default: cout输入有误!请重新输入!endl; goto a; /跳到语句标号为a处开始执行程序 int output1() /递归方法的汗诺塔int n;cout您选择了递归的方法。endl;cout-endl;cout请输入盘子数:n;hanoi1(n,1,2,3); /调用递归函数用于输出coutendl;return 0; /终止函数执行,返回调用单元void hanoi1(int n,char a,char b,char c)if(n=1)move(a,c); /只有一个盘时,直接将A柱上的盘移动到C柱elsehanoi1(n-1,a,c,b); /把A柱上N-1个盘借助于C柱,按规则移动到B柱(一次递归调用)move(a,c); /把A柱上留下的(最大盘)移动到C柱hanoi1(n-1,b,a,c); /把B柱上N-1个盘借助于A柱移动到C柱(又一次递归调用)void move(char a,char c) /move函数,有于输出开始柱与目标柱cout从 柱a柱ct;void hanoi2(int n) /非递归方法的汗诺塔int step_1,step_2; /定义将要行进的步数 /初始化int *han=new int*3; /定义一个指向指针的指针,并且指向3个指针域,代表3个柱子han0=new intn+1; han1=new intn+1; han2=new intn+1; /3个指针都各自指向n+1个指针域 han00=maxn;han10=maxn;han20=maxn;for(int count=1;count=n;count+)han0count=n-count+1;han1count=0;han2count=0; /初始化完毕if(n%2!=0)step_2=2;step_1=1;else step_2=1;step_1=2; /判断奇数盘的步数和偶数盘的步数int from,to;from=0;to=step_2+from;han0=&han0n; /将han0n的地址赋给han0while(*(han0) != *(han1) cout从 柱from+1柱to+1t; *(+hanto)=*(hanfrom); /将hanfrom的地址赋给hanto所指的下一个指针域*(hanfrom-)=0; /将0赋给hanfrom所指的上一个指针域 /以下求得下一步将要From移动的柱子switch(to)case 2:if(*(han0) *(han1)from=0;else from=1;break;case 1: if(*(han0) *(han2)from=0;else from=2;break;case 0: if(*(han2) *(han1)from=2;else from=1;break; /以下一行求得下一步将要移动到的柱子if(*(hanfrom)%2)!=0)to=(from+step_2)%3);else to=(from+step_1)%3); void output2()int n;cout您选择了非递归的方法。endl;cout-endl;cout请输入盘子数:n;hanoi2(n);coutendl;5 程序调试当输入0时,为退出:图4.1 退出时的运行图当选择0时,主函数调用退出的程序。当输入1时,为递归方法的汉诺塔:图4.2 递归方法的运行图当选择1时,主函数调用函数output1(),执行递归解法。在递归解法中又调用函数hanoi1来实现递归解法。当输入2时,为非递归方法的汉诺塔:图4.3 非递归方法的运行图当选择2时,主程序调用函数output2,然后在函数output2中,又分别调用函数hanoi2以实现非递归解法。当输入其他数字时,将会返回和重新输入:图4.4 输入错误时的运行图当输入0.,1,2以外的数时,主程序将提醒出“输入有误,请重新输!”。总 结一个多礼拜中,我有过山穷水尽的困惑;有过柳暗花明的惊喜;有过唇枪舌剑的辩论;有过相互鼓励的安慰。一个多礼拜的时间我们经历了很多,也收获了很多。与其说它是体力与脑力的作业,不如说它是合作精神和毅力的考验。经过这次课程设计,我不仅学到了很多知识和技能,更重要的是我们学会了如何运用所学知识去解决实际问题.C+语言课程设计和现代计算机技术的实际应用相结合,是我在本阶段学完理论课程之后对自己该方面的能力的一次很好的检验,从开始的算法思路到运行调试后的美观的运行结果界面以及另人兴奋的可用程序,都是一个很好的学习和锻炼的过程。使我们巩固了原有的理论知识,培养了我灵活运用和组合集成所学过知识及技能来分析、解决实际问题的能力。使我体会到自身知识和能力能在实际中的应用和发挥。不但可以激发创新意识,还可以开发创造能力、培养沟通能力。这次实习时间虽然仅有一个星期,但确实使我受益非浅。通过实习我丰富了计算机操作经验,更加深了对C+语言的了解,熟悉了其环境,更增强了对 C+语言的使用技巧。汉诺塔是个不错的数学游戏,由于问题的有趣,所以能很好地提高参与者地热情与兴趣。现在汉诺塔也被运用于很多智力游戏中,我们在玩手机游戏的时候,也会锻炼一下自己的脑力。汉诺塔也很好的体现了数学的递归思想和非递归用法。设计汉诺塔程序,充分了解汉诺塔问题的本质以及怎样移动盘子。认真看课本的方法,还能对平时上课的内容得到巩固和熟练。对于C+知识更好的掌握。例如:if else的条件语句,开关语句和循环语句有了更熟练的掌握。而对于函数中的数据类型和函数调用和嵌套,理解更深刻了,值得注意的是,函数在运用中需要细心,前后要一致对应。先定义后使用,这一点很重要。我在编写程序时,感触很深。但当函数的定义在主函数的后面,则这中情况是函数调用在前,而函数使用在后。这时,在主函数中,应该增加函数的原型说明。总之,在着一次课程设计中,我得到了以下几点收获:一、 对实验原理有更深的理解 通过编写C+汉诺塔的课程设计,掌握了C+一些基本的操作,编写汉诺塔程序工作的基本过程及其各阶段的基本任务,熟悉了编写汉诺塔程序总流程框图,了解了汉诺塔的生成过程、构造工具及其相关的技术,对课本上的知识有了更深的理解,课本上的知识师机械的,表面的。通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解。 二、 对该理论在实践中的应用有深刻的理解 通过把汉诺塔递归和非递归算法的内容,算法的执行顺序在计算机上实现,知道和理解了该理论在计算机中是怎样执行的,对该理论在实践中的应用有深刻的理解 。 三、 激发了学习的积极性 通过该课程设计,全面系统的理解了汉诺塔程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机C+语言的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对于C+的一些语言知识的认识是模糊的,概念上的。现在通过自己动手做实验,从实践上认识了C+系统是如何运行程序的,对汉诺塔原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意指针,将不必要的命令去除。 在这次课程设计中,我就是按照实验指导的思想来完成。加深了理解文件系统的内部功能及内部实现,培养实践动手能力和程序开发能力的目的。 致 谢高中的教育模式化倾向太强,整齐划一的教育模式使学校变成“工厂”,学生成为统一式模子加工出来的“标准件”。但大学的程序设计实践课促进我们的个性充分、健康地发展,最大限度地激发我们的学习热情和创造热情。我可以说若你一一欣赏我们的设计,你一定会眼花缭乱,因为它们各种各样、各有千秋。并且,它无形中促进我们自主学习,使我对C+语言有了更深刻地了解,对程序设计有了更高的操作水平。C+语言是一门深奥的语言,我从一开始的懵懂到现在的有点理解可以说和老师的教导分不开的。虽然俗语说师傅领进门,修行靠自身。但是师傅的作用还是不可取代的。于老师是我的老师,和他在一起的时候没有那种隔阂感,这也是我能好好学习的基础吧。这次课程设计不光光是我一个人的研究成果,在设计的过程中得到了很多人的帮助,没有这些人的帮助我或许可以完成但一定会花费更多的时间和精力。我要感谢我们 C+ 程序设计的任课老师于老师,他上课认真负责,在上课的时候给我们很多机会上台去锻炼编程的能力,虽然我只有1次上台编程的机会,但仍使我受益匪浅,于老师讲课比较仔细,很多时候会拓展开去,在平时的上机操作的时候也会给我们提一些有用的建议,帮助我们纠正错误。我还要感谢我们的课程设计的指导老师戴峻峰老师,在编写程序的时候会有很多的语句不太明白,有些可以自己查阅资料得到解决,但有些却不知道怎么修正,指导老师会适时纠正,不是直接的说明而是间接的引导,结合书上的知识概念给我们讲解,使我们更好的理解。我要感谢跟我一起做汉诺塔的一些同学,他们给我提了一些很宝贵的意见,有些自己不能解决又没有问老师的问题就会请教同学进行解决。最后感谢淮阴工学院计算机工程系和参考文献的原作者。计算机工程系给我这次课程设计提供了上机实践的机会,让我在实践中去发现C+语言功能的强大,使我在实践中得到提高。参考文献给了我很好的理论知识上的帮助,他同时也让我增长了很多知识,使我受益匪浅。通过这次实践我明白:人是在与他人交往中认识世界,在交流中不断调整和修正自己的错误,从而使之更全面,更透彻。这套运算器的程序都由我们自己互相帮助,经过无数次的修改而成,老师只是辅导。我们知道老师不再是全知全能的权威,不再是知识的来源,他们只是学生的协作和促进者,只有我们才是学习的主人。参 考 文 献1吴鹤岭.幻方及其它-数学经典娱乐名题.北京:科学出版社,20012吴乃陵,况迎辉.C+程序设计(第2版).北京:高等教育出版社,20073于长辉.淮阴工学院 C+程序设计课程设计指导书.淮安:淮阴工学院,20084张勇,杨喜权,刘君义.数据结构.北京:中国林业出版社,20065唐全.C/C+程序设计教程.上海:上海交通大学出版社,2004 6于永彦.淮阴工学院 C+程序设计实验指导书.淮安:淮阴工学院,2008附 录#include#include#include#define maxn 10000#includeint n;void move(char,char);void hanoi1(int,char,char,char);int output1();void hanoi2(int n);void output2();void main()b:coutsetw(40)汉诺塔endl;coutsetw(47)=endl;coutendl;coutsetw(42)1. 递归解决endl;coutsetw(44)2. 非递归解决endl;coutendl;coutsetw(50)请选择(1 或2, 0 :退出):endl;a:int m; /a为语句标号coutm;cout-endl; switch(m) /用switch语句处理分支情况 case 1: output1(); /执行第一种递归方法汉诺塔程序 cout-endl; goto b; case 2: output2(); /执行第二种非递归方法汉诺塔程序 cout-endl; goto b; case 0: break; /跳出switch语句 default: cout输入有误!请重新输入!endl; goto a; /跳到语句标号为a处开始执行程序 int output1() /递归方法的汗诺塔int n;cout您选择了递归的方法。endl;cout-endl;cout请输入盘子数:n;hanoi1(

温馨提示

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

评论

0/150

提交评论