您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 保龄球计分管理课程设计报告-孙魏东
合肥学院计算机科学与技术系课程设计报告2016~2017学年第1学期课程面向过程综合设计课程设计名称保龄球计分管理系统学生姓名孙魏东学号1504092006专业班级软件工程(2)班指导教师周艳玲2016年9月一、需求分析1、问题描述打保龄球是用一个滚球去撞击10个站立的瓶,将瓶击倒。一局分10轮,每轮可滚球1次或多次,以击到的瓶数为依据计分,一局得分为10轮得分之和,而每轮的得分不仅与本轮的滚球情况有关,还可能与后一轮或两轮的滚球情况有关,即:某轮某次滚球击倒的瓶数不仅要计入本轮得分,还可能会计入前一轮或两轮得分。计分规则如下:(1)若某一轮的第一次滚球就击倒全部10个瓶,则本轮不再滚球(若是第10轮还需加2次滚球),该轮得分为本次击倒瓶数10与以后2次滚球所击倒瓶数之和。(2)若某一轮的第一次滚球未击倒全部10个球,则对剩下未击倒的瓶再滚球一次,如果这2次滚球击倒全部10个瓶,则本轮不再滚球(若是第10轮还需加1次滚球),该轮得分为这2次击倒瓶数10与以后1次滚球所击倒瓶数之和。(3)若某一轮2次滚球未击倒全部10个瓶,则本轮不再滚球,该轮得分为这2次滚球所击倒瓶数之和。2、程序有如下几个功能(1)从键盘录入比赛数据(2)计算总分排名并向屏幕输出排名信息(3)向自定义文件写入比赛数据保存到指定目录(4)退出系统二、算法设计1、设计思想switch结构来达到输入数字来进行选项操作。然后通过定义大量的函数然后在swtich中来一个个调用函数来进行运算和处理。由于要使得系统能一次输入多个人比赛记录并保存,读写文件时先把每局每个人数据存入一个能存放比赛数据的结构体链表中然后将整个结构体链表存入文件file中,读写文件一律采用字符读写方式读写。输入比赛数据以及输出比赛最终数据时利用链表遍历依次输出,对于保龄球第十格击球的特殊性再加入if语句判断然后根据不同情况进行输入计算总分。显示部分先定义Menu函数用来在程序开始前构造菜单,定义Star_Entering函数得到比赛数据后进行录入计算积分,然后利用Score_Ranking指针函数计算比分结果后直接显示比赛排名,最后可以保存数据到文件file中以备下次查看。在程序中,充分运用清屏函数可以使程序显得直观简洁。同时在不退出程序的时候,如不进行将比赛总得分数据存入文件的选项,每局每个人比赛数据都存在一个结构体链表中,然后可以选择是否把整个结构体链表读入文件并存储以便下次直接读取并显示。(1)程序流程图根据需求作出系统程序流程图如图1所示:图1系统流程图(2)重要的数据结构本程序中采用了链表和结构体以及少量数组存储的数据类型,提高了程序的运行效率。开始登陆输入密码输入正确?菜单输入operand1?2?3?N退出系统NNYYYWrite_File()信息写入文件Score_Ranking()排名输出Star_Entering()录入得分NYNY输入验证码验证码正确?(3)主要算法的思想1)本程序在数据的录入时采用了结构体链表存储数据的算法,在运行上极大的提高了效率,同时在函数之间采用了链表传递数据算法,其次程序融合了许多容错机制,保障了程序的稳定性,和健壮性,以便在用户进行非法操作时程序不会意外终止。2)本程序在计算排名时采用了快速排序算法,极大的提高了程序的运行速率,保障了本程序在运行上的高效性。2、设计表示本系统主要包括七个函数功能模块(1)login()登录模块函数原型:voidlogin();功能:输入用户名和密码登录系统。输入参数:用户名(szUser)XXX。输出参数:输入密码同时屏幕回显“*”。(2)menu()菜单模块函数原型:intmenu();功能:在显示屏上输出菜单选项,供用户操作。输入参数:operand操作数。输出参数:对应的功能。(3)Star_Entering()信息录入模块函数原型:Bowls*Star_Entering();功能:按保龄球比赛规则录入比赛得分。输入参数:Bowls*p;用链表来记录比赛数据。(4)Score_Ranking()信息排名模块函数原型:Bowls*Score_Ranking(Bowls*phead)功能:输入参数:无输入。输出参数:Bowls*p;已经赋值了链表包含比赛数据以及最终总得分并排名。(5)Write_File()写入文件模块函数原型:Bowls*Write_File(Bowls*phead)功能:将比赛排名后的总成绩写入自定义文件名中输入参数:Bowls*p;输出参数:无输出将比赛最终排名和总得分信息写入文件。(6)Quicksort()排序模块函数原型:voidQuicksort(ball*a,intlow,inthight)功能:快速排序函数输入参数:ball*a,intlow,inthighta及每格所得分数。输出参数:ball*a(7)Quit_System()退出系统模块函数原型:voidQuit_System()功能:系统使用完毕输入参数:operand输出参数:输出退出系统提示信息。3、实现注释(1)在本保龄球计分管理系统中模拟10个人各打一局保龄球比赛过程,统计每局各轮得分和累计总分在程序中已经实现,在此功能实现的基础上还增加了在之前提供给用户一个登陆功能模块,即从键盘读入字符串数组用户名szUser[20],密码chPwd[20],与程序内置的用户名PUser[20],密码Pword[20]进行比较,如果相等则登录成功,同时在登录的基础上还实现了验证码模块,密码输入正确进入系统,否则错误三次则进入验证码输出模块。(2)在本保龄球计分管理系统中逐人逐轮逐次输入一次滚球击倒的瓶数功能已经实现,运行测试结果完好,符合设计要求,同时在实现基本信息录入的基础上还增加了程序的容错机制,通过利用dowhile来改写scanf函数来实现,即用户输入错误的数据不会出现系统崩溃问题。(3)在本保龄球计分管理系统中对10人的得分由低到高排序并显示功能已经实现,且运行效果很好,这里本程序在原先传统冒泡排序算法的基础上采用了其他算法,快速排序算法,通过把从结构体传递过来的信息,按照结构体中的得分信息为依据进行排序,排序利用快速排序算法,即先找到数组中某个元素的位置,然后以该元素位置为依据,对后面的元素分块定位,最终找到其他元素位置。使得本程序在排序上更加高效,相比原先的冒泡等其他排序方法在时间复杂度上较低,有利于程序的高效性。(4)在本保龄球计分管理系统中把排序的存入文件中功能已经实现,且运行效果很好,完全符合设计要求,同时在实现基本文件读写操作的基础上还增加了自定义文件名功能,即用户在保存第一次得分记录后,在下一次计分时只要定义另外一个文件名就不会覆盖第一次的保存数据,从而实现了文件信息的永久保存。4、算法设计中一些新的想法:(1)本程序在scanf函数输入得分时加入了dowhile语句,提高了程序的容错性,容错机制也非常强大,支持用户基本所有输入错误。比如不慎输入字符或字符串不兼容等问题。(2)本程序虽然在排序上采用了快速排序法,有效的降低了程序的时间复杂度,但是在排序前对于链表和结构体数组之间进行了两次转化,显得有些麻烦,还有待更好的算法对其进行优化处理。(3)本程序在功能上还可以额外增加一些功能,比如对选手信息的查找,修改和删除等一些操作,但是由于课程设计要求并无此要求,所以对于这些功能没有对其实现,所以作为扩展,本程序还有很大的优化空间。三、用户手册用户在使用本系统时,这里有几点说明要解释和使用过程中的注意事项,以便用户更好和正确的使用本系统。1、初始用户名:swd,初始用户登录密码:123456如下图2所示:图2登录示例2、输入数据要求,如图3所示:第一轮滚球第一次滚球得分:第二次滚球得分:第二轮滚球第一次滚球得分:第二次滚球得分:...................图3登录示例每次输入的得分数据都为1-10内的整型数字,不能输入其他大于10或小于0的数字,当然本系统自带容错机制,如若不慎输入了其他不符合条件的数字,系统提示无法继续执行,用户需要再次输入得分数据,直到输入的数据正确才继续往下执行,本程序的容错机制非常强大,基本输入错误均不会导致程序崩溃,用户可放心使用。3、操作过程通过选择功能前对应的数字,按回车键确定,用户必须严格按照操作顺序执行相应操作,例如必须在录入得分后才能进行排名操作。4、文件名为自定义名字,存储该程序所在当前目录下,不能改变存储位置。四、调试及测试1、在本次程序设计中主要遇到了如下问题并给出解决方案(1)在计分录入的函数中,数据录入链表过程中,输出信息总是会出现乱码问题,开始不清楚为什么,在整个链表数据节点地址指向方面均无问题,就是输出的结果总是会出现大量的乱码,并且程序会陷入死循环。最终经过一系列的排查发现是链表的为节点忘记置空所致(r-next=NULL),这样之所以会导致问题的原因我也做了一些分析,由于链表的尾节点没有置空,所以在输出的时候无法判断循环是否结束,所以会一直输出,开始的数据是正确的,后面全是乱码,最终导致程序意外终止,如下图4所示。图4程序意外停止(2)在计分录入函数中,由于第十组数据特殊,关系到是否追加两次滚球还是追加一次滚球。在开始的系统编写时,我把第十组数据在循环中用if对其进行操作,后来发现还是有很多情况if无法全部解决,录入的数据会出现很多不符合实际情况的数据,从而最终导致这个算法无法实现功能上的要求。最终想到了另外的一种算法解决了问题,就是把第十组数据单独拿出来进行讨论,考虑追加一次还是两次滚球或是不追加滚球,修改后程序运行正常,截图如下图5所示。图5修改后程序运行正常(3)在计分排名函数中,开始运用了冒泡排序的算法,基本的功能也实现了,后来考虑到这样写还是有些繁琐,最主要的还是在算法上不太好,时间复杂度较高,如果运行的数据较多时会降低运算速率,不太利于程序的高效性。最终思考了很久,想起了曾经学习过的快速排序算法,就对快速排序算法做一些修改,最终用在本程序,取代了原有的冒泡排序算法,算是功能上的一次小规模的优化操作。(4)在排名信息写入文件的操作中,开始采用传统的文件操作方式,即实现在程序中定义好文件名。后来的测试发现,这样写的算法不太好,因为从程序的实际意义上考虑,这样写默认了用户只能保存一组数据,在下一次使用本系统就会将第一次的数据进行覆盖,实用性能不高。如果用户在一次使用完毕后需要再次使用本系统时,便会出现问题,从而导致本系统无法满足用户实际需求。所以后来我对其进行了优化操作,使得文件名可以进行自定义,所以用户每次的数据都可以存放在不同的文件中,从而实现了文件信息的永久保存,如下图6所示。图6文件信息保存2、对设计和编码的回顾讨论和分析在本次设计中在计算比分排名时,印象深刻,开始运用了冒泡排序的算法,基本的功能也实现了,for(intt=j;ti-1;t++){if(maxnumpnum[t+1]){`maxnum=pnum[t];pnum[t]=maxnum;maxnum=pnum[t+1];strcpy(maxname,pname[t+1]);pnum[t+1]=pnum[j];strcpy(pname[t+1],pname[j]);pnum[j]=maxnum;strcpy(pname[j],maxname);}}后来考虑到这样写还是有些繁琐,最主要的还是在算法上不太好,时间复杂度较高,如果运行的数据较多时会降低运算速率,不太利于程序的高效性。最终考虑决定采用新的算法替换此算法,于是采用了数据结构中的快速排序算法,就对快速排序算法做一些修改,最终得以用在本程序,取代了原有的冒泡排序算法,算是功能上的一次小规模的优化操作。3、程序运行的时空效率分析开始程序采用了冒泡排序算法,但是进过大量的数据测试发现例如在数据达到6000个时,排序算法就会显得有时间速率上的缺陷,6000个数据冒泡排序需要72毫秒。测试截图如下:图7冒泡排序时间测试截图而采用快速排序后极大的缩短了运行时间,同样的6000个数据,只需要1毫秒,比常用的冒
本文标题:保龄球计分管理课程设计报告-孙魏东
链接地址:https://www.777doc.com/doc-2690816 .html