黄石理工学院《数据结构》课程设计
学 号:
200840420149
课 程 设 计
汉诺塔
计算机学院
计算机
网络技术
题 目
教 学 院
专 业
班 级
姓 名
指导教师
2010 年 12 月 17 日
1
黄石理工学院《数据结构》课程设计
课程设计任务书
2009 ~2010 学年第 一 学期
学生姓名:
专业班级:
网络技术
指导教师:
工作部门: 计算机学院
一、课程设计题目
汉诺威塔
二、课程设计内容(含技术指标)
1.在移动盘子的每一步骤,形象直观地显示各针上的盘子。
2.考虑到学“VC 语言”课程的学生同时学习了“数据结构”课程,所以用
灵活的数据结构解决汉诺威塔问题,灵活的处理数据结构中的经典问题。
3.使用 VC++,因用面向对象的方法去处理数据结构已经是当今的潮流。
三、进度安排
1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;
2. 完成最低要求:实现 5 层汉诺威塔的调整过程;
3.进一步要求:直至实现 n=9 时的情况。
四、基本要求
1.界面友好,函数功能要划分好
2.总体设计应画流程图
3.程序要加必要的注释
4.要提供程序测试方案
5.程序一定要经得起测试,宁可功能少一些,也要能运行起来。
教研室主任签名:
2010 年 12 月 17 日
2
黄石理工学院《数据结构》课程设计
目录
1、概述.......................................................................................................3
2、设计目的...............................................................................................4
3、问题分析...............................................................................................4
4、逻辑设计...............................................................................................5
5、流程图...................................................................................................5
6、程序代码:...........................................................................................6
7、程序调试与测试...................................................................................9
8、结果分析.............................................................................................12
9、总结.....................................................................................................13
一、概述
数据结构是计算机学科非常重要的一门专业基础理论课程,要想编写针对非数值计算问
题的高质量程序,就必须要熟练的掌握这门课程设计的知识。另外,他与计算机其他课程都
有密切联系,具有独特的承上启下的重要位置。拥有《数据结构》这门课程的知识准备,对
于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程的都是有益的。
3
黄石理工学院《数据结构》课程设计
二、设计目的
《数据结构课程设计》课程设计是在教学实践基础上进行的一次大型实验,也是对该课
程所学理论知识的深化与提高。因此,要求学生能综合应用所学的知识,设计与制作出具有
较复杂的应用系统,并且在实验的基本技能方面进行一次全面的训练。
1.使学生能够较全面地巩固和应用课堂所学的基本理论和程序设计方法,能够较熟练的
完成数据结构程序的设计与调试。
2.培养学生综合运用所学知识独立完成数据结构程序员课题的能力。
3.培养学生用于探索、严谨推理、实事求是、有错必改,用时间来检验理论,全方位考
虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责额、一丝不苟,对同学团结友爱,协作攻关的基本素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决
问题的新途径的悟性,初步培养工程意识和创新能力。
6.对学生掌握知识的深度。运用理论去处理问题的能力、实验能力、课程设计能力、书
面及口头表达能力进行考核。
三、问题分析
任务:有三个柱子 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;
4
黄石理工学院《数据结构》课程设计
若圆盘 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)
printf(" %d. %c→%c ",i+1,x,z);
这个最简单,如果只有一个盘子(n=1),那么只要从 x 柱子直接移动到 z 柱子就可以了。
不需要中间以哦的那个其他的盘子。
如果要移动的盘子不止一个,那么就要采取一定的策略。这个策略就是先把上面的 n-1 个
盘子移动到中间的柱子,也就是 y,然后把最地下一个盘子移动到 z 柱子,然后再把中间柱子
y 上的盘子通过哦 a 柱子移动到 z 柱子上。
else
{
movedishes(n-1,x,z,y);//把上面的 n-1 个盘子通过 z 柱子移动到 y 柱子上,这样才能把最后
一个盘子移动到 z 柱子上。
printf(" %d. %c→%c ",i+1,x,z); //输出这次移动
movedishes(n-1,y,x,z);
上。
}
//然后再把刚才移动出来放在 y 柱子上的 n-1 个盘子移动到 z 柱子
}
五、流程图
5
1、是
黄石理工学院《数据结构》课程设计
开始
输入 m(m<=9)
输出结果
是否继续?
结束
六、程序代码:
2、否
#include
int i=0;
/*记录每一步为第几步*/
void movedishes(int n,int x,int y,int z)
{
if(n==1)
{
6
黄石理工学院《数据结构》课程设计
printf(" %d. %c→%c ",i+1,x,z);/*输出步骤*/
i++;
if(i%7==0)/*每行显示七个*/
printf("\n");
movedishes(n-1,x,z,y);/*把 a 杆上 n-1 个盘子设法借助 c 杆移动到 b 杆*/
printf(" %d. %c→%c ",i+1,x,z);/*输出步骤*/
i++;
if(i%7==0)
printf("\n");
movedishes(n-1,y,x,z); /*把 b 杆上的 n-1 个盘子借助 a 杆移动到 c 杆*/
}
else
{
}
}
main()
{
int m,j=1;/*m 记录需要移动盘子的数目,j 记录循环条件*/
printf("_________________________________ 欢 迎 使 用 本 系 统
______________________________\n");
printf("
|
|
\n");
|
7
黄石理工学院《数据结构》课程设计
printf("
printf("
printf("
printf("
printf("
a
printf("
printf("
printf("
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
b
|
|
|
|
|
|
|
|
c
printf("
_______________
________________
_______________
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
\n");
while(j==1)
{
printf(" 请输入 a 上盘子数:\n");
scanf("%d",&m);
printf(" 移动顺序:\n");
movedishes(m,'a','b','c');
printf("\n 是否继续:\n1.是\n2.否\n");
8