数据结构课程设计报告2402125.docx
《数据结构课程设计报告2402125.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告2402125.docx(38页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告2402125
(此文档为word格式,下载后您可任意编辑修改!
)
怀化学院计算机系
《数据结构》课程设计报告书
运动会分数统计系统的设计与实现
学生姓名:
吴红林
学号:
年级专业及班级:
09级计算机科学与技术一班
指导老师及职称:
叶青副教授
专业:
计算机科学与技术专业
湖南·怀化
提交日期:
2011年6月
运动会分数统计系统的设计与实现
学生:
吴红林
指导老师:
叶青
(怀化学院计算机系,怀化418008)
摘要:
运动会分数统计系统通过运用结构体、文件读取以及数据保存、定义运动会类、以及调用函数、运用库函数实现了指定的输入文本读取数据;根据输入文件得到各学校的总分;按学校编号、学校总分、男女团体总分排序;查询功能按学校编号查询某个项目的情况、按项目编号查询取得前三或前五名的学校;实现了数据的增加、删除、修改以及对数据的保存的功能。
该系统的用户主要是提供给管理、学校的。
对于管理用户提供了所有的操作,而对学校拥护只提供查询和查看操作,这样安全性能比较高,该系统是通过输入文本读取来获取数据,较少了输入数据的繁杂通过运用定义运动会类,进行对函数的定义,使整个代码看起来清晰整洁,通过调用库函数,使代码更简洁。
该系统为用户提供了总分计算,排序方便,为学校用户提供了查询和查看的方便。
关键词:
运动会分数统计系统;结构体;排序;查询
1前言
该系统实现了简单的运动会分数统计,是一个面向对象的设计,使用了结构体,输入文本读取数据以及库函数的调用来完成整个系统的设计,是繁多的数据操作变得简单。
该系统为联合运动会提供服务减少了不必要的人力物力的浪费,通过写一段程序实现简单运动会分数统计系统的设计来实现几个功能。
该系统实现了以下几个功能:
1)根据指定的输入文件读取数据;
2)输入文件数据格式和文件数目由学生自行设计,主体体现学校名称、项目编号、项目名称、男子女子项目类别、前三或前五名积分;
3)根据输入文件得到各学校总分,
4)可以按学校编号或名称、学校总分、男女团体总分排序;
5)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
6)实现数据的增加、删除、修改,并将相关数据进行保存;
7)各操作结果能保存到文件,以便查询。
通过这次的课程设计,可以加深对库函数,以及结构体的了解,以及各个函数的功能以及实现,更进一步了解其原理。
2需求分析
2.1范围
2.1.1标识
文件状态:
【】草稿
【√】正式发布
【】正在修改
文件标识:
需求分析报告
当前版本:
1.0
作者:
吴红林
完成日期:
2.1.2系统概述
1.软件名称:
运动会分数统计系统
2.软件功能:
1)根据指定的输入文件读取数据;
2)输入文件数据格式和文件数目由学生自行设计,主体体现学校名称、项目编号、项目名称、男子女子项目类别、前三或前五名积分;
3)根据输入文件得到各学校总分,
4)可以按学校编号或名称、学校总分、男女团体总分排序;
5)可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
6)实现数据的增加、删除、修改,并将相关数据进行保存;
7)各操作结果能保存到文件,以便查询。
3.用户:
管理员、学校
4.开发者:
吴红林
2.1.3文档概述
需求分析采用面向对象的方法,在文档中主要采用了用例、E-R图、数据字典等表示方法来描述需求,用这些方法来表达需求分析便于理解,将自己的系统推荐给用户.
2.2引用文件
无
2.3需求概述
2.3.1系统目标
本系统的总体目标是通过该系统的实施,可以对学生综合测评信息更加有效地进行管理。
系统设计实施过程中,力争做到以下几点:
1.具有较高的可靠性和可用性;
2.系统易于管理维护;
3.使用方便,易学易用;
4.良好的性能价格比;
2.3.2运行环境
1.系统硬件需求
Pentium4800MHz或更高主频CPU512MB以上内存。
2.系统软件需求
IIS5.0以上的WEB服务、安装有Myeclipse8.5与Mysql5.1数据库等、WindowsXP以及更高版本的操作系统、IE5.0以上的版本浏览器。
2.3.3用户的特点
管理员,具备基本的电脑操作技能和简单的系统维护工作以及学校用户具备基础的计算机操作技能。
2.4功能需求
通过前期对运动会分数统计领域实际业务需求的调研,经分析确定系统功能主要为以下:
管理员操作:
1、有各个运动项目以及各个学校以及运动员信息管理。
2、认证信息管理、密码管理、对每个学校进行总分统计、对各个信息(如按学校名称或编号查询某项的情况)进行查询、增加、删除、修改以及对按不同规定(学校编号或名称、学校总分、男女团体总分)进行排序。
3、实现文件读取数据以及文件保存数据操作。
学校用户操作:
用户信息完善、认证信息的查看。
2.4.1系统用例图
根据需求分析,分析出系统的具体操作步骤及功能,从而确定系统流程图及各个步骤中具体内容,具体描述如下。
(1)系统整体用例图,系统主要有两类用户包括:
管理员、学校用户。
见图2.1。
运动会分数统计系统
图2.1系统整体用例图
2.4.2系统各项功能描述
1、【应该以用例为单位进行功能描述】
1)用例1
用例名:
文件输入
行为者:
管理员
目的:
实现数据的读入,输入相关的学校信息,相关的项目信息
级别:
一级
过程描述:
a)欢迎进入运动会分数统计系统的设计与实现系统
b)选择菜单,选择录入数据文件
c)文件录入学校名称、项目编号、项目名称、男子女子项目类别、前三或前五名
d)录入成功,退出到菜单选项。
与其它用例的关联:
本用例是后面的操作的基础。
异常处理:
无
2)用例3
用例名:
学校总分统计
行为者:
管理员
目的:
根据输入文件得到各学校总分
级别:
一级
过程描述:
a)根据输入的文件统计各学校的总分
b)利用直接插入函数对个学校的总分进行排序
c)输出各学校的总分,记录入文件item_info.txt中
d)退出菜单选项
异常处理:
无
3)用例4
用例名:
排序操作
行为者:
管理员
目的:
可以按学校编号或名称、学校总分、男女团体总分排序;
级别:
一级
过程描述:
a)利用算法分别实现按学校编号排序
b)按学校编号或名称排序
c)按学校总分排序
d)按男女团体总分排序
e)利用一个选择的菜单实现这些排序
f)后台显示,用户选择
g)显示结果
h)退出系统
异常处理:
无
4)用例5
用例名:
查询操作
行为者:
管理员、学校
目的:
可以按学校编号查询学校某个项目的情况;可以按项目编号查询取得前三或前五名的学校。
级别:
一级
过程描述:
a)输入学校编号以及要查询的项目进行查询
b)输入项目编号查询获奖情况
f)退出系统。
异常处理:
无
5)用例6
用例名:
数据的增加、删除、修改,并将相关数据进行保存
行为者:
管理员
目的:
实现数据的增加、删除、修改,并将相关数据进行保存;
级别:
一级
过程描述:
a)对文件进行数据的增加,删除,修改等操作
b)查看是否操作成功,输出修改后的数据
c)退出系统
异常处理:
无
6)用例7
用例名:
各个操作数据的文件保存
行为者:
管理员
目的:
各操作结果能保存到文件,以便查询
级别:
一级
2.5数据
下面仅列出主要实体。
(1)学校实体
学校实体包括学校名称、学校编号、学校总分、女团体总分、男团体总分,如图学生实体E-R图2.5所示。
图2.5学校实体E-R图
(2)活动项目实体
项目实体包括项目编号、取前三或前五、项目类别、项目获名者。
如图项目实体E-R图2.6所示。
图2.6活动项目实体E-R图
2.6拟采用的技术
实现本系统用到了C/C++基础程序设计,数据结构。
本系统将采用文件存储、结构存储、链表方法以及调用不同函数来实现系统功能,算法中主要采用是链表操作如:
查询、增加、删除、修改以及链表的插入排序等,输入与读取都是以文件的形式进行。
在系统设计的过程中,才会知道哪一种技术比较好用,但是具体的用到的技术应该不会太偏离我以上讲的技术。
3详细设计
根据题目要求及本次课程设计的目的,采用结构体来存储每组数据,定义运动会类和调用库函数进行相应的操作。
现把相应的设计思路及各个函数解析如下。
3.1数据结构设计分析
3.1.1存储学校信息的结构体
学校信息有学校名称、学校编号、学校总分、男女团体总分。
具体结构如下:
structSchool//学校信息
{
stringschool_name;
stringschool_id;
inttotal_score;
intwomen_score;
intman_score;
School()//初始化
{
school_name="";
school_id="";
total_score=women_score=man_score=0;
}
};
3.1.2存储项目信息的结构体
项目信息有项目编号、项目取前三或前五、项目类别、项目获名者。
具体结构如下:
structItem//项目信息
{
stringitem_id;
intrange_num;
charsex;
stringwinner_id[6];
Item()//初始化
{
item_id="";
sex='\0';
range_num=0;
memset(winner_id,0,sizeof(winner_id));
}
};
3.13运动会类
定义一个运动会类,定义和调用起成员函数,成员变量,完成系统的功能。
代码如下:
classSportMeeting
{
public:
voidload();
voidsave();
voidsort();
voidsearch();
voidadd();
voiddel();
voidmodify();
private:
voidupdate();
voidsort_by_id();
voidsort_by_total();
voidsort_by_man();
voidsort_by_women();
voidsearch_by_school();
voidsearch_by_item();
multimapschool;//定义个学校的map类
multimapitem;//定义项目的map类
};
3.2各个函数分析
3.2.1主函数
函数原型:
intmain()
main()函数主要是整个系统的控制端,主要功能是控制整个程序的运行。
从主函数开始调用各相关函数来达到相应的功能。
由于有多个不同的选项,所以用一个while(){swithch()}语句控制每个函数调用,控制起来方便、明了。
关键代码如下:
while
(1)
{
cout<<"1.修改项目信息"<cout<<"2.添加项目"<cout<<"3.删除项目"<cout<<"4.查询选项"<cout<<"5.查看排名"<cout<<"0.退出系统"<cout<<"请输入你的选择:
";
cin>>select;
switch(select)
{
case1:
meet.modify();
break;
case2:
meet.add();
break;
case3:
meet.del();
break;
case4:
meet.search();
break;
case5:
meet.sort();
break;
case0:
break;
default:
cout<<"输入错误!
"<system("pause");
break;
}
system("cls");
if(select==0)
break;
}
meet.save();
}
3.2.2输入文件读取函数
函数原型:
voidSportMeeting:
:
load()
此函数是输入文件读取数据,用文件代替了键盘输入,减少了数据输入的繁琐。
代码如下:
voidSportMeeting:
:
load()
{
ifstreamfin1("school_info.txt");//从文件中读取学校信息数据
Schoolsh;
while(fin1>>sh.school_id)
{
fin1>>sh.school_name;
school.insert(pair(sh.school_id,sh));
}
fin1.close();
ifstreamfin2("item_info.txt");//从文件中读取项目信息数据
Itemit;
while(fin2>>it.item_id)
{
fin2>>it.sex;
fin2>>it.range_num;
inti;
for(i=1;i<=it.range_num;i++)
fin2>>it.winner_id[i];
item.insert(pair(it.item_id,it));
}
fin2.close();
update();
}
3.2.3菜单函数
本系统没有单纯的菜单函数,因为本系统比较的简单,可以不用菜单函数,要是选用菜单函数,太过于繁杂,因为每个主菜单下还有很多小的菜单,不采用菜单函数,是代码通俗易懂。
虽然没有菜单函数,但是在各个界面展示整个系统可供用户选择的功能选项一步一步的层层递进,清晰明了,使用户对系统的操作更容易掌握。
显示各个选项,把后台功能显示在显示器上,给用户以提醒。
3.2.4增加函数
函数原型:
voidSportMeeting:
:
add()
此函数用来增加项目,调用该函数可以使管理员对项目进行增加操作。
代码如下:
voidSportMeeting:
:
add()
{
system("cls");
Itemit;
cout<<"请输入你要添加的项目编号:
";
cin>>it.item_id;
if(item.find(it.item_id)!
=item.end())
{
cout<<"该项目已经存在!
"<system("pause");
return;
}
cout<<"请输入该项目是男子或者女子项目(m/w):
";
cin>>it.sex;
cout<<"请输入该项目是取前三名还是取前五名?
(输入3或者5)"<cin>>it.range_num;
if(it.range_num==3)
{
cout<<"请依次输入获得该项目1-3名的学校编号:
"<cin>>it.winner_id[1]>>it.winner_id[2]>>it.winner_id[3];
}
elseif(it.range_num==5)
{
cout<<"请依次输入获得该项目1-5名的学校编号:
"<cin>>it.winner_id[1]>>it.winner_id[2]>>it.winner_id[3]>>it.winner_id[4]>>it.winner_id[5];
}
else
{
cout<<"输入错误!
"<system("pause");
return;
}
item.insert(pair(it.item_id,it));
update();
cout<<"添加项目成功!
"<system("pause");
}
3.2.5修改函数
函数原型:
voidSportMeeting:
:
modify()
通过调用此函数,可以修改项目信息,按照函数中的每项提示输入新的项目信息,以减少错误信息的录入。
代码如下:
voidSportMeeting:
:
modify()
{
system("cls");
Itemitm;
cout<<"请输入你要修改的项目编号:
"<cin>>itm.item_id;
multimap:
:
iteratorit=item.find(itm.item_id);
if(it==item.end())
{
cout<<"该项目不存在!
"<system("pause");
return;
}
cout<<"请输入该项目为男子还是女子项目(m/w):
";
cin>>(it->second).sex;
cout<<"请输入该项目是取前三名还是取前五名?
(输入3或者5)"<cin>>(it->second).range_num;
if((it->second).range_num==3)
{
cout<<"请依次输入获得该项目男子组1-3名的学校编号:
"<cin>>(it->second).winner_id[1]>>(it->second).winner_id[2]>>(it->second).winner_id[3];
}
elseif((it->second).range_num==5)
{
cout<<"请依次输入获得该项目男子组1-5名的学校编号:
"<cin>>(it->second).winner_id[1]>>(it->second).winner_id[2]>>(it->second).winner_id[3]>>(it->second).winner_id[4]>>(it->second).winner_id[5];
}
else
{
cout<<"输入错误!
"<system("pause");
return;
}
update();
cout<<"修改项目成功!
"<system("pause");
}
3.2.6查询函数
函数原型:
voidSportMeeting:
:
search()
进入此函数后,有菜单的选择,可以查看学校获奖的情况、查看项目获奖的情况,分别是根据学校编号查询某个项目的情况、根据项目编号查询获前三或前五的学校情况。
编写了以下查询函数。
voidSportMeeting:
:
search()
{
system("cls");
cout<<"1.查看学校获奖情况"<cout<<"2.查看项目获奖情况"<cout<<"0.返回上级菜单"<cout<<"请输入你选择:
";
intselect;
cin>>select;
switch(select)
{
case1:
search_by_school();//根据学校编号查询某个项目的情况
break;
case2:
search_by_item();//根据项目编号查询获前三或前五的学校情况
break;
case0:
break;
default:
cout<<"输入错误!
"<break;
}
system("pause");
}
3.2.7子查询函数
函数原型:
voidSportMeeting:
:
search_by_school()、
voidSportMeeting:
:
search_by_item()
在这两个子查询函数中,用户可以根据学校编号查询某个项目的情况、根据项目编号查询获前三或前五的学校情况,完善了查询函数。
代码如下:
1)voidSportMeeting:
:
search_by_school()//根据学校编号查询某个项目的情况
{
system("cls");
Schoolsch;
cout<<"请输入你要查看的学校编号"<cin>>sch.school_id;
multimap:
:
iteratorit_school=school.find(sch.school_id);
if(it_school==school.end())
{
cout<<"没有此学校"<return;
}
cout<<"请输入你要查看该学校的那个项目的获奖情况"<Itemitm;
cin>>itm.item_id;
multimap:
:
iteratorit_item=item.find(itm.item_id);
if(it_item==item.end())
{
cout<<"没有此项目"<return;
}
cout<<"该学校在此项目的男子组中获奖情况:
";
boolis_award=false;
inti;
for(i=1;i<=(it_item->second).range_num;i++)
{
if((it_item->second).winner_id[i]==sch.school_id)
{
cout<
is_award=true;
}
}
if(is_award==false)
{
cout<<"没有任何奖项";
}
cout<return;
}
2)voidSportMeeting:
:
search_by_item()//根据项目编号查询获前三或前五的学校情况
{
system("cls");
Itemitm;
cout<<"请输入你要查询的项目编号"<cin>>itm.item_id;
multimap:
:
iteratorit_item=item.find(itm.item_id);
if(it_item==item.end())
{
cout<<"没有此