保龄球计分管理课程设计报告-孙魏东

上传人:第*** 文档编号:55649407 上传时间:2018-10-03 格式:DOCX 页数:41 大小:390.91KB
返回 下载 相关 举报
保龄球计分管理课程设计报告-孙魏东_第1页
第1页 / 共41页
保龄球计分管理课程设计报告-孙魏东_第2页
第2页 / 共41页
保龄球计分管理课程设计报告-孙魏东_第3页
第3页 / 共41页
保龄球计分管理课程设计报告-孙魏东_第4页
第4页 / 共41页
保龄球计分管理课程设计报告-孙魏东_第5页
第5页 / 共41页
点击查看更多>>
资源描述

《保龄球计分管理课程设计报告-孙魏东》由会员分享,可在线阅读,更多相关《保龄球计分管理课程设计报告-孙魏东(41页珍藏版)》请在金锄头文库上搜索。

1、合肥学院计算机科学与技术系课程设计报告2016 2017 学年第 1 学期课程课程面向过程综合设计课程设计名称课程设计名称保龄球计分管理系统学生姓名学生姓名 孙魏东学号学号 1504092006专业班级专业班级 软件工程(2)班指导教师指导教师周艳玲2016 年 9 月一、需求分析一、需求分析1、问题描述打保龄球是用一个滚球去撞击 10 个站立的瓶,将瓶击倒。一局分 10 轮,每轮可滚球 1 次或多次,以击到的瓶数为依据计分,一局得分为 10 轮得分之和,而每轮的得分不仅与本轮的滚球情况有关,还可能与后一轮或两轮的滚球情况有关,即:某轮某次滚球击倒的瓶数不仅要计入本轮得分,还可能会计入前一轮或

2、两轮得分。计分规则如下:(1)若某一轮的第一次滚球就击倒全部 10 个瓶,则本轮不再滚球(若是第 10 轮还需加2 次滚球) ,该轮得分为本次击倒瓶数 10 与以后 2 次滚球所击倒瓶数之和。(2)若某一轮的第一次滚球未击倒全部 10 个球,则对剩下未击倒的瓶再滚球一次,如果这 2 次滚球击倒全部 10 个瓶,则本轮不再滚球(若是第 10 轮还需加 1 次滚球) ,该轮得分为这 2 次击倒瓶数 10 与以后 1 次滚球所击倒瓶数之和。(3)若某一轮 2 次滚球未击倒全部 10 个瓶,则本轮不再滚球,该轮得分为这 2 次滚球所击倒瓶数之和。 2、程序有如下几个功能(1)从键盘录入比赛数据(2)计

3、算总分排名并向屏幕输出排名信息(3)向自定义文件写入比赛数据保存到指定目录(4)退出系统二、算法设计二、算法设计1、设计思想因为这是一个计分系统所以在主函数中采用 switch 结构来达到输入数字来进行选项操作。然后通过定义大量的函数然后在 swtich 中来一个个调用函数来进行运算和处理。由于要使得系统能一次输入多个人比赛记录并保存,读写文件时先把每局每个人数据存入一个能存放比赛数据的结构体链表中然后将整个结构体链表存入文件 file 中,读写文件一律采用字符读写方式读写。 输入比赛数据以及输出比赛最终数据时利用链表遍历依次输出,对于保龄球第十格击球的特殊性再加入 if 语句判断然后根据不同

4、情况进行输入计算总分。显示部分先定义 Menu 函数用来在程序开始前构造菜单,定义 Star_Entering 函数得到比赛数据后进行录入计算积分,然后利用 Score_Ranking 指针函数计算比分结果后直接显示比赛排名,最后可以保存数据到文件 file 中以备下次查看。在程序中,充分运用清屏函数可以使程序显得直观简洁。同时在不退出程序的时候,如不进行将比赛总得分数据存入文件的选项,每局每个人比赛数据都存在一个结构体链表中,然后可以选择是否把整个结构体链表读入文件并存储以便下次直接读取并显示。 (1)程序流程图根据需求作出系统程序流程图如图 1 所示:图 1 系统流程图(2)重要的数据结构

5、本程序中采用了链表和结构体以及少量数组存储的数据类型,提高了程序的运行效率。(3)主要算法的思想1)本程序在数据的录入时采用了结构体链表存储数据的算法,在运行上极大的提高了效率,同时在函数之间采用了链表传递数据算法,其次程序融合了许多容错机制,保障了程序的稳定性,和健壮性,以便在用户进行非法操作时程序不会意外终止。2)本程序在计算排名时采用了快速排序算法,极大的提高了程序的运行速率,保障了本程序在运行上的高效性。2、设计表示本系统主要包括七个函数功能模块(1)login()登录模块 函数原型: void login(); 功 能: 输入用户名和密码登录系统。输入参数: 用户名(szUser)X

6、XX。输出参数: 输入密码同时 屏幕回显“*” 。(2)menu()菜单模块 函数原型: int menu (); 功 能: 在显示屏上输出菜单选项,供用户操作。输入参数: operand 操作数 。输出参数: 对应的功能。(3)Star_Entering()信息录入模块 函数原型: Bowls * Star_Entering(); 功 能: 按保龄球比赛规则录入比赛得分。输入参数: Bowls *p;用链表来记录比赛数据。输出参数无输出。(4)Score_Ranking()信息排名模块 函数原型: Bowls * Score_Ranking(Bowls *phead);功 能: 按格式输出比

7、赛最终总成绩排名信息输入参数: 无输入。输出参数: Bowls *p;已经赋值了链表 包含比赛数据以及最终总得分并排名。(5)Write_File()写入文件模块 函数原型: Bowls * Write_File(Bowls *phead);功 能: 将比赛排名后的总成绩写入自定义文件名中 便于后期查看输入参数: Bowls *p; 已经赋值的结构体链表输出参数: 无输出 将比赛最终排名和总得分信息写入文件。(6)Quicksort()排序模块 函数原型: void Quicksort(ball *a ,int low ,int hight);功 能: 快速排序函数 将录入的比分信息进行计算总

8、得分排序输入参数: ball *a ,int low ,int hight已经赋值了 a 结构体链表包含比赛数据以及每格所得分数。输出参数: ball *a 结构体链表输出到显示屏包含比赛数据以及最终得分排名信息。(7)Quit_System() 退出系统模块 函数原型: void Quit_System();功 能: 系统使用完毕 退出系统输入参数: operand操作数选择退出。 输出参数: 输出退出系统提示信息。3、实现注释(1)在本保龄球计分管理系统中模拟 10 个人各打一局保龄球比赛过程,统计每局各轮得分和累计总分在程序中已经实现,在此功能实现的基础上还增加了在之前提供给用户一个登陆

9、功能模块,即从键盘读入字符串数组用户名 szUser20,密码 chPwd20,与程序内置的用户名 PUser20,密码 Pword20进行比较,如果相等则登录成功,同时在登录的基础上还实现了验证码模块,密码输入正确进入系统,否则错误三次则进入验证码输出模块。(2)在本保龄球计分管理系统中逐人逐轮逐次输入一次滚球击倒的瓶数功能已经实现,运行测试结果完好,符合设计要求,同时在实现基本信息录入的基础上还增加了程序的容错机制,通过利用 do while 来改写 scanf 函数来实现,即用户输入错误的数据不会出现系统崩溃问题。(3)在本保龄球计分管理系统中对 10 人的得分由低到高排序并显示功能已经

10、实现,且运行效果很好,这里本程序在原先传统冒泡排序算法的基础上采用了其他算法,快速排序算法,通过把从结构体传递过来的信息,按照结构体中的得分信息为依据进行排序,排序利用快速排序算法,即先找到数组中某个元素的位置,然后以该元素位置为依据,对后面的元素分块定位,最终找到其他元素位置。使得本程序在排序上更加高效,相比原先的冒泡等其他排序方法在时间复杂度上较低,有利于程序的高效性。(4)在本保龄球计分管理系统中把排序的存入文件中功能已经实现,且运行效果很好,完全符合设计要求,同时在实现基本文件读写操作的基础上还增加了自定义文件名功能,即用户在保存第一次得分记录后,在下一次计分时只要定义另外一个文件名就

11、不会覆盖第一次的保存数据,从而实现了文件信息的永久保存。4、算法设计中一些新的想法:(1)本程序在 scanf 函数输入得分时加入了 do while 语句,提高了程序的容错性,容错机制也非常强大,支持用户基本所有输入错误。比如不慎输入字符或字符串不兼容等问题 。(2)本程序虽然在排序上采用了快速排序法,有效的降低了程序的时间复杂度,但是在排序前对于链表和结构体数组之间进行了两次转化,显得有些麻烦,还有待更好的算法对其进行优化处理。(3)本程序在功能上还可以额外增加一些功能,比如对选手信息的查找,修改和删除等一些操作,但是由于课程设计要求并无此要求,所以对于这些功能没有对其实现,所以作为扩展,

12、本程序还有很大的优化空间。三、用户手册三、用户手册用户在使用本系统时,这里有几点说明要解释和使用过程中的注意事项 ,以便用户更好和正确的使用本系统。1、初始用户名: swd ,初始用户登录密码:123456 如下图 2 所示:图 2 登录示例2、输入数据要求,如图 3 所示:第一轮滚球第一次滚球得分:第二次滚球得分:第二轮滚球第一次滚球得分:第二次滚球得分:.图 3 登录示例每次输入的得分数据都为 1-10 内的整型数字,不能输入其他大于 10 或小于 0 的数字,当然本系统自带容错机制,如若不慎输入了其他不符合条件的数字,系统提示无法继续执行,用户需要再次输入得分数据,直到输入的数据正确才继

13、续往下执行,本程序的容错机制非常强大,基本输入错误均不会导致程序崩溃,用户可放心使用。3、操作过程通过选择功能前对应的数字,按回车键确定,用户必须严格按照操作顺序执行相应操作,例如必须在录入得分后才能进行排名操作。4、文件名为自定义名字,存储该程序所在当前目录下,不能改变存储位置。四、调试及测试四、调试及测试1、在本次程序设计中主要遇到了如下问题并给出解决方案(1)在计分录入的函数中,数据录入链表过程中,输出信息总是会出现乱码问题,开始不清楚为什么,在整个链表数据节点地址指向方面均无问题,就是输出的结果总是会出现大量的乱码,并且程序会陷入死循环。最终经过一系列的排查发现是链表的为节点忘记置空所

14、致(r-next = NULL) ,这样之所以会导致问题的原因我也做了一些分析,由于链表的尾节点没有置空,所以在输出的时候无法判断循环是否结束,所以会一直输出,开始的数据是正确的,后面全是乱码,最终导致程序意外终止,如下图 4 所示。图 4 程序意外停止(2)在计分录入函数中,由于第十组数据特殊,关系到是否追加两次滚球还是追加一次滚球。在开始的系统编写时,我把第十组数据在循环中用 if 对其进行操作,后来发现还是有很多情况 if 无法全部解决,录入的数据会出现很多不符合实际情况的数据,从而最终导致这个算法无法实现功能上的要求。最终想到了另外的一种算法解决了问题,就是把第十组数据单独拿出来进行讨

15、论,考虑追加一次还是两次滚球或是不追加滚球,修改后程序运行正常,截图如下图 5 所示。图 5 修改后程序运行正常(3)在计分排名函数中,开始运用了冒泡排序的算法,基本的功能也实现了,后来考虑到这样写还是有些繁琐,最主要的还是在算法上不太好,时间复杂度较高,如果运行的数据较多时会降低运算速率,不太利于程序的高效性。最终思考了很久,想起了曾经学习过的快速排序算法,就对快速排序算法做一些修改,最终用在本程序,取代了原有的冒泡排序算法,算是功能上的一次小规模的优化操作。(4)在排名信息写入文件的操作中,开始采用传统的文件操作方式,即实现在程序中定义好文件名。后来的测试发现,这样写的算法不太好,因为从程

16、序的实际意义上考虑,这样写默认了用户只能保存一组数据,在下一次使用本系统就会将第一次的数据进行覆盖,实用性能不高。如果用户在一次使用完毕后需要再次使用本系统时,便会出现问题,从而导致本系统无法满足用户实际需求。所以后来我对其进行了优化操作,使得文件名可以进行自定义,所以用户每次的数据都可以存放在不同的文件中,从而实现了文件信息的永久保存,如下图 6 所示。图 6 文件信息保存2、对设计和编码的回顾讨论和分析在本次设计中在计算比分排名时,印象深刻,开始运用了冒泡排序的算法,基本的功能也实现了,for(int t = j ; t pnumt+1)maxnum = pnumt;pnumt = maxnum;maxnum = pnumt+1;strcpy(maxname,pnamet+1);pnumt+1 = pnumj;strcpy(pnamet+1,pnamej);pnumj = maxnum;strcpy(pnamej,maxn

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号