当前位置:文档之家› C语言课程设计#汉诺塔#

C语言课程设计#汉诺塔#

汉诺塔动态演示一课题分析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<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>#include<math.h>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;void count_ta_1(int ta_1){int i;int j;int k=0;for(i=7;i<7+n;i++)for(j=4+ta_1*24;j<28+ta_1*24;j++){if(hnt[i][j]!=' '){for(;hnt[i][j+k]!=' ';k++);ta[ta_1].x=j;ta[ta_1].l=k;return;}}}void move(int ta_1,int ta_3){int i;sum++;ta[ta_3].h++;ta[ta_3].x=ta[ta_1].x+(ta_3-ta_1)*24;ta[ta_3].l=ta[ta_1].l;for(i=0;i<ta[ta_1].l;i++){hnt[7+n-ta[ta_3].h][ta[ta_3].x+i]=hnt[7+n-ta[ta_1].h][ta[ta_1].x+i];hnt[7+n-ta[ta_1].h][ta[ta_1].x+i]=' ';}ta[ta_1].h--;count_ta_1(ta_1);system("cls");for(i=0;i<7+n;i++)printf("%s\n",hnt[i]);printf("%s",hnt[17]);printf("\n\n 从%c塔移动一个盘到%c塔\n",ta_1+65,ta_3+65);printf("\n 步数:%d\n\n ",sum);if(computerorpeople==2)system("pause");elsefor(i=0;i<200000*speed;i++);void hanoi(int ta_1,int ta_2,int ta_3,int m) //递归,ta_1/ta_2/ta_3分别为座塔的代号,m为盘子数{if(m==1)move(ta_1,ta_3); //如果盘子为,将这个盘子从塔座A移动到塔座C else{hanoi(ta_1,ta_3,ta_2,m-1); //将塔座A的前m-1个盘子移到塔座Bmove(ta_1,ta_3); //将塔座A的第m个盘子移到塔座Chanoi(ta_2,ta_1,ta_3,m-1); //将塔座B的m-1个盘子移到塔座C}}int main(){int i;printf("请输入汉诺塔的高度(范围->10):");scanf("%d",&n);printf("请选择:输入由电脑自动控制;\n");printf(" 输入由人控制。

\n");printf("请输入:");scanf("%d",&computerorpeople);if(computerorpeople!=1&&computerorpeople!=2)computerorpeople=1;if(computerorpeople==1){printf("请输入移动盘的速度(例如:输入则代表秒):");scanf("%d",&speed);}if(n<1||n>10)n=10;ta[0].h=n;system("cls");for(i=0;i<7+n;i++)printf("%s\n",hnt[i]);printf("%s\n\n ",hnt[17]);system("pause");hanoi(0,1,2,n);if(computerorpeople==1)return 0;}【小组分工合作情况】本次实验课题的完成分为以下几个步骤:一汉诺塔课题的选择以及编写程序之前的准备;二实验程序的编写及运行测试;三程序的修改与完善;四程序的运行及对运行结果的分析;五课程设计实验报告的编写更正。

***负责的有:对于编写游戏程序之前准备资料的查询与记录;汉诺塔程序的编写与检验;课程设计报告中课题分析、整体设计部分的编写;课程设计实验报告的整理。

相关主题