课程设计报告课程设计名称: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<graphics.h>下的一系列绘图函数的研究与应用,对屏幕上的图像坐标分析是一个难点。
其中用到了graphics.h头文件中的bar, outtextxy, setfillstyle,closegraph函数。
进行了画图(利用bar函数进行画框的操作),填充颜色(利用setfillstyle函数填充白色和黑色,以分辨图形与图形背景),在特定位置输出特定字符等操作(利用outtextxy函数)。
第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函数的使用错误,没有在移去后将原来的位置涂色。
参考文献[1]张长海.C语言程序设计[M].北京:高等教育出版社,2006[2]肖金生,龚斌.C语言精要例解[M]. 北京:中国铁道出版社,1997年[3]谭浩强.C语言程序设计[M].北京:清华大学出版社.2000年[4] 耿彩凤石祥滨.C语言程序设计基础与实践[M].辽宁:辽宁大学出版社2004年[5]谢明与.Borland C++/Turbo C++ 编程实例剖析[M].北京.科学出版社,1993年附录源程序代码:#include<graphics.h>#include<stdio.h>struct TA{int data[15];int top;}num[3];void move(char x,char y,struct TA num[3]);void hanoi(char x,char y,char z,int n,struct TA num[3]); void kaishi();void close(void);void main(void){kaishi();close();exit(0);}void kaishi(void){int gdriver=DETECT,gmode;int i,n;clrscr();printf("please input n(n<=10): ");scanf("%d",&n);if(n<1||n>10)n=10;initgraph(&gdriver,&gmode,"c:\\tc");cleardevice();for(i=0;i<3;i++)num[i].top=-1;for(i=0;i<n;i++){num[0].top++;num[0].data[num[0].top]=i;bar(100-(33-3*num[0].data[num[0].top]),400-20*i-8,100+(33-3*num[0].data[num[0].top]),400-20*i+8);}outtextxy(150,450,"any key to continue");settextstyle(0,0,2);outtextxy(90,420,"A");outtextxy(240,420,"B");outtextxy(390,420,"C");getch();hanoi('a','b','c',n,num);}void move(char x,char y,struct TA num[3]){int i;setfillstyle(SOLID_FILL,BLACK);bar(0,0,640,60);bar(100+150*(x-97)-(33-3*num[x-97].data[num[x-97].top]), 400-20*num[x-97].top-8,100+150*(x-97)+(33-3*num[x-97].data[num[x-97].top]),400-20*num[x-97].top+8);num[y-97].top++;num[y-97].data[num[y-97].top]=num[x-97].data[num[x-97].top];num[x-97].top--;setfillstyle(SOLID_FILL,WHITE);bar(100+150*(y-97)-(33-3*num[y-97].data[num[y-97].top]), 400-20*num[y-97].top-8,100+150*(y-97)+(33-3*num[y-97].data[num[y-97].top]),400-20*num[y-97].top+8);getch();}void hanoi(char one,char two,char three,int n,struct TA num[3]) {if(n==1)move(one,three,num);else{hanoi(one,three,two,n-1,num);move(one,three,num);hanoi(two,one,three,n-1,num);}}void close(void){getch();closegraph();}沈阳航空航天大学课程设计报告。