C语言课程设计----汉诺塔问题.doc

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言课程设计----汉诺塔问题

沈阳航空航天大学 课 程 设 计 报 告 课程设计名称:C语言课程设计 课程设计题目:汉诺塔问题 目 录 第1章 概述 1 第2章 设计目的 2 第3章 问题分析 4 第4章 逻辑设计 5 第5章 流程图 4 第6章 程序代码 4 第7章 程序调试与测试 4 第8章 结果分析 4 参考文献 6 附 录(程序) 7 第1章 概述 数据结构是计算机学科非常重要的一门专业基础理论课程,要想编写针对非数值计算问题的高质量程序,就必须要熟练的掌握这门课程设计的知识。另外,他与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。拥有《数据结构》这门课程的知识准备,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程的都是有益的。 第2章 设计目的 《数据结构课程设计》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化与提高。因此,要求学生能综合应用所学的知识,设计与制作出具有较复杂的应用系统,并且在实验的基本技能方面进行一次全面的训练。 1.使学生能够较全面地巩固和应用课堂所学的基本理论和程序设计方法,能够较熟练的完成数据结构程序的设计与调试。 2.培养学生综合运用所学知识独立完成数据结构程序员课题的能力。 3.培养学生用于探索、严谨推理、实事求是、有错必改,用时间来检验理论,全方位考虑问题等科学技术人员应具有的素质。 4.提高学生对工作认真负责额、一丝不苟,对同学团结友爱,协作攻关的基本素质。 5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。 6.对学生掌握知识的深度。运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。 第3章 问题分析 任务:有三个柱子A, B, C. A柱子上叠放有n个盘子,每个盘子都比它下面的盘子要小一点, 可以从上到下用1, 2, ..., n编号。要求借助柱子B,把柱子A上的所有的盘子移动到柱子C上。 移动条件为:1、一次只能移一个盘子; 2、移动过程中大盘子不能放在小盘子上,只能小盘子放在大盘子上。首先容易证明,当盘子的个数为n时,移动的次数应等于2^n - 1。 首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上。 根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C; 若n为奇数,按顺时针方向依次摆放 A C B。 (1)按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B; 若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。 (2)接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。 即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘 这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。 (3)反复进行(1)(2)操作,最后就能按规定完成汉诺塔的移动。 这是个递归问题。主函数很简单,不说了,关键是那个递归函数:这里有四个参数,第一个表示移动的盘子个数,这里可以通过键盘来输入。(全部移动64个盘子需要的时间很长,千万不要输入太大的数。) x,y,z表示三根柱子。 注意参数中X,Y,Z的顺序,x表示原来的柱子,y表示在移动过程中中间过度的柱子,而z标志最后放置的柱子。下面的调用和这个次序有很大关系。 movedishes(int n,int x,int y,int z) { if(n==1) 这个最简单,如果只有一个盘子(n=1),那么只要从x柱子直接移动到z柱子就可以了。不需要中间以哦的那个其他的盘子。 如果要移动的盘子不止一个,那么就要采取一定的策略。这个策略就是先把上面的n-1个盘子移动到中间的柱子,也就是y,然后把最地下一个盘子移动到z柱子,然后再把中间柱子y上的盘子通过哦a柱子移动到z柱子上。 else { //把上面的n-1个盘子通过z柱子移动到y柱子上,这样才能把最后一个盘子移动到z柱子上。 //输出这次移动 //然后再把刚才移动出来放在y柱子上的n-1个盘子移动到z柱子上。 } 流程图 第6章 程序代码 #includestdio.h int i=0; /*记录每一步为第几步*/ void movedishes(int n,int x,int y,int z) { if(n==1) { printf( %d. %c→%c ,i+1,x,z);/*输出步骤*/ i++; if(i%7==

文档评论(0)

zhuliyan1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档