基于【链表】结合使用【文件】实现运动会分数统计系统

目录

1 需求分析

1.1 任务

1.2 功能及规定

2 概要设计

3 详细设计

3.1 抽象数据类型

3.1.1 学校数据表

3.1.2 项目数据表

3.2 操作算法

3.2.1 初始化操作 void Initialization()

3.2.2 成绩录入操作 void Input()

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

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

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

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

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

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

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

4 调试分析

4.1 调试过程中遇到的问题

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

5 用户使用说明

6 测试结果

7 总结和体会

参考文献


阅读建议:

1.实验的软硬件环境要求:

(1)硬件环境要求:PC机
(2)软件环境要求:Windows 环境下的 Microsoft Visual Studio

2.该实验采用了源文件(.cpp)和文件(.txt)相结合的形式。


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 概要设计

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第1张图片

图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()

基于【链表】结合使用【文件】实现运动会分数统计系统_第2张图片

图3.1 初始化操作流程图

3.2.2 成绩录入操作 void Input()

基于【链表】结合使用【文件】实现运动会分数统计系统_第3张图片

图3.2 成绩录入操作流程图

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第4张图片

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

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第5张图片

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

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第6张图片

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

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第7张图片

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

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第8张图片

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

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第9张图片

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

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第10张图片

图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.初始化信息

基于【链表】结合使用【文件】实现运动会分数统计系统_第11张图片

图6.1 测试结果截屏

2.成绩录入

基于【链表】结合使用【文件】实现运动会分数统计系统_第12张图片

图6.2 测试结果截屏

3.打印各学校成绩单

基于【链表】结合使用【文件】实现运动会分数统计系统_第13张图片

图6.3 测试结果截屏

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第14张图片

图6.4 测试结果截屏

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第15张图片

图6.5 测试结果截屏

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第16张图片

图6.6 测试结果截屏

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第17张图片

图6.7 测试结果截屏

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第18张图片

基于【链表】结合使用【文件】实现运动会分数统计系统_第19张图片

图6.8 测试结果截屏

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

基于【链表】结合使用【文件】实现运动会分数统计系统_第20张图片

基于【链表】结合使用【文件】实现运动会分数统计系统_第21张图片

图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://download.csdn.net/download/weixin_73286497/88758266

        希望大家可以在该篇课程设计中有所收获,同时也感谢各位大佬的支持。文章如有任何问题请在评论区留言斧正,鸿蒙会尽快回复您的建议!

你可能感兴趣的:(#,C++,数据结构,c++,visual,studio,数据结构,链表,算法,课程设计)