c语言课程设计--汉诺塔
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告
课程设计名称:C语言课程设计
课程设计题目:汉诺塔问题求解演示
院(系):计算机学院
专业:计算机科学与技术
班级:
学号:
姓名:
指导教师:
完成时间:2010年3月18日
沈阳航空航天大学课程设计报告
目录
第1章需求分析 (3)
1.1 课程设计的题目及要求 (3)
1.2 总体分析 (3)
第2章系统设计 (4)
2.1 主要函数和函数功能描述 (4)
2.2 功能模块图 (4)
第3章详细设计 (5)
3.1主函数流程图 (5)
3.2各功能模块具体流程图 (6)
第4章调试分析 (10)
4.1.调试初期 (10)
4.2.调试中期 (10)
4.3.调试后期 (10)
参考文献 (11)
附录 (12)
第1章需求分析
1.1 课程设计的题目及要求
题目:汉诺塔问题求解演示
内容:
在屏幕上绘出三根针,其中一根针上放着N个从大到小的盘子。要求将这些盘子从这根针经过一个过渡的针移到另外一根针上,移动的过程中大盘子不能压在小盘子上面,且一次只能移动一个盘子。要求形象直观地演示盘子移动的方案和过程。
要求:
1)独立完成系统的设计,编码和调试。
2)系统利用C语言实现。
3)安照课程设计规范书写课程设计报告。
4)熟练掌握基本的调试方法,并将程序调试通过
1.2总体分析
本题目需要使用C语言绘制图形,所以需要turbo C,需要绘图函数,而汉诺塔的函数属于经典的函数,在书本上都学习过,所以这个题目的难点在于需要绘制汉诺塔图形。攻克这一点其他的问题都迎刃而解。但是我个人以前也没有学过一些关于turboC 方面的知识。所以我将重点放在了对#include
第2章系统设计
2.1 主要函数和函数功能描述
1):递归函数:void hanoi(char x,char y,char z,int n,struct H num[3]); ,根据递归的方法,实现汉诺塔的运行;
2):用来进行移动的函数:void move(char x,char y,struct H num[3]);
3):初始化函数:void kaishi()
4):图形关闭:void close()
5):系统主函数:main()
2.2 功能模块图
图2.1 功能模块图
本程序共分为两个模块,分为图形模块与递归模块,其中图形模块中有kaishi函数,主要功能为绘制出初始化的图形。填色函数,填色函数承担着将移走的盘子的原位置填充成为黑色,将移到的盘子的位置填充为白色。画图函数的主要功能是在相应的位置使用bar函数画出相应的图形,创造出汉诺塔的图形轮廓。第二部分为递归部分,包含两个主要函数,其中有Hanoi函数,本函数的主要功能是实现递归操作。Move函数的主要功能是实现盘子移动的操作,并指导图形函数在什么位置画出图形,为图形函数提供准确的坐标。
第3章详细设计3.1主函数设计
图3.1主函数流程图
3.2 各功能模块具体流程图
1)递归函数hanoi函数
void hanoi(char x,char y,char z,int n,struct H num[3])函数实现递归,是汉诺塔程序中的最精髓部分,实现了汉诺塔的流程部分,由于汉诺塔游戏的步骤每部有相似之处,所以可是使用递归函数进行。本函数内含有一个递归函数。
下面是具体流程图:
图3.2递归函数hanoi函数流程图
(2)盘子移动函数move函数
void move(char x,char y,struct H num[3])函数主要承担着对汉诺塔移动的任务,与上面的函数同属于递归模块,同时画图的一部分函数也嵌入其中。在移动的同时,将图像画出,主要为将原来的图像用填充颜色的函数将其填成黑色,将要移动到的函数的位置填为白色,实现汉诺塔运行的图形演示。
图3.3盘子移动函数move函数流程图
2.图形模块
(1)初始化函数:void kaishi()函数根据用户输入的汉诺塔盘子数,绘制出相应的汉诺塔图形,是一个初始化的函数。
下面是具体的流程图
图3.4初始化函数:void kaishi()流程图
(2)图形关闭:void close();将图形关闭的函数,是绘制图形的必须的函数。
沈阳航空航天大学课程设计报告第4章调试分析
第4章调试分析
4.1.调试初期
由于编写的程序具有模块化的特性,且我们之前学的运行环境多为VC6.0,所以我在VC下完成了除了图像外的程序代码,在TC上绘制图形,添加了画图函数后,我就不得不使用TC编程环境。将图形模块的函数嵌入到递归模块时出现了错误,出现了图像出现了不规则的现象,原因在于函数的形参与汉诺塔图像的位置间的转换出现差错。
4.2.调试中期
1)由于这个程序要绘制图形,刚开始的时候对显示位置研究的不是很透彻,由于自己以前没有这方面的经验,导致图形不是出现在自己想要的位置。但后来经过多时实验,最终掌握了图像坐标的定位的方法。
2)对于函数initgraph(&gdriver,&gmode,"c:\\tc");的掌握不够,刚开始的时候将turbo C的文件安装在了E盘里,导致运行不了,将其安装在C盘后,修改后程序可正常运行。
3)对于num[i].top刚开始赋的初值为0,但是与后面的num[i].top++矛盾,造成最后一行没有,使程序从num[i].top=1开始,但是如果将num[i].top++放在程序的后面又会使得后面的程序行数增加。解决的方法是将num[i].top的初值作为-1。
4.3.调试后期
对颜色的涂黑除理出现了错误,汉诺塔的盘子移走后,没有涂黑,移去的地方没有涂白,造成程序的运行出现问题,原因是setfillstyle函数的使用错误,没有在移去后将原来的位置涂色。