c语言课程设计汉诺塔无图形,C语言课程设计----汉诺塔问题.doc

C语言课程设计----汉诺塔问题

沈阳航空航天大学

课 程 设 计 报 告

课程设计名称:C语言课程设计

课程设计题目:汉诺塔问题

目 录

第1章 概述1

第2章 设计目的2

第3章 问题分析4

第4章 逻辑设计5

第5章 流程图4

第6章 程序代码4

第7章 程序调试与测试4

第8章 结果分析4

参考文献6

附 录(程序)7

第1章 概述

数据结构是计算机学科非常重要的一门专业基础理论课程,要想编写针对非数值计算问题的高质量程序,就必须要熟练的掌握这门课程设计的知识。另外,他与计算机其他课程都有密切联系,具有独特的承上启下的重要位置。拥有《数据结构》这门课程的知识准备,对于学习计算机专业的其他课程,如操作系统、数据库管理系统、软件工程的都是有益的。

第2章 设计目的

《数据结构课程设计》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化与提高。因此,要求学生能综合应用所学的知识,设计与制作出具有较复杂的应用系统,并且在实验的基本技能方面进行一次全面的训练。

1.使学生能够较全面地巩固和应用课堂所学的基本理论和程序设计方法,能够较熟练的完成数据结构程序的设计与调试。

2.培养学生综合运用所学知识独立完成数据结构程序员课题的能力。

3.培养学生用于探索、严谨推理、实事求是、有错必改,用时间来检验理论,全方位考虑问题等科学技术人员应具有的素质。

4.提高学生对工作认真负责额、一丝不苟,对同学团结友爱,协作攻关的基本素质。

5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。

6.对学生掌握知识的深度。运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核。

第3章 问题分析

任务:有三个柱子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)

这个最简单,如果只有一个盘子(n=1),那么只要从x柱子直接移动到z柱子就可以了。不需要中间以哦的那个其他的盘子。

如果要移动的盘子不止一个,那么就要采取一定的策略。这个策略就是先把上面的n-1个盘子移动到中间的柱子,也就是y,然后把最地下一个盘子移动到z柱子,然后再把中间柱子y上的盘子通过哦a柱子移动到z柱子上。

else

{

//把上面的n-1个盘子通过z柱子移动到y柱子上,这样才能把最后一个盘子移动到z柱子上。

//输出这次移动

//然后再把刚才移动出来放在y柱子上的n-1个盘子移动到z柱子上。

}

流程图

第6章 程序代码

#include

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值