运动会分数统计系统

发布时间:2024年01月19日

1 需求分析

1.1 任务

????????参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。哪些项目取前五名或前三名由学生自己设定。

1.2 功能及规定

????????1.功能要求:

????????1)可以输入前三名或前五名的项目编号、运动员姓名、校名和名次(成绩);

????????2)可以产生各学校的成绩单;

????????3)可以按学校编号、学校总分、男女团体总分排序输出;

????????4)可以按学校编号查询学校的得分情况,可以按项目编号查询取得前三或前五名的得分情况。

????????2.规定:

????????1)输入数据的形式和范围:10以内的整数,除此之外还可以输入学校的名称运动项目的名称;

????????2)输出形式:有中文提示,各学校分数为整形;

????????3)界面要求:有合理的提示,每个功能可以设立菜单,根据提示完成相关的功能要求;

????????4)测试数据:使用“全部合法数据”、“整体非法数据”、“局部非法数据”,进行程序测试,以保证程序的稳定。

2 概要设计

????????该程序设计旨在满足输入信息、统计分数、排序和查找功能的需求。考虑到主要操作是排序和查找,而不是插入和删除,因此选择链表作为数据结构。结构体和结构体数组用于定义数据,确保属性间的内在联系。学校数和项目数被设计为可变,以适应不同情况。为方便使用,提供了菜单功能。信息存储在文件中,因此设计了文件的存储与读取函数。输入基本信息后,系统会统计总分并保存到文件中。后续操作会从文件中读取数据。排序部分采用插入排序法,可根据不同关键字进行排序。查询函数则基于链表实现,以满足快速查找的要求。整体而言,该程序旨在提供高效、灵活的数据处理功能。

图2.1 运动会分数统计系统概述图

3 详细设计

3.1 抽象数据类型

3.1.1 学校数据表

????????本数据表根据要求储存了各个参赛学校的总体情况,包括学校的编号、学校的名称、学校总分、男生团体总分、女生团体总分。其中 schNum 和 name 中的数据由输入信息输入,而其他三项内容 score , man_score , women_score 将由系统进行自动统计。

????????struct School {

?????????? int schNum; ?????//学校编号

?????????? string name; ????//学校名称

?????????? int score; ??????//学校总分

?????????? int man_score;? ?//男生团体总分

?????????? int women_score; //女生团体总分

?????????? School* next;

????????}*Sch;

3.1.2 项目数据表

????????运动会分数统计系统会先制定本次运动会所需的参赛项目,即完成初始化。本数据表根据要求设计存储每个项目的编号、名称、性别类型、要取的名次类型和各个名次的运动员姓名、分数,用于对以后项目情况的统计已及查询。其中 prNum , name , sex , type , top_name[5] , top_score[5] 由输入信息输入。

????????struct Project {

?????????? int prNum; ?????????//项目编号

?????????? string name;?????? ?//项目名称

?????????? int sex; ???????????//区分男女项目,男为1,女为0

?????????? int type; ??????????//名次类型

?????????? string top_name[5]; //姓名名次

?????????? int top_score[5]; ??//分数每次

?????????? Project* next;

????????} *Pro;

3.2 操作算法

3.2.1 初始化操作 void Initialization()

图3.1 初始化操作流程图

3.2.2 成绩录入操作 void Input()

图3.2 成绩录入操作流程图

3.2.3 统计各学校总分功能 void Sum_Score()

图3.3 统计各学校总分功能流程图

3.2.4 按照编号输出学校总分功能 void Sc_numsort()

图3.4 按照编号输出学校总分功能流程图

3.2.5 按照总分大小排序功能 void Sc_scoreSort()

图3.5 按照编号输出学校总分功能流程图

3.2.6 按照男生团体分数排序功能 void Sc_ManSort()

图3.6 按照男生团体分数排序功能流程图

3.2.7 按照女团体分数排序功能 void Sc_WomanSort()

图3.7 按照女团体分数排序功能流程图

3.2.8 按照学校编号查询功能 void Find_Scnum()

图3.8 按照学校编号查询功能流程图

3.2.9 按照项目编号查询功能 void Find_ProNum()

图3.9 按照项目编号查询功能流程图

4 调试分析

4.1 调试过程中遇到的问题

????????1.在初始化时,怎么结合使用链表和文件?

????????每次进行程序测试时,都需要手动输入大量的数据,这不仅繁琐,而且效率低下。于是,我考虑采用文件来存储测试数据,从而大大加快测试进程。

????????然而,在只使用文件存储数据时,我发现如果没有抽象数据类型结构体的辅助,很容易在处理数据时出现逻辑错误。例如,可能会混淆不同类型的数据,或者在读取数据时发生错误。

????????为了解决这个问题,我决定采用链表和文件结合的方式。具体来说,我在写入文件的同时,也创建了一个链表来存储相同的数据。这样,既可以利用文件快速读取大量数据,又可以利用链表方便地进行数据的插入、删除等操作。

????????此外,我还编写了一个函数,该函数通过读取文件来构造链表。这样,我就可以在需要时快速地创建链表,而不需要每次都手动输入数据。这不仅提高了我的其他函数方法的效率,也使得整个程序更加健壮和易于维护。

????????2.在排序时选择什么排序方法更适合?

????????首先应该如何选择适合的排序方法,需要考虑数据的大小、类型和特定需求。对于少量数据的排序,大多数排序算法都可以满足要求。然而,对于大量数据,需要选择时间复杂度较低的算法,如快速排序、归并排序或堆排序。

????????然后是实现排序算法,需要确保代码的正确性和可读性。对于简单的排序算法,如冒泡排序、选择排序和插入排序,可以使用C++标准库中的函数。对于更复杂的算法,需要自行编写代码。

4.2 算法的时空效率分析和改进设想

????????1.时空效率分析

????????(1)空间效率:使用链表来存储运动会数据,其空间效率相对较高。链表是一种动态数据结构,可以根据需要动态地分配或释放内存空间,这在处理运动会成绩时可能会很有用。

????????另一方面,使用文件来存储数据可以极大地节省内存空间。当数据量大到无法全部装入内存时,文件存储是一个很好的选择。文件I/O操作相对较慢,但对于长期存储大量数据非常有效。

????????(2)时间效率:链表的时间效率主要取决于操作的性质。在链表中查找特定元素通常需要O(n)的时间,其中n是链表的长度。

????????文件I/O操作通常比内存操作慢得多。每次读写文件都需要磁盘寻道和数据传输,这些操作可能会花费大量的时间。特别是当需要频繁读写文件时,时间效率可能会成为一个问题。

????????2.改进设想

????????(1)使用更高效的数据结构:虽然链表在某些方面具有优势,但对于这个问题,可能还有其他更高效的数据结构。例如,可以使用哈希表来存储学校和项目的信息,这样可以实现O(1)的平均查找时间。当然,哈希表需要更多的内存空间,但对于提高时间效率非常有帮助。

????????(2)代码优化:可以通过优化代码来提高程序的执行效率。例如,可以消除不必要的循环和条件语句,使用更快的算法和数据结构,以及优化内存使用等。

5 用户使用说明

????????1.程序启动

????????通过集成环境启动程序。

????????2.初始化学校信息和项目信息

????????按照提示信息逐步输入。

????????3.欢迎界面

????????初始化信息后,将显示欢迎界面,以及功能菜单。

????????--------------------------------------

????????????????1.输入成绩并存储

???? ???????????2.统计各学校总分

?????????????? ?3.按学校编号排序输出

????????????? ??4.按学校总分排序输出

???????????? ???5.按男子总分排序输出

???????????? ???6.按女子总分排序输出

???????????? ???7.按学校编号查询

???????????? ???8.按项目编号查询

??????????? ????9.退出

????????--------------------------------------

????????4.使用各项功能

????????(1)输入成绩并存储

????????输入1后,按照提示要求输入每个学校的编号、学校名称、参赛运动员的姓名和比赛名次,录入成绩;

????????(2)统计各学校总分

????????输入2后,生成各学校的成绩单;

????????(3)按学校编号排序输出

????????输入3后,生成按照学校编号排序的成绩单;

????????(4)按学校总分排序输出

????????输入4后,生成按照学校总分排序的成绩单;

????????(5)按男子总分排序输出

????????输入5后,生成按照男子总分排序的成绩单;

????????(6)按女子总分排序输出

????????输入6后,生成按照女子总分排序的成绩单;

????????(7)按学校编号查询

????????输入7后,输入要查询的学校编号,程序将显示查询结果;

????????(8)按项目编号查询

????????输入8后,输入要查询的项目编号,程序将显示查询结果。

????????5.退出程序

????????在欢迎界面中,输入9后程序将关闭并退出。

6 测试结果

????????1.初始化信息

图6.1 测试结果截屏

2.成绩录入

图6.2 测试结果截屏

3.打印各学校成绩单

图6.3 测试结果截屏

4.按照学校编号打印成绩单

图6.4 测试结果截屏

5.按照学校总分大小打印成绩单

图6.5 测试结果截屏

6.按照男子团体总分大小打印成绩单

图6.6 测试结果截屏

7.按照女子团体总分大小打印成绩单

图6.7 测试结果截屏

8.根据输入的编号查找相应的学校得分情况

图6.8 测试结果截屏

9.根据输入的编号查找相应的项目得分情况

图6.9?测试结果截屏

10.退出程序

图6.10 测试结果截屏

7 总结和体会

????????这次课程设计让我收获颇丰,我深刻认识到了理论学习与实践操作相结合的重要性。通过编写运动会分数统计系统,我不仅巩固了C++语言和数据结构知识,还学会了如何在实际项目中运用这些知识。

????????在实践过程中,我遇到了一些挑战。首先,在初始化时如何结合使用链表和文件是一大难题。手动输入大量数据不仅繁琐,而且容易出错。为了解决这个问题,我采用了文件存储测试数据,并利用链表进行数据管理。这样既提高了数据读取速度,又方便了对数据进行操作。

????????其次,选择合适的排序方法也是一大挑战。对于少量数据的排序,大多数排序算法都能满足要求。然而,对于大量数据,需要选择时间复杂度较低的算法。我最终选择了插入排序算法,虽然其时间复杂度不是最优,但在实际应用中表现稳定,且易于实现。

????????此外,我还意识到代码优化在提高程序性能方面的重要性。通过消除不必要的循环和条件语句、使用更快的算法和数据结构以及优化内存使用,可以显著提高程序的执行效率。

????????这次课程设计让我明白了学习编程不能仅停留在书本知识上,还需要通过实践不断锻炼自己的能力。只有多编写程序、多进行实践操作,才能更好地掌握和运用所学知识。同时,遇到问题时要勇于面对并积极寻求解决方案。

????????????? ??????

参考文献

[1] 严蔚敏.数据结构C语言版[M].清华大学出版社,2007.

[2] 逯鹏,张赞.数据结构课程教学方法的研究和实践[J].教育教学论坛,2015(18):121-123.

[3] 贾丹,周军.基于创新应用型人才培养模式的数据结构课程教学改革[J].辽宁工业大学学报:社会科学版,2015(2):132-134.

[4] 郭艳燕,童向荣,孙雪姣,等.程序设计基础与数据结构两门课程的教学衔接[J].计算机教育,2014(10):47-50.

[5] 高贤强,化希耀,陈立平.引入计算思维的《数据结构》教学改革研究[J].现代计算机:专业版,2015(7):16-19.

文章来源:https://blog.csdn.net/weixin_73286497/article/details/135678948
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。