青岛大学软件技术学院C语言程序设计实训报告姓名专业班级指导教师2011年7月14日I目录一.实训目的和要求...................................................................................................11.实训目的...........................................................................................................12.实训要求...........................................................................................................1二.试训任务内容.......................................................................................................11.问题定义...........................................................................................................12.问题分析...........................................................................................................2三.总体设计................................................................................................................21.设计思想.............................................................................................................22.实现方法.............................................................................................................23.主要模块.............................................................................................................24.模块关系.............................................................................................................35.详细设计.............................................................................................................3四.软件使用说明.........................................................................................................7五.实训心得与体会.....................................................................................................8参考文献.......................................................................................................................9附录代码.....................................................................................................................101一.实训目的和要求1.实训目的本实训是软件技术专业重要的实践性环节之一,是在学生学习完《C语言程序设计》课程后进行的一次全面的综合练习。本实训的目的和任务:1.巩固和加深学生对C语言课程的基本知识的理解和掌握2.掌握C语言编程和程序调试的基本技能3.利用C语言进行基本的软件设计4.掌握书写程序设计说明文档的能力5.提高运用C语言解决实际问题的能力2.实训要求1.分析实训题目的要求2.写出详细设计说明3.编写程序代码,调试程序使其能正确运行4.设计完成的软件要便于操作和使用5.设计完成后提交实训报告二.试训任务内容1.问题定义汉诺塔问题(TowersofHanoi)22.问题分析假设有三根木桩A、B和C。在木桩A上放置了N个圆盘,由上到下编号为1,2,,…,N,编号越大的圆盘直径越大。而我们必须将圆盘由木桩A通过木桩B全部搬到木桩C。在移动过程中,必须按照下述移动规则:1.直径较小的圆盘永远置于直径较大的圆盘上;2.圆盘可任意地由任何一个木桩移到其他的木桩上;3.每一次仅能移动一个圆盘。三.总体设计1.设计思想如果盘子为1,则将这个盘子从塔座A移动到塔座C;如果不为1,则采用递归思想。将塔座A的前n-1个盘子借助C盘(即目的盘)移到塔座B,移后,此时C为空座,那我们就可以将塔座A的第n个盘子移到塔座C了。接下来就将塔座B的n-1个盘子借助A移到塔座C,从而完成盘子的移动。2.实现方法通过函数的递归调用来实现。如图例图3是当N=3时的递归调用树状图,可以使我们更清楚的了解递归的调用过程。Hanoi(3,A,B,C)Hanoi(2,A,C,B)Hanoi(2,B,A,C)Hanoi(1,A,B,C)Hanoi(1,B,C,A)Hanoi(1,C,A,B)Hanoi(1,A,B,C)Print“disk3:A→C”Print“disk2:A→B”Print“disk2:B→C”disk1:A→Cdisk2:A→Bdisk1:C→Bdisk1:B→Adisk2:B→Cdisk1:A→Cdisk3:A→C图33.主要模块Main函数实现函数的调用,move函数实现输出,hanoi函数调用move函数实现移动和最终输出。功能模块主要有以下几个:输入界面(由用户输入演示盘子的个数);3基本界面(包括3个柱子和若干放置在A上的盘子);演示模块(即递归的过程);主函数(对以上模块进行调用)。4.模块关系程序从Main函数开始,到main函数结束。Main函数通过调用hanoi函数来实现盘子的移动,然后由move函数输出在屏幕上。如图4.14.1模块关系图5.详细设计a)输入界面涉及C的字体显示方式,返回值为盘子的个数,无参数。b)基本界面涉及C的图形功能,无返回值,参数为盘子的个数。c)使用for循环函数,对阶数判断并执行循环。d)演示模块需要先写出汉诺塔的递归算法代码,在递归过程中完成演示,无返回值,参数为盘子个数,3个柱子代号为完成演示,需设计出两个全局变量:intcount[4][10]={0};/*count[i][0]表示每个柱子1—3号(0号不用)上当前的盘子个数,count[i][j]的表示第j个盘子是几号盘子,自底向上数,初始时A柱上盘子自底向上依基本界面输入界面演示模块主函数汉诺塔程序4次编号为1—n*/。主函数模块流程图如图1所示。其中outputt函数为自定义的输出函数。YNNYY图1主函数模块流程图System(“cls”)Strlen(s)!=1||s[0]n=s[0]-48i=0i=n-1x[n-1-i]=2*i+1i++i=ni9x[i]=0;y[i]=0;z[i]=0i++Output(‘a’,’b’,’1’);Return0开始5如图2,为移动函数模块流程图。Move为自定义的移动函数。NYNYYNY图2移动模块流程图c==1i=0i9breaki++a!=’x’&&b!=’x’move(a,’x’,c-1);Count++a!=’y’&&b!=’y’move(a,’y’,c-1);move(a,’z’,c-1);For和if函数对数组赋值和判断If···else函数判定,move实现移动开始结束6如图3,为输出函数模块图流程图。NYNYNY图3输出模块流程图i9数组赋值i++System(“cls”);System(“cls”)Count10Printf(“======”)Count=10&&count100Printf(“======”)Printf(“=====”)Printf(“\n\n\n\n\n\”)For函数运算,printf输出Printf(“\n\n\按回车键继续\”)结束开始7四.软件使用说明1.运行程序,窗口提示“此为汉诺塔演示程序\n请输入汉诺塔阶数(1-9)”如图4。图4提示窗口2.如输入盘子数后,按Enter键,使盘子移动,如图5。图5移动盘子3.连续按Enter键,使阶层移动直到演示完该汉诺塔游戏,如图6所示。8图6游戏完成五.实训心得与体会通过此次C实训,让我加深了对C语言的了解,而不只是单单的在课本中学到的那些理论。通过自己动手亲自编写,平时乏味的课程,变的生动有趣。这次实训有很大的收获,平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。如果是一个程序写完一处错误也没用,会有种成就感,于是兴趣就来了,自然学的东西也就多了,能把理论变成实际的技能,让我对C语言有了浓厚的兴趣和更深层的认识。C语言是一个有序的学习,学了最基本的替换,然后扩展到循环,嵌套,条理很清楚,不是一个零散的知识,实际上所有的课程都如此。同时我也存在不少问题,比如自己写的小程序出了问题,不会解决了就叫老师帮忙,虽然解决了困难,但是会养成一种依赖的心理,碰到问题了第一个想到的是求助而不是自己独立解决,所以以后要多多锻炼自己的信心和增加自己的能力,争取做到老师不在身边的时候也可以完成一些简单的程序编写与错误排除。另外,自己的基础知识不扎实,遇到的问题,没有很好的逻辑思维,亲自编写一个陌生的程序的时候会有种无法下手的感觉,找不到突破口。通过实训,逐渐理清了顺序,对于简单的程序和一些相对比较繁琐的嵌套,循环,不在是看着一头雾水。其实只要理清了思路,把基础知识掌握了,然后有条不紊的分析,一步一步理解,C语言还是很有意思的课程。学习C语言都对自己的职业很有帮助,如果是从事编程工程工作的话,就更有帮助了,即使以后的编程工作可能不用C语言,但是拥有扎实的C语言基础是对工作很有用的。9当初在初步接触C语言的时候,看着一堆“奇形怪状”的符号,觉得甚是无聊,通过这次实训,摆脱了那种似懂非懂的状态!感谢学校安排这次实训和老师的耐心讲解,让我学到了很多知识,在实训过程中,同学之间的互相探讨,老师的循循善诱,最终让我们达到了举一反三的效果,在学知识的同,也增加了同学老师之间的感情。希望以后还会有更多类似的实训课程,在有限的大学时间内学到更多的实用技能,为以后的工作打下一个良好的基础。参考文献[1]刘振安,刘燕君.《C程序设计课程设计》[M].北京:机械工业出版社,2004年9月.[2]谭浩强.《C程序设计》(第三版).清华大学出版社,2005年7月.[3]严蔚敏,吴伟民.《数据结构》(C语言版).清华大学出版社,1997年4月.[4]张岳新,《VisualC++程序设计》.苏州大学出版社,2007年12月.[5]徐宝文,《TheCProgrammingLanguage》.机械工业出