保龄球计分应用程序课程设计.doc

上传人:精*** 文档编号:851087 上传时间:2023-09-16 格式:DOC 页数:33 大小:245.30KB
下载 相关 举报
保龄球计分应用程序课程设计.doc_第1页
第1页 / 共33页
保龄球计分应用程序课程设计.doc_第2页
第2页 / 共33页
保龄球计分应用程序课程设计.doc_第3页
第3页 / 共33页
保龄球计分应用程序课程设计.doc_第4页
第4页 / 共33页
保龄球计分应用程序课程设计.doc_第5页
第5页 / 共33页
点击查看更多>>
资源描述

1、太原理工大学计算机科学与技术学院目录一、保龄球计分- 2 -1.设计方案简介- 2 -2.设计题目实现- 2 -1)需求分析- 2 -2)概要设计- 3 -3)详细设计- 4 -4)调试分析- 6 -5)用户使用说明- 7 -6)测试结果- 7 -3.设计评述- 8 -4.参考资料- 8 -5.附录:源程序- 8 -二、传递闭包- 10 -1.设计方案简介- 10 -2.设计题目实现- 10 -1)需求分析- 11 -2)概要设计- 11 -3)详细设计- 12 -4)调试分析- 12 -5)用户使用说明- 12 -6)测试结果- 12 -3.设计评述- 12 -4.参考资料- 12 -5.附

2、录:源程序- 12 -三、校园导游- 12 -1.设计方案简介- 12 -2.设计题目实现- 12 -1)需求分析- 12 -2)概要设计- 12 -3)详细设计- 12 -4)调试分析- 12 -5)用户使用说明- 12 -6)测试结果- 12 -3.设计评述- 12 -4.参考资料- 12 -5.附录:源程序- 12 -一、 保龄球计分1. 设计方案简介 此次课程设计的主要内容是模拟保龄球计分系统。采用二维数组来存储每一轮两次击球的得分,十轮过后再输出所有得分。 计分规则为:用一个滚球去撞击10个站立的瓶,将瓶击倒。一局分10轮,每轮可滚球1次或2次,以击到的瓶数为依据计分。一局得分为10

3、轮得分之和,而每轮的得分不仅与本轮的滚球情况有关,还可能与后一轮或后两轮的滚球情况有关,即:某轮某次滚球击倒的瓶数不仅要计入本轮得分,还可能会计入前一轮或两轮得分。2. 设计题目实现题目:设计一个保龄球计分程序1) 需求分析此次课程设计的主要内容是模拟保龄球计分系统。打保龄球是用一个滚球去撞击10个站立的瓶,将瓶击倒。一局分10轮,每轮可滚球1次或2次,以击到的瓶数为依据计分。一局得分为10轮得分之和,而每轮的得分不仅与本轮的滚球情况有关,还可能与后一轮或后两轮的滚球情况有关,即:某轮某次滚球击倒的瓶数不仅要计入本轮得分,还可能会计入前一轮或两轮得分。计分规则如下:若某一轮的第一次滚球就击倒全

4、部10个瓶,则本轮不再滚球(若是第十轮还需加2次滚球),该轮得分为本次击倒瓶数10与以后2次滚球所击倒瓶数之和;若某一轮的第一次滚球未击倒全部10个瓶,则对剩下未倒的瓶再滚球一次,如果这2次滚球击倒全部10个瓶,则本轮不再滚球(若是第十轮还需加1次滚球),该轮得分为这2次击倒瓶数10与以后1次滚球所击倒瓶数之和;若某一轮2次滚球未击倒全部10个瓶,则本轮不在滚球,该轮得分为这2次滚球所击倒瓶数之和。2) 概要设计类抽象数据类型的定义:typedefunsignedcharMK_Byte; #defineSUCCESS0/*Noerror*/ #defineMFAILED1/*Generalfa

5、ilure*/ #defineMNOMEMORY2/*Outofmemory*/ 确保初始化:#defineDeclareTwoDArray(ATYPE,iname)ATYPE*iname=NULL /定义自己的malloc和free,确保内存正确操作 #defineMKMALLOC(nsize)malloc(nsize) #defineMKFREE(name) if(NULL!=name) free(name); name=NULL 实现: intMKCreatArray(intnsize,intX,intY,void*parray) void*tdarray=NULL; MK_Byte*t

6、mparray=NULL; inti=0; *parray=NULL; 分配指针数组 if(!(tdarray=(void*)MKMALLOC(sizeof(MK_Byte*)*Y) returnMNOMEMORY; /分配实际数组空间 if(!(tmparray=(MK_Byte*)MKMALLOC(nsize*(X*Y) MKFREE(tdarray); returnMNOMEMORY; 初始化内存 memset(tmparray,0x00,nsize*(X*Y); 指针数组赋值 for(i=0;iY;i+) tdarrayi=(tmparray+(i*X)*nsize); *parray

7、=tdarray; returnSUCCESS; voidMKFreeArray(void*parray) if(*parray) MKFREE(*parray)0); MKFREE(*parray); 使用 voidtestTwoDArray() 声明数组 DeclareTwoDArray(int,a); DeclareTwoDArray(float,b); 创建整型数组 MKCreatArray(sizeof(int),3,2,&a); a12=10; a01=23; printf(%d,%dn,a12,a01); 使用完一定要FREE MKFreeArray(&a); 重新分配数组 MK

8、CreatArray(sizeof(int),6,6,&a); a55=234; a40=567; printf(%d,%dn,a55,a40); MKFreeArray(&a); 本程序在设计中主要利用二维数组分别存储文件信息,通过循环语句不断执行程序,最后累计总分。3) 详细设计数组的结构:voidtestTwoDArray() 声明数组 DeclareTwoDArray(int,a); DeclareTwoDArray(float,b); 创建整型数组 MKCreatArray(sizeof(int),3,2,&a); a12=10; a01=23; printf(%d,%dn,a12,

9、a01); 使用完一定要FREE MKFreeArray(&a); 重新分配数组 MKCreatArray(sizeof(int),6,6,&a); a55=234; a40=567; printf(%d,%dn,a55,a40); MKFreeArray(&a); 伪码算法:#include #include主函数main() int x114,j,i,a411; /*数组定义*/ for(i=0;i11;i+) /*输入每轮 第一次得分*/ printf(第一次击球:); scanf(%d,&xi0); if(xi0!=10) printf(第二次击球数:); scanf(%d,&xi1)

10、; /*第一次不为10时输入二次得分*/ printf(n); for(i=0;i9;i+) /*计算每轮得分第十轮除外*/ if (xi0=10) xi1=0; if (xi+10=10) xi2=20+xi+20; else xi2=10+xi+10+xi+11; else if(xi0+xi1=10) xi2=10+xi+10; else xi2=xi0+xi1; if(x90=10) /*第十次轮得分*/ if(x100=10) x92=20; else x92=10+x100+x101; else if(x90+x91=10) x92=10+x100; else x92=x90+x9

11、1; x03=x02; for(i=1;i9;i+) /*计算累积分*/ xi3=xi2+xi-13; x93=x92+x83; for(i=0;i10;i+) for(j=0;j4;j+) aji=xij; /*数组转换*/ a010=x100; a110=x101; for(j=0;j2;j+) for(i=0;i11;i+) /*输出每局第一二次得分 */ printf(%5d,aji); printf(n); for(j=2;j4;j+) /*输出每轮得分与累积分*/ for(i=0;i10;i+) printf(%5d,aji); printf(n); system(pause);4

12、) 调试分析1.设计过程中遇到的问题:本程序算法设计上不算复杂,只是通过FOR循环不断对二维数组进行赋值,当时调试的时候就在循环结束点上失败了很多次,后来仔细分析才改正过来。2.回顾讨论和分析:就算再简单的算法,程序再简单,依然要仔仔细细一丝不苟的做,不然就容易犯低级错误,浪费时间精力。5) 用户使用说明(1) 程序开始运行时即显示输入分数的界面(2) 程序运行过程中根据提示依次输入相应的数据即可(3) 当一局结束后,显示这一局中每轮每次击球数、每轮得分和累计得分。6) 测试结果3. 设计评述 本次程序设计过程可谓困难重重,问题层出不穷,一个接着一个,刚解决一个,马上又有另一个问题蹦出来,耗费

13、的心血不可计数。在设计算计算法的时候就考虑了很久,后来调试就是不断解决各种各样的问题。最后做出来的成品自我感觉也还不是很完美,有很多值得改进的地方。 通过此次设计过程,我对仔细工作这一点有了很深刻的认识,特别是写程序时候,不能有一点点的疏忽,不然就很可能导致整个程序运行不了,而要发现改正这些疏忽,每一个都是很困难的事情,既费时又费力。所以以后不管做什么,一定要记得仔仔细细。4. 参考资料数据结构C语言版,离散数学,C语言程序设计基础等。5. 附录:源程序#include stdio.h#includemain() int x114,j,i,a411; for(i=0;i11;i+) /*输入每

14、轮 第一次得分*/ printf(第一次:); scanf(%d,&xi0); if(xi0!=10) printf(第二次:); scanf(%d,&xi1); /*第一次不为10时输入二次得分*/ printf(n); for(i=0;i9;i+) /*计算每轮得分第十轮除外*/ if (xi0=10) xi1=0; if (xi+10=10) xi2=20+xi+20; else xi2=10+xi+10+xi+11; else if(xi0+xi1=10) xi2=10+xi+10; else xi2=xi0+xi1; if(x90=10) /*第十次轮得分*/ if(x100=10)

15、 x92=20; else x92=10+x100+x101; else if(x90+x91=10) x92=10+x100; else x92=x90+x91; x03=x02; for(i=1;i9;i+) /*计算累积分*/ xi3=xi2+xi-13; x93=x92+x83; for(i=0;i10;i+) for(j=0;j4;j+) aji=xij; /*数组转换*/ a010=x100; a110=x101; for(j=0;j2;j+) for(i=0;i11;i+) /*输出每局第一二次得分 */ printf(%5d,aji); printf(n); for(j=2;j

16、4;j+) /*输出每轮得分与累积分*/ for(i=0;i10;i+) printf(%5d,aji); printf(n); system(pause);二、 传递闭包1. 设计方案简介 本次设计主要采用了Warshall算法,其他都是很常规的东西。Warshall算法是求二元关系传递闭包的一种高效的算法,它是Warshall在1962年提出的一个求关系的传递闭包的有效算法。其具体过程如下:设在n个元素的有限集上关系R的关系矩阵为M:(1)置新矩阵A=M;(2)置k=1;(3)对所有i如果Ai,k=1,则对j=1n执行: Ai,jAi,jAk,j;(4)k增1;(5)如果kn,则转到步骤(

17、3),否则停止。所得的矩阵A即为关系R的传递闭包t(R)的关系矩阵。2. 设计题目实现题目:用户输入关系R(程序设计者规定输入方式),由计算机自动求解关系R的传递闭包。1) 需求分析此次课程设计的主要内容是设计一个程序,能完成当用户输入一个关系R时,计算机自动求解关系R的传递闭包。对于此功能的输入形式是没有什么要求的,主要就是根据提示输入相应的数字,一步一步运行完整个程序。程序执行的命令为:1输入矩阵阶数2输入原始关系矩阵3检查输入矩阵是否正确4计算5输出传递闭包的关系矩阵2) 概要设计 采用二维数组存储关系矩阵 设定二维数组的抽象数据类型为:ADT maze数据对象:D=ai,j|ai,j、

18、#、*,0im+1,0jn+1,m,n10数据关系:R=ROW,COLROW=|ai-1,j,ai,jD,i=1,,m+1,j=0,,n+1COL=|ai,j-1,ai,jD,i=0,,m+1,j=1,,n+1基本操作:(1)转置矩阵:/其中A, B是m*n矩阵: void tramat(matrix A,matrix B) int i,j; for(i=0; i<m; i+) for(j=0;j<n;j+) Bj=Aj; (2)矩阵相乘:/其中A是m*n矩阵,B是n*1矩阵,C为m*1矩阵 void mutmat(matrix C, matrix A, matrix B) int

19、 i, j, k; for(i=0; i<m; i+) for(j=0; j<i; j+) Cj=0; for(k=0; k<n; k+) Cj = Cj + Ak * Bkj; 3) 详细设计矩阵的结构:struct TMatrix int n,m; int numbersMAXN+1MAXN+1;伪码算法:1输入矩阵的阶数:cout输入矩阵的阶数 n 且 n20:n;2矩阵的输入:cout输入关系矩阵,且矩阵元素是1或者0:endl;loop: for(i=1;i=n;i+) for(j=1;jaij;3计算: for(i=1;i=n;i+) for(j=1;j=n;j+

20、) if(aji=1) for(k=1;k=n;k+) ajk=add(ajk,aik); 4显示计算结果:cout其传递闭包的关系矩阵是:endl; for(i=1;i=n;i+) for(j=1;j=n;j+) coutaij ; coutendl; 4) 调试分析(1)设计过程中遇到的问题:调试过程中遇到的主要问题是矩阵的转置以及计算。在学习线性代数的时候矩阵的计算本来就没有学好,特别是高阶矩阵,更是容易混淆。所以当时在写转置函数的时候就话费了很多时间,后来调试过程也是反复修改才最终成型。(2) 回顾讨论和分析:由于本题中矩阵为关系矩阵,只存在0和1两个数据元素,而且非零元1的个数十分有

21、限,我们可以只储存下这些1元素的位置和大小,那么占用的空间便会少得多。5) 用户使用说明(1)程序刚运行时显示输入矩阵阶数(2)输入阶数后显示输入关系矩阵(3)输入矩阵后计算并输出结果6) 测试结果3. 设计评述 本次设计完成情况不错,基本能够完成题目的要求。不过在输入关系矩阵的时候稍显繁琐与操作不便,但是没有找到好的解决方法,这是一个败笔。 通过本次课程设计,我又复习了一遍离散数学里边关于二元关系的内容,正所谓各科知识都是互通的,看来以后学东西一定要注意多与其他学科其他方面进行联系沟通。4. 参考资料 数据结构C语言版,离散数学,C语言程序设计基础等。5. 附录:源程序#includeusi

22、ng namespace std;int add(int a,int b)if(a=0&b=0) return 0; else if(a=0&b=1|a=1&b=0|a=1&b=1) return 1; else coutInput matrix was erroneousendl;int main()int i,j,k,n;int a2020;/输入矩阵的阶数cout-请输入矩阵的阶数 n 且 n20: -n;/矩阵的输入cout输入关系矩阵,且矩阵元素是1或者0:endl;loop: for(i=1;i=n;i+) for(j=1;jaij; /计算 for(i=1;i=n;i+) for

23、(j=1;j=n;j+) if(aji=1) for(k=1;k=n;k+) ajk=add(ajk,aik); /显示计算结果cout其传递闭包的关系矩阵是:endl; for(i=1;i=n;i+) for(j=1;j=n;j+) coutaij ; coutg;return 0;三、 校园导游1. 设计方案简介 设计一个校园导游程序,为来访的客人提供各种信息查询服务1)设计你所在学校的校园平面图,所含景点不少于10个。以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息:以边表示路径,存放路径长度等相关信息。2)为来访客人提供图中任意景点相关信息的查询。3)为来访客人提供图中任意景

24、点的问路查询,即查询任意两个景点之间的一条最短的简单路径。2. 设计题目实现题目:设计一个校园导游程序,为来访的客人提供各种信息查询服务1) 需求分析此次课程设计的主要内容是校园导航,为来访的客人提供各种信息查询服务。主要包括:选择服务查看学校主要景点信息查询任意两个景点之间的最短路径。对于功能的输入形式是没什么要求的,主要就是根据菜单的提示输入相应的数字母选择相应的功能;对于功能的输入形式的要求也比较简单,要查询某一景点的简介直接输入其对应的编号即可;对于功能只需要输入起始景点和目的景点的编号即可。此程序在输入形式上都没什么特殊的要求只是一些简单的数字就可以了。、景点的简介方面输出景点的简单

25、信息就可以了;要查询最短路径的话输出的是从起始景点到目的地的最短路径中所途经的各个景点及距离。本程序所能达到的功能就是前面所提到的中的功能。2) 概要设计抽象数据类型的定义:ADT Graph数据对象 V:具有相同特性的数组元素的集合,称为顶点集。数据关系 R: R=VR VR=|v,wV且P(v,w), 表示从v到w的弧,谓词P(v,w)定义了弧的意义或信息基本操作P:CreateGraph(&G,V,VR);初始条件:V是图的顶点集,VR是图中弧的集合。操作结果:按V和VR的定义构造图G。DistroyGraph(&G)初始条件:图G存在操作结果:销毁图GLocateVex(G,u);初始

26、条件:图G存在,u和G中顶点有相同的特征。操作结果:若存在顶点u,则返回该顶点在图中的位置;否则返回其他信息。GetVex(G,u);初始条件:图G存在,u是图中的顶点。操作结果:返回u的值。InsertVex(&G,v);初始条件 :图G存在,v和图中的顶点有相同的特性。操作结果:在图G中新增顶点v.InsertArc(&G,v,w);初始条件:图G存在,v和w是图中的顶点。操作结果:在图G中增添弧,若是无向图,还增添弧。ADT Graph3) 详细设计图的结构:typedef struct view/点的结构int no;/景点编号char name100;/景点名称char briefi

27、nfo1000;/景点简介view;typedef struct edge/边的结构int length;/两个景点之间的距离edge;伪码算法:Main()path=(edge *)malloc(MAX*sizeof(edge);for(v=0;vMAX;v+)pathv=(edge *)malloc(1000*sizeof(edge);TD=(view *)malloc(MAX*sizeof(view);D=(DistancMatrix )malloc(MAX*sizeof(DistancMatrix);P=(PathMatrix )malloc(MAX*sizeof(PathMatrix

28、);for(v=0;vn|in|j0) printf(输入信息错误!nn); printf(请再次输入要查询的两个景点的编号并用.间隔:n); scanf(%d.%d,&i,&j); else floyed(); display(i,j); return 1;/*shortestdistance*/*用floyed算法求两个景点的最短路径*/void floyed() int i,j,k; for(i=1;i=n;i+) for(j=1;j=n;j+) shortestij=costij; pathij=0; for(k=1;k=n;k+) for(i=1;i=n;i+) for(j=1;j(

29、shortestik+shortestkj) /*用path记录从i到j的最短路径上点j的前驱景点的序号*/ shortestij=shortestik+shortestkj; pathij=k; pathji=k; /*floyed*/void display(int i,int j) /* 打印两个景点的路径及最短距离 */ int a,b; a=i; b=j; printf(您要查询的两景点间最短路径是:nn); if(shortestij!=INT_MAX) if(ji) printf(%d,b); while(pathij!=0) /* 把i到j的路径上所有经过的景点按逆序打印出来*

30、/ printf(-%d,pathij); if(ij) j=pathij; else i=pathji; printf(%d)最短距离是:%d米nn,a,b,shortestab); else printf(%d,a); while(pathij!=0) /* 把i到j的路径上所有经过的景点按顺序打印出来*/ printf(-%d,pathij); if(i%d,b); printf(nn); printf(%d-%d)最短距离是:%5d米nn,a,b,shortestab); elseprintf(输入错误!不存在此路!nn); printf(n);/*display*/4) 调试分析(1

31、)设计过程中遇到的问题:调试过程中最主要的问题在floyed算法上。当时学习时就感觉很吃力,没怎么弄明白。算法确实是按照书上所写的抄到了程序中。最短路径确实也存到了数组Pv0v中,可是在输出相应的景点名称时总不能输出正确,感觉无从下手,后来才明白数组P中的存储是按照一定的顺序存储的但是并不一定是路径中所途经的景点的顺序,所以最后选择在求最短路径过程中将其输出。回顾讨论和分析:floyed算法算法用来找出每对点之间的最短距离。它需要用邻接矩阵来储存边,这个算法通过考虑最佳子路径来得到最佳路径。(2)算法的时空分析主要是floyed算法的时空分析:在计算到剩下的MAX-1个顶点的最短距离时第一个f

32、or循环时时间复杂度是O(n),每进行一次第二个for循环的时间复杂度都是O(n),第三个for循环也就是存储途经顶点时用的循环而不是书中算法所用的只是个地址的赋值,所以时间复杂度也是O(n),这样总的时间复杂度就是O(n3)。5) 用户使用说明程序刚运行时显示菜单。 输入x进入景点信息查询; 输入z进入最快到达路径查询; 输入t退出系统;6) 测试结果 3. 设计评述 本次设计过程总体算是顺利的,不过也在调试过程中遇到了一些的问题。尤其是floyed算法,当时学习时就感觉很吃力,没怎么弄明白。不过采用floyed算法要比迪杰斯特拉算法方便很多,所以在这一点上,本程序还是相当不错的。 通过本次设计过程,我又一次深深明白平时学习扎实牢靠的重要性,只有平时学的好,用的时候才能得心应手,我想在以后的工作一定会体现的更加明显,所以平时学习千万不能再放松了。4. 参考资料 数据结构C语言版,离散数学,C语言程序设计基础等。5. 附录:源程序#include #include #define INT_MAX 10000#define n 10using namespace std; /*定义全局变量*/int costnn;/* 边的值*/int shor

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 技术资料 > 课程设计

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922