《《数据结构》课程设计报告书运动会分数统计系统的设计与实现 .doc》由会员分享,可在线阅读,更多相关《《数据结构》课程设计报告书运动会分数统计系统的设计与实现 .doc(45页珍藏版)》请在三一办公上搜索。
1、 怀 化 学 院 计 算 机 系数据结构课程设计报告书运动会分数统计系统的设计与实现 学生姓名: 学 号: 年级专业及班级:09级计算机科学与技术一班 指导老师及职称: 副教授 专 业:计算机科学与技术专业 湖南怀化 提交日期:2011年6月 运动会分数统计系统的设计与实现学 生: 指导老师: (怀化学院计算机系,怀化 418008) 摘 要:运动会分数统计系统通过运用结构体、文件读取以及数据保存、定义运动会类、以及调用函数、运用库函数实现了指定的输入文本读取数据;根据输入文件得到各学校的总分;按学校编号、学校总分、男女团体总分排序;查询功能按学校编号查询某个项目的情况、按项目编号查询取得前三
2、或前五名的学校;实现了数据的增加、删除、修改以及对数据的保存的功能。该系统的用户主要是提供给管理、学校的。对于管理用户提供了所有的操作,而对学校拥护只提供查询和查看操作,这样安全性能比较高,该系统是通过输入文本读取来获取数据,较少了输入数据的繁杂通过运用定义运动会类,进行对函数的定义,使整个代码看起来清晰整洁,通过调用库函数,使代码更简洁。该系统为用户提供了总分计算,排序方便,为学校用户提供了查询和查看的方便。 关键词:运动会分数统计系统;结构体;排序;查询1 前言 该系统实现了简单的运动会分数统计,是一个面向对象的设计,使用了结构体,输入文本读取数据以及库函数的调用来完成整个系统的设计,是繁
3、多的数据操作变得简单。该系统为联合运动会提供服务减少了不必要的人力物力的浪费,通过写一段程序实现简单运动会分数统计系统的设计来实现几个功能。该系统实现了以下几个功能:1)根据指定的输入文件读取数据;2)输入文件数据格式和文件数目由学生自行设计,主体体现学校名称、项目编号、项目名称、男子女子项目类别、前三或前五名积分;3)根据输入文件得到各学校总分,4)可以按学校编号或名称、学校总分、男女团体总分排序;5)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。6)实现数据的增加、删除、修改,并将相关数据进行保存;7)各操作结果能保存到文件,以便查询。通过这次的课程设计,
4、可以加深对库函数,以及结构体的了解,以及各个函数的功能以及实现,更进一步了解其原理。2 需求分析2.1 范围2.1.1 标识文件状态:【 】草稿【】正式发布【 】正在修改文件标识:需求分析报告当前版本:1.0作 者:吴红林完成日期:2011-05-252.1.2 系统概述1软件名称:运动会分数统计系统2软件功能:1)根据指定的输入文件读取数据;2)输入文件数据格式和文件数目由学生自行设计,主体体现学校名称、项目编号、项目名称、男子女子项目类别、前三或前五名积分;3)根据输入文件得到各学校总分,4)可以按学校编号或名称、学校总分、男女团体总分排序;5)可以按学校编号查询学校某个项目的情况;可以按
5、项目编号查询取得前三或前五名的学校。6)实现数据的增加、删除、修改,并将相关数据进行保存;7)各操作结果能保存到文件,以便查询。3用户:管理员、学校4开发者:吴红林2.1.3 文档概述需求分析采用面向对象的方法,在文档中主要采用了用例、E-R图、数据字典等表示方法来描述需求,用这些方法来表达需求分析便于理解,将自己的系统推荐给用户.2.2 引用文件无2.3 需求概述2.3.1 系统目标本系统的总体目标是通过该系统的实施,可以对学生综合测评信息更加有效地进行管理。系统设计实施过程中,力争做到以下几点:1. 具有较高的可靠性和可用性;2. 系统易于管理维护;3 使用方便,易学易用;4. 良好的性能
6、价格比;2.3.2 运行环境1. 系统硬件需求Pentium4 800MHz或更高主频CPU 512MB以上内存。2. 系统软件需求IIS5.0以上的WEB服务、安装有 Myeclipse8.5与Mysql5.1数据库等、Windows XP 以及更高版本的操作系统、IE5.0以上的版本浏览器。2.3.3 用户的特点管理员,具备基本的电脑操作技能和简单的系统维护工作以及学校用户具备基础的计算机操作技能。2.4功能需求通过前期对运动会分数统计领域实际业务需求的调研,经分析确定系统功能主要为以下:管理员操作:1、有各个运动项目以及各个学校以及运动员信息管理。2、认证信息管理、密码管理、对每个学校进
7、行总分统计、对各个信息(如按学校名称或编号查询某项的情况)进行查询、增加、删除、修改以及对按不同规定(学校编号或名称、学校总分、男女团体总分)进行排序。3、实现文件读取数据以及文件保存数据操作。 学校用户操作:用户信息完善、认证信息的查看。2.4.1 系统用例图根据需求分析,分析出系统的具体操作步骤及功能,从而确定系统流程图及各个步骤中具体内容,具体描述如下。(1)系统整体用例图,系统主要有两类用户包括:管理员、学校用户。见图2.1。 运动会分数统计系统 管理员学校文件输入学校总分统计排序操作查询操作增加、删除、修改操作查询操作密码认证用户选择文本保存 图2.1 系统整体用例图2.4.2 系统
8、各项功能描述 1、【应该以用例为单位进行功能描述】1) 用例1用例名:文件输入行为者:管理员目的:实现数据的读入,输入相关的学校信息,相关的项目信息级别:一级过程描述:a) 欢迎进入运动会分数统计系统的设计与实现系统b) 选择菜单,选择录入数据文件c) 文件录入学校名称、项目编号、项目名称、男子女子项目类别、前三或前五名d) 录入成功,退出到菜单选项。与其它用例的关联:本用例是后面的操作的基础。异常处理:无2) 用例3用例名:学校总分统计行为者:管理员目的:根据输入文件得到各学校总分级别:一级过程描述:a) 根据输入的文件统计各学校的总分b) 利用直接插入函数对个学校的总分进行排序c) 输出各
9、学校的总分,记录入文件item_info.txt中d) 退出菜单选项异常处理:无3) 用例4用例名:排序操作行为者:管理员目的:可以按学校编号或名称、学校总分、男女团体总分排序;级别:一级过程描述:a) 利用算法分别实现按学校编号排序b) 按学校编号或名称排序c) 按学校总分排序d) 按男女团体总分排序e) 利用一个选择的菜单实现这些排序f) 后台显示,用户选择g) 显示结果h) 退出系统异常处理:无4) 用例5用例名:查询操作行为者:管理员、学校目的:可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。级别:一级过程描述:a)输入学校编号以及要查询的项目进行查询b
10、)输入项目编号查询获奖情况f) 退出系统。异常处理:无5) 用例6用例名:数据的增加、删除、修改,并将相关数据进行保存行为者:管理员目的:实现数据的增加、删除、修改,并将相关数据进行保存;级别:一级过程描述:a) 对文件进行数据的增加,删除,修改等操作b) 查看是否操作成功,输出修改后的数据c) 退出系统异常处理:无6) 用例7用例名:各个操作数据的文件保存行为者:管理员目的:各操作结果能保存到文件,以便查询级别:一级2.5数据下面仅列出主要实体。(1)学校实体学校实体包括学校名称、学校编号、学校总分、女团体总分、男团体总分,如图学生实体E-R图2.5所示。 学校学校总分女团体总分男团体总分学
11、校名称学校编号图2.5 学校实体E-R图(2)活动项目实体项目实体包括项目编号、取前三或前五、项目类别、项目获名者。如图项目实体E-R图2.6所示。活动项目项目编号项目类别取前三或前五项目获名者图2.6 活动项目实体E-R图2.6拟采用的技术实现本系统用到了C/C+基础程序设计,数据结构。本系统将采用文件存储、结构存储、链表方法以及调用不同函数来实现系统功能,算法中主要采用是链表操作如:查询、增加、删除、修改以及链表的插入排序等,输入与读取都是以文件的形式进行。在系统设计的过程中,才会知道哪一种技术比较好用,但是具体的用到的技术应该不会太偏离我以上讲的技术。3 详细设计根据题目要求及本次课程设
12、计的目的,采用结构体来存储每组数据,定义运动会类和调用库函数进行相应的操作。现把相应的设计思路及各个函数解析如下。3.1 数据结构设计分析3.1.1 存储学校信息的结构体 学校信息有学校名称、学校编号、学校总分、男女团体总分。具体结构如下:struct School/学校信息string school_name;string school_id;int total_score;int women_score;int man_score;School()/初始化school_name = ;school_id = ;total_score = women_score = man_score =
13、0;3.1.2 存储项目信息的结构体 项目信息有项目编号、项目取前三或前五、项目类别、项目获名者。具体结构如下:struct Item/项目信息string item_id;int range_num;char sex;string winner_id6;Item()/初始化item_id = ;sex = 0;range_num = 0;memset(winner_id,0,sizeof(winner_id);3.13运动会类 定义一个运动会类,定义和调用起成员函数,成员变量,完成系统的功能。代码如下:class SportMeetingpublic:void load();void sav
14、e();void sort();void search();void add();void del();void modify();private:void update();void sort_by_id();void sort_by_total();void sort_by_man();void sort_by_women();void search_by_school();void search_by_item();multimap school;/定义个学校的map类multimap item;/定义项目的map类;3.2 各个函数分析3.2.1 主函数 函数原型:int main()
15、main()函数主要是整个系统的控制端,主要功能是控制整个程序的运行。从主函数开始调用各相关函数来达到相应的功能。由于有多个不同的选项,所以用一个while()swithch()语句控制每个函数调用,控制起来方便、明了。关键代码如下:while(1)cout1. 修改项目信息endl;cout2. 添加项目endl;cout3. 删除项目endl;cout4. 查询选项endl;cout5. 查看排名endl;cout0. 退出系统endl;cout select;switch(select)case 1:meet.modify();break;case 2:meet.add();break;
16、case 3:meet.del();break;case 4:meet.search();break;case 5:meet.sort();break;case 0:break;default:cout输入错误! sh.school_id)fin1 sh.school_name;school.insert(pair(sh.school_id,sh);fin1.close();ifstream fin2(item_info.txt);/从文件中读取项目信息数据Item it;while(fin2 it.item_id)fin2 it.sex;fin2 it.range_num;int i;for
17、(i = 1; i it.winner_idi;item.insert(pair(it.item_id,it);fin2.close();update();3.2.3 菜单函数本系统没有单纯的菜单函数,因为本系统比较的简单,可以不用菜单函数,要是选用菜单函数,太过于繁杂,因为每个主菜单下还有很多小的菜单,不采用菜单函数,是代码通俗易懂。虽然没有菜单函数,但是在各个界面展示整个系统可供用户选择的功能选项一步一步的层层递进,清晰明了,使用户对系统的操作更容易掌握。显示各个选项,把后台功能显示在显示器上,给用户以提醒。3.2.4 增加函数函数原型:void SportMeeting:add()此函数
18、用来增加项目,调用该函数可以使管理员对项目进行增加操作。代码如下:void SportMeeting:add()system(cls);Item it;cout it.item_id;if(item.find(it.item_id) != item.end()cout该项目已经存在!endl;system(pause);return ;cout it.sex;cout 请输入该项目是取前三名还是取前五名?(输入3或者5) it.range_num;if(it.range_num = 3)cout请依次输入获得该项目1-3名的学校编号: it.winner_id1 it.winner_id2 i
19、t.winner_id3;else if(it.range_num = 5)cout请依次输入获得该项目1-5名的学校编号: it.winner_id1 it.winner_id2 it.winner_id3 it.winner_id4 it.winner_id5;elsecout输入错误!endl;system(pause);return ;item.insert(pair(it.item_id,it);update();cout添加项目成功!endl;system(pause);3.2.5 修改函数函数原型:void SportMeeting:modify()通过调用此函数,可以修改项目信
20、息,按照函数中的每项提示输入新的项目信息,以减少错误信息的录入。代码如下:void SportMeeting:modify()system(cls);Item itm;cout请输入你要修改的项目编号: itm.item_id;multimap:iterator it = item.find(itm.item_id);if( it = item.end()cout该项目不存在!endl;system(pause);return ;cout (it-second).sex;cout 请输入该项目是取前三名还是取前五名?(输入3或者5) (it-second).range_num;if(it-se
21、cond).range_num = 3)cout请依次输入获得该项目男子组1-3名的学校编号: (it-second).winner_id1 (it-second).winner_id2 (it-second).winner_id3;else if(it-second).range_num = 5) cout请依次输入获得该项目男子组1-5名的学校编号: (it-second).winner_id1 (it-second).winner_id2 (it-second).winner_id3 (it-second).winner_id4 (it-second).winner_id5;elseco
22、ut输入错误!endl;system(pause);return ;update();cout修改项目成功!endl;system(pause);3.2.6 查询函数函数原型:void SportMeeting:search()进入此函数后,有菜单的选择,可以查看学校获奖的情况、查看项目获奖的情况,分别是根据学校编号查询某个项目的情况、根据项目编号查询获前三或前五的学校情况。编写了以下查询函数。void SportMeeting:search()system(cls);cout1. 查看学校获奖情况endl;cout2. 查看项目获奖情况endl;cout0. 返回上级菜单endl; cout
23、 select;switch(select)case 1:search_by_school();/根据学校编号查询某个项目的情况break;case 2:search_by_item();/根据项目编号查询获前三或前五的学校情况break;case 0:break;default:cout输入错误!endl;break;system(pause);3.2.7 子查询函数函数原型:void SportMeeting:search_by_school()、void SportMeeting:search_by_item()在这两个子查询函数中,用户可以根据学校编号查询某个项目的情况、根据项目编号查
24、询获前三或前五的学校情况,完善了查询函数。代码如下:1)void SportMeeting:search_by_school()/根据学校编号查询某个项目的情况system(cls);School sch;cout 请输入你要查看的学校编号 sch.school_id;multimap:iterator it_school = school.find(sch.school_id);if(it_school = school.end()cout没有此学校endl;return ;cout请输入你要查看该学校的那个项目的获奖情况 itm.item_id;multimap:iterator it_i
25、tem = item.find(itm.item_id);if(it_item = item.end()cout没有此项目endl;return ;cout 该学校在此项目的男子组中获奖情况:;bool is_award = false;int i;for(i = 1; i second).range_num ;i+)if(it_item-second).winner_idi = sch.school_id)cout i ;is_award = true;if(is_award = false)cout没有任何奖项;coutendl;return;2) void SportMeeting:se
26、arch_by_item()/根据项目编号查询获前三或前五的学校情况system(cls);Item itm;cout请输入你要查询的项目编号 itm.item_id;multimap:iterator it_item = item.find(itm.item_id);if(it_item = item.end()cout 没有此项目 endl;return ;cout 该项目的获奖情况:endl;int i;for(i = 1; i second).range_num ;i+)cout第 i 名:second).winner_idi endl;return;3.2.8 删除函数函数原型:vo
27、id SportMeeting:del()此函数用户可以根据需要对项目进行更新,把不存在的项目,将其删除。代码如下:void SportMeeting:del()system(cls);Item itm;cout请输入你要删除的项目编号: itm.item_id;multimap:iterator it_item = item.find(itm.item_id);if(it_item = item.end()cout 没有此项目编号!endl;system(pause);return ;item.erase(it_item);update();cout更新项目成功!endl;system(pa
28、use);return ;3.2.9 排序函数函数原型:void SportMeeting:sort()进入该函数,有一个菜单界面,用户可以根据需要,进行选择,对数据信息进行操作,该排序函数中还分有子排序函数,层次分明,用switch()语句完成功能设计。代码如下:void SportMeeting:sort()system(cls);cout1.按学校编号排序endl;cout2.按学校总分排序endl;cout3.按男子总分排序endl;cout4.按女子总分排序endl;cout0.返回上级菜单 select;switch(select)case 1:sort_by_id();break
29、;case 2:sort_by_total();break;case 3:sort_by_man();break;case 4:sort_by_women();break;case 0:system(pause);return;default:cout输入错误!endl;system(pause);return ;system(pause);3.3.0 子排序函数1)void SportMeeting:sort_by_id()/按学校编号排序system(cls);multimap:iterator it_school;cout setiosflags(ios:left);coutsetw(2
30、0)学校编号 setw(20)学校名称setw(10)总分setw(10)男子总分setw(20)女子总分endl;for(it_school = school.begin() ; it_school != school.end() ; it_school+)coutsetw(20)second).school_idsetw(20)second).school_namesetw(10)second).total_scoresetw(10)second).man_scoresetw(20)second).women_scoreend;2)void SportMeeting:sort_by_tot
31、al()/按学校总分排序system(cls);multimap:iterator it_school;multimap school_temp;School sch;for(it_school = school.begin() ; it_school != school.end() ; it_school+)sch = it_school-second;school_temp.insert(pair(sch.total_score,sch);cout setiosflags(ios:left);coutsetw(20)学校编号 setw(20)学校名称setw(10)总分setw(10)男子
32、总分setw(20)女子总分endl;multimap:iterator it_temp;for(it_temp = school_temp.begin() ; it_temp != school_temp.end() ; it_temp+)coutsetw(20)second).school_idsetw(20)second).school_namesetw(10)second).total_scoresetw(10)second).man_scoresetw(20)second).women_scoreendl;3)void SportMeeting:sort_by_man()/按男子团体
33、总分排序system(cls);multimap:iterator it_school;multimap school_temp;School sch;for(it_school = school.begin() ; it_school != school.end() ; it_school+)sch = it_school-second;school_temp.insert(pair(sch.man_score,sch);cout setiosflags(ios:left);coutsetw(20)学校编号 setw(20)学校名称setw(10)总分setw(10)男子总分setw(20)
34、女子总分endl;multimap:iterator it_temp;for(it_temp = school_temp.begin() ; it_temp != school_temp.end() ; it_temp+)coutsetw(20)second).school_idsetw(20)second).school_namesetw(10)second).total_scoresetw(10)second).man_scoresetw(20)second).women_scoreendl;4)void SportMeeting:sort_by_women()/按女子团体总分排序syst
35、em(cls);multimap:iterator it_school;multimap school_temp;School sch;for(it_school = school.begin() ; it_school != school.end() ; it_school+)sch = it_school-second;school_temp.insert(pair(sch.women_score,sch);cout setiosflags(ios:left);coutsetw(20)学校编号 setw(20)学校名称setw(10)总分setw(10)男子总分setw(20)女子总分en
36、dl;multimap:iterator it_temp;for(it_temp = school_temp.begin() ; it_temp != school_temp.end() ; it_temp+)coutsetw(20)second).school_idsetw(20)second).school_namesetw(10)second).total_scoresetw(10)second).man_scoresetw(20)second).women_scoreendl;3.3.1 更新计算分数函数 函数原型:void SportMeeting:update() 此函数,对各个学校、男子团体以及女子团体总分的一个计算操作函数,具体代码如下: void SportMeeting:update()multimap:iterator it_school = school.begin();for(it_school;it_school != school.end() ; it_school