保龄球计分应用程序课程设计.doc
《保龄球计分应用程序课程设计.doc》由会员分享,可在线阅读,更多相关《保龄球计分应用程序课程设计.doc(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,则转到步骤(
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 保龄球 计分 应用程序 课程设计