C语言程序设计实训报告(共18页).doc
精选优质文档-倾情为你奉上青岛大学软件技术学院C语言程序设计实训报告姓 名 专 业 班 级 指导教师 2011 年 7月14日专心-专注-专业目 录一实训目的和要求1. 实训目的本实训是软件技术专业重要的实践性环节之一,是在学生学习完C语言程序设计课程后进行的一次全面的综合练习。本实训的目的和任务:1. 巩固和加深学生对C语言课程的基本知识的理解和掌握2. 掌握C语言编程和程序调试的基本技能3. 利用C语言进行基本的软件设计4. 掌握书写程序设计说明文档的能力5. 提高运用C语言解决实际问题的能力2. 实训要求 1. 分析实训题目的要求 2. 写出详细设计说明 3. 编写程序代码,调试程序使其能正确运行 4. 设计完成的软件要便于操作和使用 5. 设计完成后提交实训报告二试训任务内容 1问题定义汉诺塔问题 (Towers of Hanoi)2问题分析假设有三根木桩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时的递归调用树状图,可以使我们更清楚的了解递归的调用过程。3.主要模块Main函数实现函数的调用,move函数实现输出,hanoi函数调用move函数实现移动和最终输出。 功能模块主要有以下几个: 输入界面(由用户输入演示盘子的个数) ;基本界面(包括3个柱子和若干放置在A上的盘子) ;演示模块(即递归的过程) ;主函数(对以上模块进行调用)。4.模块关系程序从Main函数开始,到main函数结束。Main函数通过调用hanoi函数来实现盘子的移动,然后由move函数输出在屏幕上。如图4.1汉诺塔程序基本界面输入界面演示模块主函数4.1模块关系图5.详细设计a) 输入界面涉及C的字体显示方式,返回值为盘子的个数,无参数 。b) 基本界面涉及C的图形功能,无返回值,参数为盘子的个数 。c)使用for循环函数,对阶数判断并执行循环。d) 演示模块需要先写出汉诺塔的递归算法代码,在递归过程中完成演示,无返回值,参数为盘子个数,3个柱子代号 为完成演示,需设计出两个全局变量 :int count410=0;/*counti0表示每个柱子13号(0号不用)上当前的盘子个数,countij的表示第j个盘子是几号盘子,自底向上数,初始时A柱上盘子自底向上依次编号为1n*/ 。主函数模块流程图如图1所示。其中outputt函数为自定义的输出函数。 开始 System(“cls”)Strlen(s)!=1|s0Y N n=s0-48 i=0i<=n-1NYxn-1-i=2*i+1Y i+i=n i<9xi=0;yi=0;zi=0 i+Output(a,b,1); Return0图 1主函数模块流程图 如图2,为移动函数模块流程图。Move为自定义的移动函数。开始c= =1NY i=0a!=x&&b!=xNi<9 Y Ymove(a,x,c-1);breaki+a!=y&&b!=yNmove(a,z,c-1);For和if函数对数组赋值和判断Ymove(a,y,c-1);If···else函数判定,move实现移动 Count+结束图2移动模块流程图 如图3,为输出函数模块图流程图。 开始 i<9NY数组赋值 i+ System(“cls”); System(“cls”)Count<10NYCount>=10&&count<100Printf(“=”) N YPrintf(“=”)Printf(“=”)Printf(“nnnnn”)结束Printf(“nn按回车键继续 ”)For函数运算,printf输出 图3输出模块流程图四. 软件使用说明1.运行程序,窗口提示“此为汉诺塔演示程序n请输入汉诺塔阶数(1-9)”如图4。图4提示窗口2.如输入盘子数后,按 Enter键,使盘子移动,如图5。图5移动盘子3.连续按Enter 键,使阶层移动直到演示完该汉诺塔游戏,如图6所示。图6游戏完成五.实训心得与体会通过此次C实训,让我加深了对C语言的了解,而不只是单单的在课本中学到的那些理论。通过自己动手亲自编写,平时乏味的课程,变的生动有趣。 这次实训有很大的收获,平时在课堂上学到的东西可以自己动手编写,将其转化成一些实用的技能。如果是一个程序写完一处错误也没用,会有种成就感,于是兴趣就来了,自然学的东西也就多了,能把理论变成实际的技能,让我对C语言有了浓厚的兴趣和更深层的认识。C语言是一个有序的学习,学了最基本的替换,然后扩展到循环,嵌套,条理很清楚,不是 一个零散的知识,实际上所有的课程都如此。同时我也存在不少问题, 比如自己写的小程序出了问题,不会解决了就叫老师帮忙,虽然解决了困难,但是会养成一种依赖的心理,碰到问题了第一个想到的是求助而不是自己独立解决,所以以后要多多锻炼自己的信心和增加自己的能力,争取做到老师不在身边的时候也可以完成一些简单的程序编写与错误排除。 另外,自己的基础知识不扎实,遇到的问题,没有很好的逻辑思维,亲自编写一个陌生的程序的时候会有种无法下手的感觉,找不到突破口。通过实训,逐渐理清了顺序,对于简单的程序和一些相对比较繁琐的嵌套,循环,不在是看着一头雾水。其实只要理清了思路,把基础知识掌握了,然后有条不紊的分析,一步一步理解,C语言还是很有意思的课程。 学习C语言都对自己的职业很有帮助,如果是从事编程工程工作的话,就更有帮助了,即使以后的编程工作可能不用C语言,但是拥有扎实的C语言基础是对工作很有用的。 当初在初步接触C语言的时候,看着一堆“奇形怪状”的符号,觉得甚是无聊,通过这次实训,摆脱了那种似懂非懂的状态! 感谢学校安排这次实训和老师的耐心讲解,让我学到了很多知识,在实训过程中,同学之间的互相探讨,老师的循循善诱,最终让我们达到了举一反三的效果,在学知识的同,也增加了同学老师之间的感情。希望以后还会有更多类似的实训课程,在有限的大学时间内学到更多的实用技能,为以后的工作打下一个良好的基础。参考文献1 刘振安,刘燕君.C程序设计课程设计M.北京:机械工业出版社,2004年9月.2 谭浩强.C程序设计(第三版).清华大学出版社,2005年7月.3 严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社,1997年4月.4 张岳新,Visual C+ 程序设计.苏州大学出版社,2007年12月.5 徐宝文,.机械工业出版社,2004年1月.6 黄明,梁旭,周绍斌,Visual C+ 信息系统设计与开发实例.机械工业出版社, 2005年3月.7 AL KELLEY等著,麻志毅译.C语言解析教程.北京:机械工业出版社,2002年.8 李志球,实用C语言程序设计教程.北京:电子工业出版社,1999年.9 王立柱,C/C+与数据结构.北京:清华大学出版社,2002年.10 李大友,C语言程序设计.清华大学出版社,1999年.附录代码#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>/*-函数申明-*/void move(char a,char b,int c); /移动函数void outputt(char a,char b,int c); /输出函数/*-定义全局变量-*/*三个数组中所放每个数据代表每个塔层,数据大小代表塔层大小(即长度)*/int x9,y9,z9,count=0;int main() int i; char s99; /用s接受塔层数,然后赋值给n,这样容许一些错误输入 int n; system("color 0A"); do system("cls"); printf("此为汉诺塔演示程序n请输入汉诺塔阶数(1-9):n"); scanf("%s",s); while(strlen(s)!=1|s0<49|s0>57); n=s0-48; for(i=0;i<=n-1;i+) /初始化三个数组 xn-1-i=2*i+1; for(i=n;i<9;i+) xi=0; for(i=0;i<9;i+) yi=0; for(i=0;i<9;i+) zi=0; outputt('a','b',1); /*输出,其中的传递 ('a','b',1)没有意义 只为cfree的特殊编译需要*/ getchar(); move('x','z',n); return 0;/*-移动函数,将a代表的塔的上面c层移到b代表的塔上-*/void move(char a,char b,int c) int i,xtop,ytop,ztop; if(c=1) / 只移动一层 for(i=0;i<9;i+) if(xi=0) break; xtop=i-1; for(i=0;i<9;i+) if(yi=0) break; ytop=i-1; for(i=0;i<9;i+) if(zi=0) break; ztop=i-1; if(a='x'&&b='y') yytop+1=xxtop; xxtop=0; else if(a='x'&&b='z') zztop+1=xxtop; xxtop=0; else if(a='y'&&b='x') xxtop+1=yytop; yytop=0; else if(a='y'&&b='z') zztop+1=yytop; yytop=0; else if(a='z'&&b='x') xxtop+1=zztop; zztop=0; else yytop+1=zztop; zztop=0; count+; outputt('a','b',1); else / 移动多层 if(a!='x'&&b!='x') move(a,'x',c-1); move(a,b,1); move('x',b,c-1); else if(a!='y'&&b!='y') move(a,'y',c-1); move(a,b,1); move('y',b,c-1); else move(a,'z',c-1); move(a,b,1); move('z',b,c-1); /*-输出函数-*/*-每次都是清屏再逐行输出,纯数字计算-*/void outputt(char a,char b,int c) int i,j; int p19,p29,p39,p49,p59,p69,p79; for(i=0;i<9;i+) p1i=xi-(!xi); for(i=0;i<9;i+) p1i=8-(p1i-1)/2; for(i=0;i<9;i+) p2i=xi; for(i=0;i<9;i+) p3i=yi-(!yi); for(i=0;i<9;i+) p3i=25-(p3i-1)/2-p1i-p2i; for(i=0;i<9;i+) p4i=yi; for(i=0;i<9;i+) p5i=zi-(!zi); for(i=0;i<9;i+) p5i=42-(p5i-1)/2-p1i-p2i-p3i-p4i; for(i=0;i<9;i+) p6i=zi; for(i=0;i<9;i+) p7i=51-p1i-p2i-p3i-p4i-p5i-p6i; system("cls"); printf("=此为汉诺塔演示程序=n"); printf("=第%d步",count); if(count<10) printf("=n"); else if(count>=10&&count<100) printf("=n"); else printf("=n"); printf("nnnnn"); for(i=8;i>=0;i-) for(j=1;j<=5;j+) printf(" "); for(j=1;j<=p1i;j+) printf(" "); for(j=1;j<=p2i;j+) printf("%c",22); for(j=1;j<=p3i;j+) printf(" "); for(j=1;j<=p4i;j+) printf("%c",22); for(j=1;j<=p5i;j+) printf(" "); for(j=1;j<=p6i;j+) printf("%c",22); for(j=1;j<=p7i;j+) printf(" "); printf("n"); printf("nn按回车键继续."); getchar();/*-若为自动演示,可将前面两句改为for(i=0;i<2e8;i+);即可*/