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)相结合的形式。
参加运动会的n个学校编号为1~n。比赛分成m个男子项目和w个女子项目,项目编号分别为1~m和m+1~m+w。由于各项目参加人数差别较大,有些项目取前五名,得分顺序为7,5,3,2,1;还有些项目只取前三名,得分顺序为5,3,2。哪些项目取前五名或前三名由学生自己设定。
1.功能要求:
1)可以输入前三名或前五名的项目编号、运动员姓名、校名和名次(成绩);
2)可以产生各学校的成绩单;
3)可以按学校编号、学校总分、男女团体总分排序输出;
4)可以按学校编号查询学校的得分情况,可以按项目编号查询取得前三或前五名的得分情况。
2.规定:
1)输入数据的形式和范围:10以内的整数,除此之外还可以输入学校的名称运动项目的名称;
2)输出形式:有中文提示,各学校分数为整形;
3)界面要求:有合理的提示,每个功能可以设立菜单,根据提示完成相关的功能要求;
4)测试数据:使用“全部合法数据”、“整体非法数据”、“局部非法数据”,进行程序测试,以保证程序的稳定。
该程序设计旨在满足输入信息、统计分数、排序和查找功能的需求。考虑到主要操作是排序和查找,而不是插入和删除,因此选择链表作为数据结构。结构体和结构体数组用于定义数据,确保属性间的内在联系。学校数和项目数被设计为可变,以适应不同情况。为方便使用,提供了菜单功能。信息存储在文件中,因此设计了文件的存储与读取函数。输入基本信息后,系统会统计总分并保存到文件中。后续操作会从文件中读取数据。排序部分采用插入排序法,可根据不同关键字进行排序。查询函数则基于链表实现,以满足快速查找的要求。整体而言,该程序旨在提供高效、灵活的数据处理功能。
图2.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;
运动会分数统计系统会先制定本次运动会所需的参赛项目,即完成初始化。本数据表根据要求设计存储每个项目的编号、名称、性别类型、要取的名次类型和各个名次的运动员姓名、分数,用于对以后项目情况的统计已及查询。其中 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.1 初始化操作流程图
图3.2 成绩录入操作流程图
图3.3 统计各学校总分功能流程图
图3.4 按照编号输出学校总分功能流程图
图3.5 按照编号输出学校总分功能流程图
图3.6 按照男生团体分数排序功能流程图
图3.7 按照女团体分数排序功能流程图
图3.8 按照学校编号查询功能流程图
图3.9 按照项目编号查询功能流程图
1.在初始化时,怎么结合使用链表和文件?
每次进行程序测试时,都需要手动输入大量的数据,这不仅繁琐,而且效率低下。于是,我考虑采用文件来存储测试数据,从而大大加快测试进程。
然而,在只使用文件存储数据时,我发现如果没有抽象数据类型结构体的辅助,很容易在处理数据时出现逻辑错误。例如,可能会混淆不同类型的数据,或者在读取数据时发生错误。
为了解决这个问题,我决定采用链表和文件结合的方式。具体来说,我在写入文件的同时,也创建了一个链表来存储相同的数据。这样,既可以利用文件快速读取大量数据,又可以利用链表方便地进行数据的插入、删除等操作。
此外,我还编写了一个函数,该函数通过读取文件来构造链表。这样,我就可以在需要时快速地创建链表,而不需要每次都手动输入数据。这不仅提高了我的其他函数方法的效率,也使得整个程序更加健壮和易于维护。
2.在排序时选择什么排序方法更适合?
首先应该如何选择适合的排序方法,需要考虑数据的大小、类型和特定需求。对于少量数据的排序,大多数排序算法都可以满足要求。然而,对于大量数据,需要选择时间复杂度较低的算法,如快速排序、归并排序或堆排序。
然后是实现排序算法,需要确保代码的正确性和可读性。对于简单的排序算法,如冒泡排序、选择排序和插入排序,可以使用C++标准库中的函数。对于更复杂的算法,需要自行编写代码。
1.时空效率分析
(1)空间效率:使用链表来存储运动会数据,其空间效率相对较高。链表是一种动态数据结构,可以根据需要动态地分配或释放内存空间,这在处理运动会成绩时可能会很有用。
另一方面,使用文件来存储数据可以极大地节省内存空间。当数据量大到无法全部装入内存时,文件存储是一个很好的选择。文件I/O操作相对较慢,但对于长期存储大量数据非常有效。
(2)时间效率:链表的时间效率主要取决于操作的性质。在链表中查找特定元素通常需要O(n)的时间,其中n是链表的长度。
文件I/O操作通常比内存操作慢得多。每次读写文件都需要磁盘寻道和数据传输,这些操作可能会花费大量的时间。特别是当需要频繁读写文件时,时间效率可能会成为一个问题。
2.改进设想
(1)使用更高效的数据结构:虽然链表在某些方面具有优势,但对于这个问题,可能还有其他更高效的数据结构。例如,可以使用哈希表来存储学校和项目的信息,这样可以实现O(1)的平均查找时间。当然,哈希表需要更多的内存空间,但对于提高时间效率非常有帮助。
(2)代码优化:可以通过优化代码来提高程序的执行效率。例如,可以消除不必要的循环和条件语句,使用更快的算法和数据结构,以及优化内存使用等。
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后程序将关闭并退出。
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 测试结果截屏
这次课程设计让我收获颇丰,我深刻认识到了理论学习与实践操作相结合的重要性。通过编写运动会分数统计系统,我不仅巩固了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
希望大家可以在该篇课程设计中有所收获,同时也感谢各位大佬的支持。文章如有任何问题请在评论区留言斧正,鸿蒙会尽快回复您的建议!