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

汉诺塔课程设计

学 号:200840420149课 程 设 计题 目汉诺塔 教 学 院 计算机学院 专 业 计算机 班 级 网络技术姓名 指导教师2010 年 12 月 17 日课程设计任务书2009 ~2010 学年第一学期学生姓名:专业班级:网络技术指导教师:工作部门:计算机学院一、课程设计题目汉诺威塔二、课程设计内容(含技术指标)1.在移动盘子的每一步骤,形象直观地显示各针上的盘子。

2.考虑到学“VC 语言”课程的学生同时学习了“数据结构”课程,所以用灵活的数据结构解决汉诺威塔问题,灵活的处理数据结构中的经典问题。

3.使用VC++,因用面向对象的方法去处理数据结构已经是当今的潮流。

三、进度安排1. 初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2. 完成最低要求:实现5层汉诺威塔的调整过程;3.进一步要求:直至实现n=9时的情况。

四、基本要求1.界面友好,函数功能要划分好2.总体设计应画流程图3.程序要加必要的注释4.要提供程序测试方案5.程序一定要经得起测试,宁可功能少一些,也要能运行起来。

教研室主任签名:2010年12 月 17 日目录1、概述 (3)2、设计目的 (4)3、问题分析 (4)4、逻辑设计 (5)5、流程图 (5)6、程序代码: (6)7、程序调试与测试 (9)8、结果分析 (12)9、总结 (13)一、概述数据结构是计算机学科非常重要的一门专业基础理论课程,要想编写针对非数值计算问题的高质量程序,就必须要熟练的掌握这门课程设计的知识。

另外,他与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。

拥有《数据结构》这门课程的知识准备,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程的都是有益的。

二、设计目的《数据结构课程设计》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化与提高。

因此,要求学生能综合应用所学的知识,设计与制作出具有较复杂的应用系统,并且在实验的基本技能方面进行一次全面的训练。

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;若圆盘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柱子上。

}}五、流程图开始输入m(m<=9)输出结果1、是是否继续?2、否结束六、程序代码:#include<stdio.h>int i=0; /*记录每一步为第几步*/void movedishes(int n,int x,int y,int z){if(n==1){printf(" %d. %c→%c ",i+1,x,z);/*输出步骤*/i++;if(i%7==0)/*每行显示七个*/printf("\n");}else{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杆*/}}main(){int m,j=1;/*m记录需要移动盘子的数目,j记录循环条件*/printf("_________________________________欢迎使用本系统______________________________\n");printf(" | | |\n");printf(" | | | \n");printf(" | | | \n");printf(" | | | \n");printf(" | | | \n");printf(" a | b | c | \n");printf(" | | | \n");printf(" | | | \n");printf(" | | | \n");printf(" _______________ ________________ _______________ \n");while(j==1){printf(" 请输入a上盘子数:\n");scanf("%d",&m);printf(" 移动顺序:\n");movedishes(m,'a','b','c');printf("\n 是否继续:\n1.是\n2.否\n");scanf("%d",&j);while(j!=1&&j!=2){printf("输入错误,请重新输入:");printf("\n 是否继续:\n1.是\n2.否\n");scanf("%d",&j);}i=0;/*每次计算完重新置1*/}printf(" 谢谢使用,再见!\n");}七、程序调试与测试1、程序调试1)使用Microsoft visual c++ 编辑软件进行源程序的编写。

2)使用Microsoft visual c++软件进行编译,步骤:单击“组建”选择“编译”。

3)使用Microsoft visual c++运行程序并调试,步骤:单击“组建”选择“执行”。

2、运行及程序界面1)编辑程序界面图(一)图(二)图(三)2)执行程序及运行后界面图(一)图(二)3、运行过程图(一)八、结果分析_________________________________欢迎使用本系统______________________________ | | || | || | || | || | |a |b |c || | || | || | |_______________ ________________ _______________请输入a上盘子数:6移动顺序:1. a→b2. a→c3. b→c4. a→b5. c→a6. c→b7. a→b8. a→c 9. b→c 10. b→a 11. c→a 12. b→c 13. a→b 14. a→c15. b→c 16. a→b 17. c→a 18. c→b 19. a→b 20. c→a 21. b→c22. b→a 23. c→a 24. c→b 25. a→b 26. a→c 27. b→c 28. a→b29. c→a 30. c→b 31. a→b 32. a→c 33. b→c 34. b→a 35. c→a36. b→c 37. a→b 38. a→c 39. b→c 40. b→a 41. c→a 42. c→b43. a→b 44. c→a 45. b→c 46. b→a 47. c→a 48. b→c 49. a→b50. a→c 51. b→c 52. a→b 53. c→a 54. c→b 55. a→b 56. a→c57. b→c 58. b→a 59. c→a 60. b→c 61. a→b 62. a→c 63. b→c是否继续:1.是2.否请输入a上盘子数:8移动顺序:1. a→b2. a→c3. b→c4. a→b5. c→a6. c→b7. a→b8. a→c 9. b→c 10. b→a 11. c→a 12. b→c 13. a→b 14. a→c15. b→c 16. a→b 17. c→a 18. c→b 19. a→b 20. c→a 21. b→c22. b→a 23. c→a 24. c→b 25. a→b 26. a→c 27. b→c 28. a→b29. c→a 30. c→b 31. a→b 32. a→c 33. b→c 34. b→a 35. c→a36. b→c 37. a→b 38. a→c 39. b→c 40. b→a 41. c→a 42. c→b43. a→b 44. c→a 45. b→c 46. b→a 47. c→a 48. b→c 49. a→b50. a→c 51. b→c 52. a→b 53. c→a 54. c→b 55. a→b 56. a→c57. b→c 58. b→a 59. c→a 60. b→c 61. a→b 62. a→c 63. b→c64. a→b 65. c→a 66. c→b 67. a→b 68. c→a 69. b→c 70. b→a71. c→a 72. c→b 73. a→b 74. a→c 75. b→c 76. a→b 77. c→a78. c→b 79. a→b 80. c→a 81. b→c 82. b→a 83. c→a 84. b→c85. a→b 86. a→c 87. b→c 88. b→a 89. c→a 90. c→b 91. a→b92. c→a 93. b→c 94. b→a 95. c→a 96. c→b 97. a→b 98. a→c99. b→c 100. a→b 101. c→a 102. c→b 103. a→b 104. a→c 105. b→c106. b→a 107. c→a 108. b→c 109. a→b 110. a→c 111. b→c 112. a→b113. c→a 114. c→b 115. a→b 116. c→a 117. b→c 118. b→a 119. c→a120. c→b 121. a→b 122. a→c 123. b→c 124. a→b 125. c→a 126. c→b127. a→b 128. a→c 129. b→c 130. b→a 131. c→a 132. b→c 133. a→b134. a→c 135. b→c 136. b→a 137. c→a 138. c→b 139. a→b 140. c→a141. b→c 142. b→a 143. c→a 144. b→c 145. a→b 146. a→c 147. b→c148. a→b 149. c→a 150. c→b 151. a→b 152. a→c 153. b→c 154. b→a155. c→a 156. b→c 157. a→b 158. a→c 159. b→c 160. b→a 161. c→a162. c→b 163. a→b 164. c→a 165. b→c 166. b→a 167. c→a 168. c→b169. a→b 170. a→c 171. b→c 172. a→b 173. c→a 174. c→b 175. a→b176. c→a 177. b→c 178. b→a 179. c→a 180. b→c 181. a→b 182. a→c183. b→c 184. b→a 185. c→a 186. c→b 187. a→b 188. c→a 189. b→c190. b→a 191. c→a 192. b→c 193. a→b 194. a→c 195. b→c 196. a→b197. c→a 198. c→b 199. a→b 200. a→c 201. b→c 202. b→a 203. c→a204. b→c 205. a→b 206. a→c 207. b→c 208. a→b 209. c→a 210. c→b211. a→b 212. c→a 213. b→c 214. b→a 215. c→a 216. c→b 217. a→b218. a→c 219. b→c 220. a→b 221. c→a 222. c→b 223. a→b 224. a→c225. b→c 226. b→a 227. c→a 228. b→c 229. a→b 230. a→c 231. b→c232. b→a 233. c→a 234. c→b 235. a→b 236. c→a 237. b→c 238. b→a239. c→a 240. b→c 241. a→b 242. a→c 243. b→c 244. a→b 245. c→a246. c→b 247. a→b 248. a→c 249. b→c 250. b→a 251. c→a 252. b→c253. a→b 254. a→c 255. b→c是否继续:1.是2.否谢谢使用,再见!九、总结C语言是一种强有力的语言,一项实用性很强的技术,它拥有很多算法便于我们根据个人的需要灵活的编制高级语言程序,随心所欲地控制程序运行。

相关主题