数据结构世界杯.docx
《数据结构世界杯.docx》由会员分享,可在线阅读,更多相关《数据结构世界杯.docx(24页珍藏版)》请在冰豆网上搜索。
![数据结构世界杯.docx](https://file1.bdocx.com/fileroot1/2022-12/16/c660788f-34b5-4316-b2ae-c27e1427a1e9/c660788f-34b5-4316-b2ae-c27e1427a1e91.gif)
数据结构世界杯
2014世界杯信息查询系统
学号:
姓名:
指导教师:
1需求分析
1.1程序功能
1)添加及修改球队、球员、比赛和得分信息;
2)查询球队的基本信息(英文名、主教练、明星球员、世界杯最好战绩、历史名将等)、球队球员总名单、统计球队参加的所有比赛;
3)查询某场比赛的信息(对阵信息和哪位球员在何时进球);
4)按球队名及姓名或球员编号查找球员信息(包含其所属球队、位置、排名及比赛信息等);
1.2需要处理的数据
1)球队的队名、英文名、主教练、明星球员、世界杯最佳战绩、历史名将、排名;
2)球员的姓名、编号、所属球队、位置、现役俱乐部、国家队出场次数/进球数、本赛季俱乐部出场次数/进球数、本次世界杯进球数;
3)对阵信息;
4)得分信息:
球队、球员、进球时刻、对阵球队等。
1.3程序开发运行选用的环境
本程序使用VS编写。
1.4用户界面的设计
2数据结构设计
2.1ADT定义
2.1.1图
classGraph{
public:
intnumVertex;//顶点数
intnumEdge;//边数
int*Mark;//入度访问,访问过为1,未访问为0
int*Indegree;//顶点入度
Graph(intnumVert);//构造函数
~Graph();//析构函数
intVerticesNum();//返回顶点数
intEdgesNum();//返回边数
boolIsEdge(EdgeoneEdge);//判断是否是边
};
2.1.2相邻矩阵存储图
classGraphm:
publicGraph{
private:
int**matrix;//指向相邻矩阵的指针
public:
Graphm(intnumVert);//构造函数
virtual~Graphm();//析构函数
EdgeFirstEdge(intoneVertex);//返回依附于顶点oneVertex的第一条边
EdgeNextEdge(EdgepreEdge);//返回preEdge的下一条边
voidSetEdge(intfrom,intto,intweight);//设置一条边
voiddelEdge(intfrom,intto);//删除边
intGetEdge(intfrom,intto);//获得一条边};
2.1.3快速排序
voidQuickSort(RecordArray[],intleft,intright);//快速排序
voidswap(RecordArray[],intpivot,intright);//轴值交换到数组末端
intSelectPivot(intleft,intright);//选择轴值
intPartition(RecordArray[],intleft,intright);//分割函数,分割后轴值已到达正确位置
2.2主程序流程
CWorldCupApp()CWorldCupDoc()
~CWorldCupDoc()
GetData(intn)
GetTeam(CStringt)
CWorldCupDoc()GetTeam(intnum)
OnNewDocument()
OnOpenDocument(LPCTSTRIpszPathName)
Serialize(CArchive&ar)
TeamAdd(Team*t)
CMainFrame()TeamDelete(Team*t)
CWorldCupView()
~CWorldCupView()
GetDocument()
OnAddMatch()
OnAddPlayer()
OnAddScore()
OnAddTeam()
CWorldCupView()OnDraw(CDC*pDC)
OnLookMatch()
OnLookPlayer()
OnLookPlayername()
OnLookplayernumberh()
OnLookTeam()
OnLookTeamBasic()
OnLookTeamMatch()
OnLookTeamplayers()
3详细设计
3.1各程序模块间的调用关系
voidOnAddTeam();
voidOnAddPlayer();
voidOnAddMatch();添加信息
voidOnAddScore();
voidOnLookTeam();
voidOnLookMatch()
CWorldCupViewvoidOnLookPlayer()
voidOnLookPlayername()
voidOnLookplayernumberh()查询信息
voidOnLookTeam()
voidOnLookTeamBasic()
voidOnLookTeamMatch()
voidOnLookTeamplayers()
voidOnDraw(CDC*pDC)显示输出信息
3.2函数调用关系图
QuickSort(Arraya[],intleft.Intright)
QuickSort()Swap(Arraya[],intpivot.Intright)
SelectPivot(intleft.Intright)
Partition(Arraya[],intleft.Intright)
3.2.1voidCWorldCupView:
:
OnAddTeam(){
AddTeamaboutDlg;//关联对话框
booli;
CWorldCupDoc*pDoc=GetDocument();//获得文件指针
if(aboutDlg.DoModal()==IDOK){
UpdateData(TRUE);
Team*t=newTeam();
t->SetTeamName(aboutDlg.m_teamname);//添加球队信息
t->SetRanking(aboutDlg.m_teamranking);
t->SetVertex(aboutDlg.m_teamranking);
t->SetTeamEnglishName(aboutDlg.m_englishname);
t->SetTeamHeadCoach(aboutDlg.m_headcoach);
t->SetTeamStarPlayer(aboutDlg.m_starplayer);
t->SetTeamBestResult(aboutDlg.m_bestresult);
t->SetTeamHistory(aboutDlg.m_history);
i=pDoc->TeamAdd(t);
}
else{}
if(i==true){
AfxMessageBox("添加成功!
");//提示添加成功
}
Invalidate();//视窗重画
}
OnAddPlayer()、OnAddMatch()、OnAddScore()同上;
3.2.2voidCWorldCupView:
:
OnLookMatch(){
match=false;
LookMatchaboutDlg;
CWorldCupDoc*pDoc=GetDocument();//获得文件指针
if(aboutDlg.DoModal()==IDOK){
UpdateData(TRUE);
team1=aboutDlg.m_team1;//查找对阵的球队
team2=aboutDlg.m_team2;
t1=pDoc->GetTeam(aboutDlg.m_team1);//查不到的情况
if(t1==NULL)AfxMessageBox("没有此场比赛信息!
");
else{
t2=pDoc->GetTeam(aboutDlg.m_team2);
if(t2==NULL)AfxMessageBox("没有此场比赛信息!
");
else{//输出图结构相应边的权值即为比分信息
weight1=pDoc->g->GetEdge(t1->vertex,t2->vertex);
weight2=pDoc->g->GetEdge(t2->vertex,t1->vertex);
match=true;
players=false;//只显示输出比赛信息,其他信息不能输出
playername=false;
playernumber=false;
team=false;
teaminformation=false;
teambasic=false;
teammatch=false;
rule=false;
worldcuphistory=false;
jixiangwu=false;
}
}
}
else{}
Invalidate();//视窗重画
}
OnLookTeam();OnLookPlayerName();OnLookPlayerNumber();OnLookTeamPlayers();OnLookTeamMatch();OnLookTeamBasic();OnLookPlayer()同上;
3.2.3OnDraw(CDC*pDC);
if(team){
pDC->TextOut(130,10,"32强排行榜");
pDC->TextOut(20,45,"队伍");
pDC->TextOut(120,45,"排名");
while(ite=pDoc->GetData(i);//获得指向球队的指针
if(i<20){
pDC->TextOut(20,h1,te->GetTeamName());
ran.Format("%d",te->GetRanking());
pDC->TextOut(120,h1,ran);
h1+=20;
}else{
pDC->TextOut(220,45,"队伍");
pDC->TextOut(320,45,"排名");
pDC->TextOut(220,h2,te->GetTeamName());
ran.Format("%d",te->GetRanking());
pDC->TextOut(320,h2,ran);
h2+=20;}
i++;
}
}
4用户说明
1.打开程序;
2.在界面中点击打开按钮,选择worldCup;
3.可以选择添加、查询来添加查询自己想要的信息;
4.如有错误信息,修改(重新键入即可)后保存即可。
5测试结果
5.1添加与修改
1添加球队信息
2添加球员信息
3添加比赛信息
4添加球员信息
5.2查询
5.2.1查询队伍信息
1查询球队基本信息
2查询球员名单
3查询球队比赛统计
5.2.2查询对阵信息
5.2.2查询球员信息
1通过姓名查询
2通过号码查询
5.3排行榜
5.3.132强排行榜
5.3.2射手榜
5.4错误的输入与输出
5.4.1球队基本信息
5.4.2球队对阵信息
5.4.2球员信息
6源程序(主要类)
6.1Score类
classScore:
publicCObject
{
DECLARE_SERIAL(Score)
public:
Score(constScore&s);
voidSerialize(CArchive&ar);
Score*operator=(Score&s1);
CStringTiming;
CStringEvent;
CStringAgainst;
Score();
virtual~Score();
};
6.2Team类
classTeam:
publicCObject
{
DECLARE_SERIAL(Team)
public:
voidSetPlayersScore(intsc,intn);
PlayersGetPlayer(intnum);
PlayersGetPlayer(CStringpn);
CStringEnglishName;
CStringHeadCoach;
CStringStarPlayer;
CStringBestResult;
CStringHistory;
intvertex;
CStringTeamName;
Playersp[24];
intRanking;
Playerspl;
Team();
~Team();
intGetVertex();
voidSetVertex(intv);
Team*operator=(Team&t);
voidSerialize(CArchive&ar);
voidSetTeamEnglishName(CStringenName){EnglishName=enName;}
voidSetTeamHeadCoach(CStringCoach){HeadCoach=Coach;}
voidSetTeamStarPlayer(CStringsPlayer){StarPlayer=sPlayer;}
voidSetTeamBestResult(CStringbResult){BestResult=bResult;}
voidSetTeamHistory(CStringHis){History=His;}
voidSetTeamName(CStringsName){TeamName=sName;}
voidSetRanking(intranking){Ranking=ranking;}
voidSetPlayersName(CStringpName,intn){p[n].Name=pName;}
voidSetPlayersNumber(intpNumber,intn){p[n].Number=pNumber;}
voidSetPlayersRanking(intpRanking,intn){p[n].Ranking=pRanking;}
voidSetPlayersTeam(CStringpTeam,intn){p[n].Team=pTeam;}
voidSetPlayersPosition(CStringpPosition,intn){p[n].Position=pPosition;}
voidSetPlayersGoalTiming(CStringtiming,intn){p[n].SetTiming(timing);}
voidSetPlayersGoalAgainst(CStringagainst,intn){p[n].SetAgainst(against);}
voidSetPlayersNationAppearance(CStringa,intn){p[n].SetNationAppearance(a);}
voidSetPlayersClub(CStringc,intn){p[n].SetClub(c);}
voidSetPlayersClubAppearance(CStringa,intn){p[n].SetClubAppearance(a);}
CStringGetTeamName(){returnTeamName;}
//PlayersGetPlayers(intn){returnp[n];}
intGetRanking(){returnRanking;}
CStringGetPlayersName(intn){returnp[n].Name;}
intGetPlayersNumber(intn){returnp[n].Number;}
intGetPlayersRanking(intn){returnp[n].Ranking;}
CStringGetPlayersTeam(intn){returnp[n].Team;}
CStringGetPlayersPosition(intn){returnp[n].Position;}
CStringGetPlayersGoalTiming(CStringt,intn){returnp[n].GetTiming(t);}
//CStringGetPlayersGoalEvent(intn){/*returnp[n].Event;*/}
};
6.2Player类
classPlayers:
publicCObject
{
DECLARE_SERIAL(Players)
public:
voidSetClub(CStringa);
voidSetClubAppearance(CStringa);
voidSetNationAppearance(CStringa);
Players(Players&p2);
CStringGetAgainst(CStringa);
CStringGetTiming(CStringa);
voidSetAgainst(CStringa);
voidSetTiming(CStringt);
CStringName;
intNumber;
intRanking;
CStringTeam;
CStringPosition;
CStringNationAppearance;
CStringClub;
CStringClubAppearance;
ints;
Scoresc[20];
voidSerialize(CArchive&ar);
Players();
virtual~Players();
Players*operator=(Players&p2);};
7心得体会
经过这次的课设,我对数据结构有了更深层次的了解,深入了解了逻辑结构与存储结构的差别,尤其是通过这次世界杯信息查询系统,深入了解了图结构以及存储结构邻接矩阵。
由于对编程语言的不熟悉,课设进行的很艰难。
预想的数据结构在编程中可能是不切实际的、难以实现的,只能更改思路。
一开始有想过以冠军为根采用树来设计程序,发现此方法难以实现,冠军赛前有很多半决赛、1/4决赛、小组赛等等,冠军与很多与根相距较远的队伍也进行了比赛,树的猜想是不可行的一种方案。
因此选用无向图来作为逻辑结构,以队伍名作为节点,节点之间的边存储比分,队员作为队伍的一部分信息存储。
以此为大的框架进行编程。
接下来的一些细节也遇到了很多困难,与同学交流一起完成了这次课设。
这次课设受益良多,积累了很多经验,下次再遇到也不会手忙脚乱。
希望下次我会做的更好。