C语言课程设计#汉诺塔#
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汉诺塔动态演示
一课题分析
1.1 设计要求
在Visual c++环境下编写汉诺塔的程序并运行出汉诺塔游戏。能够改变汉诺塔塔盘的数量。可以电脑演示移动过程,也可以人为移动,并且能够控制塔盘移动速度。实现汉诺塔的简单动态演示。
1.1.1 目的
了解在开发环境中如何编辑,编译,连接和运行一个C语言程序。通过运行汉诺塔的程序,初步了解C语言程序的结构特点。掌握C语言数据类型的概念,学会使用C语言的相关运算符构成表达式。
1.1.2 背景
世界范围内信息技术迅猛发展,新的技术和方法层出不穷。C语言在计算机应用中发挥着重要作用,并且在全世界普及推广。作为当代大学生,有必要掌握和会运用C语言。
1.1.3 意义
这次课程设计,可以培养我们独立自主的学习能力,实事求是的学习态度,严谨治学的学习作风,通过实践,建立系统设计的整体思想,锻炼编写程序、调试程序的能力,学习文档编写规范,吸取他人经验、探索前言知识的习惯,树立团队协作精神。同时课程设计还可以弥补我们自身在实践时所缺少的经验。这次对于汉诺塔这个问题的研究是我在C 语言课程学习中递归函数的一次实际运用,对我的递归函数的理解会有更多的帮助。
1.2 实现功能
运用数据结构的相关知识,利用一定的算法制作出汉诺塔程序。能输入塔盘的数量(10以内)和塔盘移动速度,支持人和电脑操作,并且显示移动过程和移动次数,实现汉诺塔的动态演示。
图1 汉诺塔功能结构图
二整体设计2.1 框架设计
图2 汉诺塔流程图
三详细设计
3.1问题描述
假设有三个分别命名为A,B和C的塔座,在塔座B上插有n个直径大小各不相同、从小到大编号为1,2,…,n的圆盘。现要求将塔座B上的n个圆盘移至塔座A上并仍按同样顺序叠排,圆盘移动时必须遵守以下规则:
(1)每次只能移动一个圆盘;
(2)圆盘可以插在A,B和C中任一塔上;
(3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。
要求:用程序模拟上述问题解决办法,并输出移动的总次数,圆盘的个数从键盘输入;并想办法计算出程序运行的时间。
3.2 算法思路
3.2.1建立数学模型
这个问题可用递归法解决,并用数学归纳法又个别得出普遍解法:
假设塔座B上有3个圆盘移动到塔座A上:
(1)将塔座B上2个圆盘借助塔座A移动到塔座C上;
(2)将塔座B上1个圆盘移动到塔座A上;
(3)将塔座C上2个圆盘借助塔座B移动到塔座A上。
其中第2步可以直接实现。第1步又可用递归方法分解为:
1.1"将塔座B上1个圆盘从塔座X移动到塔座A;
1.2"将塔座B上1个圆盘从塔座X移动到塔座C;
1.3"将塔座A上1个圆盘从塔座Z移动到塔座C。
第3步可以分解为:
将塔座C上1个圆盘从塔座Y移动到塔座B;
将塔座C上1个圆盘从塔座Y移动到塔座A;
将塔座B上1个圆盘从塔座X移动到塔座A。
综上所述:可得到移动3个圆盘的步骤为
B->A,B->C, A->C, B->A, C->B, C->A, B->A,
3.2.2 算法设计
将n个圆盘由B依次移到A,C作为辅助塔座。当n=1时,可以直接完成。否则,将塔座B 顶上的n-1个圆盘借助塔座A移动到塔座C上;然后将圆盘B上第n个圆盘移到塔座A上;最后将塔座C上的n-1个圆盘移到塔座A上,并用塔座B作为辅助塔座。
3.2 运用类的介绍主类Tower
类HannoiTower
类TowerPoint
类Disk
类Time
四总结
这次对于汉诺塔的课程设计我有很多心得和体会,课程设计所设计制作出来的汉诺塔游戏总体符合设计要求,但也有一些缺点和不足,没能完全达到预期的要求。通过课程设计,我们对C语言的掌握提高到了一个新的水平,能够应用C语言编写出一个实用的程序,很大程度上提高了程序综合设计能力、分析能力和编程能力。掌握了很多新的编程技巧,积累了一些编程经验这些技巧和经验对于以后的课程都是很重要的。因此我觉得这次课程设计虽然困难不小,但收获很大。编写程序其中最重要的一个方面就是要认真,认真编写代码可。以大大减少错误的出现;其次是要有耐心,勇于克服困难,不断解决问题,面对困难要永不退缩,迎难而上;再次是要有清晰的思维,能够理清各个函数之间的关系,明确各个函数的职能;最后还要和同学多交流合作,多参考书籍。
参考文献
【01】谭浩强《C程序设计》第4版清华大学出版社 2010
【02】C语言程序设计精品课程网站汉诺塔程序设计 2012.6
【03】覃征,王志敏《程序设计方法与优化》西安交通大学出版社 2004
【04】彭四伟,赵彤洲,高巍《C语言程序设计》清华大学出版社 2002
附录
#include
#include
#include
#include
#include
struct T
{
int h; //塔的高度
int x; //塔的第一个盘的x坐标,y坐标等于(7+n-塔的高度h) int l; //塔的第一个盘的长度
}ta[3]={{10,15,2},{0,0,0},{0,0,0}};
char hnt[18][79]=
{" "},
{" 汉诺塔动画演示"},
{" "},
{" ╔════════════════════════════════════╗"},
{" ║ ║"},
{" ║ ║"},
{" ║ ║"},
{" ║ ▆║"},
{" ║ ▆▆║"},
{" ║ ▆▆▆║"},
{" ║ ▆▆▆▆║"},
{" ║ ▆▆▆▆▆║"},
{" ║ ▆▆▆▆▆▆║"},
{" ║ ▆▆▆▆▆▆▆║"},
{" ║ ▆▆▆▆▆▆▆▆║"},
{" ║ ▆▆▆▆▆▆▆▆▆║"},
{" ║ ▆▆▆▆▆▆▆▆▆▆║"},
{" ╚════════════════════════════════════╝"}};
int n;
int sum=0;
int computerorpeople=1;