基于Floyd算法的便捷地铁路线查询系统数据结构课设Python课程设计源代码实验报告源码.docx
《基于Floyd算法的便捷地铁路线查询系统数据结构课设Python课程设计源代码实验报告源码.docx》由会员分享,可在线阅读,更多相关《基于Floyd算法的便捷地铁路线查询系统数据结构课设Python课程设计源代码实验报告源码.docx(17页珍藏版)》请在冰豆网上搜索。
基于Floyd算法的便捷地铁路线查询系统数据结构课设Python课程设计源代码实验报告源码
地铁出行帮助软件
S于Floyda法的便捷地旳S歿查询系统戳攥结构课设python潭穆设计源代吗
.【需求分析】
1•输入
I.1.I输入值来自于UI界面的“出发站:
”、“口的站:
”的两个接收框
I.1.2输入值范围:
来自于"Bdselnfo.txt”全部219个站名
2•输出
1.2.1输出:
右侧边栏的文字版的路线,左边在地铁图上的点线表示的出行路线
3.需要处理的数据
153
I0$
I0$
153
1・3・1程序将BaseInfo-txt中的数据(上图只是一部分)通过open函数抓取出来,并存储在两个list型的变量siteNameToNum、siteNuniToNaine中,根据需要再进行后续处理,得到想要的查询路线。
1.3.2将siteNaineToNuinsiteNuinToName中的数据放入矩阵e,之后再进行Floyd算法的计算。
4.程序开发运行选用的环境
141程序采用python2・7编写。
5.用户界面的设计
1・5・1用户界而采用Python自带图形界而库实现。
打开图形界面后,会看到1个功能按钮和2个输入编辑框,1个输出编辑框,一张地图。
分別在“出发站”“目的站”中输入正确的站点名称之后,点击“确是”功能按钮之后,地图上会显示最短路线,右侧边栏会显示路线信息和时间0
二【数据结构设计】
2.1自定义类设计
2丄1站点类
#工具II站名,坐标•所属线路■换乘时间
#工具21编号,对应站名■坐标,所属路线,
siteNaineToNum={}diet类型
siteNumToName={}换乘时间diet类型
2丄2矩阵类
e=|[('lineNo':
-l/arriveTime':
INF/transTiine':
0/roadList':
[]}forcolinrange(siteNum)]forrowinrange(siteNum)]#实现使用Floyd算法所用的基础"矩
阵-e-list的函数
2.1.3程序整体结构以及各模块的功能描述。
ADT宦义:
疋义了2个类:
站点类存放齐个站点的信息。
矩阵类将站点的信息组成矩阵,用来进行Floyd讣算。
主程序流程:
功能1通过直接打开txt文件将站点存入站点类中:
功能2将站点类的信息导入矩阵中,并ItFloyd讣算。
功能3调用daoru函数,然后进行对输入的判定,符合会输出相应的信息功能4调用daoru2函数,然后进行出入栈和排序操作,最后会显示到编辑框功能5为淸空编辑框的信息。
3.[详细设计】
3.1射手榜导入函数
bMfin函数导入射乎榜
丁将进球姓名相同球员进球数进行合并
直接插入排序
代码JvoidDaoru(int&n.piayera[])
inti=0:
ifsircamfin(“射手榜存档.ixV);
intj=0:
intnum=0;fin»a(num]jiame;fin»a[num].country;
fin»a[num].goal;
for(i=1・num=1:
ivq1:
i++)fin»a(num].name;fin»a(num].country;fin»a(num].goal;
for(j=0:
jj++)
if(a[numKname==afj].name)
a[j]・goal+=a[num]・goal;
num-;
num++;
n=num:
cout«num«cndl;
3.2战绩信息导入函数
fin函数导入信息
将国家1国家2比分1比分2存入数组S
根据W比分和得到进球信息个数存入xinxi类队列
代码:
voidDaoru2(ininn.zhanjis[])
fsiream
//zhanjis[number]:
for(inti=0:
ii++){
fin»s[i]xountryl»s[i]・coun(ry2»s[i].poinrl»s(i].poini2;for(inta=0:
a
a++){
xinxitemp;
fin»tempAime»tempxounlry»iemp.playername;s[i]Jinqiujnsert(a,iemp):
for(intj=0:
j//cout«s|j).countryl«""«s[j3.pointl«":
"«sljl.point2«""«
s{j].country2«endl;
〃sU]・jinqiu・prini();
//cout«endl;
nn=number;
3・3局部数据结构说明:
331链式队列:
icniplateclassLinkpublic:
Tdata;
Link*nexi:
Link(TinfoXink*nextValue=NULL){data=info:
next=nextValue:
LinkO(
〃水*********************************
lenipiateclassInkListprivate:
Link*head.*lail;
Link*setPos{constintp);
public:
InkLislO:
~lnkLisl();
boolisEmptyO;//检查链表是否为空
voidclear();/m链表存储的内容淸除,成为空表
CSlringprint(CSiringout):
intlcn;th():
//返回此链表的当前实际长度
boolappcnd(constTvalue);〃在表尾添加一个元素value»表的长度增1
boolinserl{constintp,constTvalue);〃在位Itp1:
插入一个元素value,表的长度增1
boolremovefconstintp);〃删除位置p上的元素,表的长度减1
boolgetValue(constintp.T&value)y/返回位置p的元素值
boolgetPostini&p.constTvalue);//査找值为value的元素,并返回第1次出现的位置332链式栈:
leniplateclasslnkSiack(private:
Link*lop;intSsize:
public:
lnkSiack(){lop=NULL;Ssize=O;
~lnkSlack()(clcar();
voidclear(){
while(lop!
=NULL){
Link*imp=top;lop=top・>ncxi:
deleteimp;
Ssize=O;
boolSisEmply(){if(Ssize=O)return(rue:
else
returnfalse;
boolpush(Titem)(
Link*tmp=newLink(iiemaop);lop=imp;
Ssize++:
returntrue:
Link*tmp;if(Ssize=O){coiuvv”栈为空,无法出栈!
“vvcndl;returnfalse;
item=top-xJaia:
imp=top->next;deletetop;iop=imp;
Ssize-:
returntrue:
boolrtop(T&item){if(Ssize=O){cout«"栈为空,无法读取!
■*«endl;returnfalse;
iiem=top->daia:
returntrue:
voidSize(){
cout«"大小为!
"vvSsizcvvcndl;
sysiem("pause");
333直接插入排序算法以及重载“〈":
booloperalor<(playera.playerb)
if(a・goalvb・goal)
returntnie:
else
returnfalse:
〃水*********************************
voidInsertSort(playerArrayOJntn){playerTempRecord;
inti.j;for(i=l:
ii++){
TenipRccord=Array[i];
j"l:
while(j>=0&&TempRecordj=j-n
ArrayU+l]=TcmpRccord;
3.4主程序(包括图形界面函数)
zhanjis(numbcr];
stringp.q.r:
lnkStackl;
playera(ql];
playerm[ql];lnkStacktl;lnkStackt2:
inti=OjJji=0stringb;
intnum1=0,order;
〃水****************************
voidCMyDIg:
lOnButton1()
CSldioFilefp:
401><^(5:
\\行©匕!
《丹心:
1110<^^3小;//这时确保editl填写的文件存在,否则会产生断
言错误
CStringstrText.szLine;
while(fp.ReadString{szLine))
m_out+=szLine;m_out=m_out+'Ar\n"';
fp.CloseO:
UpdaieData(false);
voidCMyDIg:
:
OnButton2()
//TODO:
Addyourcontrolnotificationhandlercodehereif(dr==false){
Daoni2(numbcr・s);
dr=true;
//strings{m_value2.GetBuffer{));p=m_value2.GctBuffer(0);
//m_value2=p;m_out=_T("J');
CSiringtemplacmp2:
for(inikl=O:
klif(p==s[kl]・counU71Itp==sfkl].country2)
m_oui=m_out+s[kIj.country1・C_slr();tempLForinal("%d'\s[kl].pointl);m_oui=m_out+temp1;m_oui=m_out+_T(;tempLFormat('*%d"\s[kl].point2):
m_oui=m_out+temp1;
m_oui=m_out+s[k1Lcountry2.c_slr();m_oui=m_out+"\r\n*\
temp2=_T('"*):
m_oui=m_out+s[k1Jjinqiu.print(temp2);moui=mout+"\r\n'\
UpdalcData(false);
voidCMyDIg:
:
OnButton3()
//TODO:
Addyourcontrolnoiificationhandlercodehereif(dr=false){
Daoru2(nunibers):
dr=iruc;
r=m_value3.GetBuffer(0):
q=m_value4.GctBuffer{0);
m-OiU=-T(Y);
CSiringtemp3・lcmp4;
for(intk=0:
kk++){
if(q==s(k].country1&&r==s[k]・country2llr=s[k]・countryl&&
q==s[k].counlry2)
m_out=m_oui+s[k].countryLc_str();temp3Tormat("%d"\s[k].pointl);m_oui=m_out+temp3;m_oui=m_out+_T(temp3.Format("%d'\s[k].point2);m_oui=in_out+temp3;
m_oui=m_out+s[k].country2.c_str();
moui=mout+"\r\n'':
temp4=_T("");m_oui=m_out+s[kjjinqiu.prini(lemp4);
in_out=m_oul+'Ar\n'*;
UpdalcData(false);
voidCMyDIg:
:
OnButton4()
Daorufnuni1,a);//num1的值就是q2
//TODO:
Addyourcontrolnoiificationhandlercodeherefor(il=0:
i!
il++)
tl・push(a[订]);
//cout«"巴西世界杯射手榜:
"vvcndl:
playerimp:
while(ii!
=q2){tLrtop(tmp);
m[iil=tinp;ll・pop(tmp);
ii++;
InsertSorUnrq2):
inth;for(h=0:
hintiii=0;
while(iii!
=q2){
t2.rtop(tmp):
CStringtemp5;
m_out=m_out+tmp.name.c_slr():
m_out=m_out+"":
m_out=ni_out+tmpxountry・C_str();
m_out=m_out+"'temp5Tormat("%d"\imp.goal);m_out=m_out+temp5;ni_out=ni_out+"\r\n*";
l2・pop(lmp);
UI++;
UpdalcData(falsc);
voidCMyDIg;;OnButton5()
//TODO:
Addyourcontrolnoiificationhandlercodehere//break:
UpdateData(true);
m_out=_T("");
m_value2=_T("");
m_value3=_T("");
m_value4=_T("");
UpdateData(false);
voidCMyDlg:
:
OnChangeEdit2()
//TODO:
IfthisisaRICHEDITcontrol,thecontrolwillnot
//sendthisnotificationunlessyouoverridetheCDialog:
:
OnInitDialog()
//functionandcallCRichEdilCtrl()5eiEventMask()
//withtheENM_CHANGEflagORcdintothemask.
//TODO:
AddyourcontrolnotificationhandlercodehereUpdateDataO;
if(m_AtOnce)
OnButlon2();
voidCMyDIg;:
OnChangeEdit1()
//TODO:
IfthisisaRICHEDITcontrol,thecontrolwillnot
//sendthisnotificationunlessyouoverridetheCDialog:
:
OnInitDialog()
//functionandcallCRichEdilCtrl()5eiEventMask()
//withtheENM_CHANGEflagORedintothemask.
//TODO:
AddyourcontrolnotificationhandlercodeherevoidCMyDlg:
:
OnChangeEdit3()
//TODO:
IfthisisaRICHEDITcontrol,thecontrolwillnot
//sendthisnotificationunlessyouoverridetheCDialog:
:
OnInilDialog()
//functionandcallCRichEdilCtrl()5eiEventMask()
//withtheENM_CHANGEflagORcdintothemask.
//TODO:
AddyourcontrolnoiificationhandlercodehereUpdaleDaiaO;
if(m_AtOnce)
OnButlon2();
voidCMyDlg:
:
OnChangcEdil4()
//TODO:
IfthisisaRICHEDITcontrol,thecontrolwillnot
//sendthisnotificationunlessyouoverridetheCDialog:
:
OnInitDialog()
//functionandcallCRichEdilCtrl().SeiEventMask()
//withtheENM_CHANGEflagORedintothemask.
//TODO:
AddyourcontrolnotificationhandlercodehereUpdaieDaiaO;
if(m_AtOnce)
OnButlon2();
4.【测试】
4」调试分析:
测试中算法经常出现循环错误,开辟存储空间的数量经常打数据量不匹配,由于各■场次比赛的进球数不同,导致无法为进球信息类提供固立的存储空间,所以用到了链式存储。
此外,图形用户界面用到MFC编写,由于此前没有MFC的基础,尤其是输入输出的强制类型转换这一块,遇到了极大的阻碍,通过网络上查阅相关算法以及与同学的交流最终实现了相关的我所需要的功能。
算法时间复杂度分析:
功能2,3,4的时间复杂度均为22。
42测试结果:
功能1:
数据结构课设图形用户界面
功龍i£择
册时引
201WH
Z01WH
20H/6/H
2014/6/15
功能2:
400
0:
00
400
6:
00
0:
00
2014/6/15
20H/6/15
2014/6/15
2014/6/16
2014/6/16
Z0W/0/15
2014/6/17
2014/0/17
3:
00
6,00
9,00
0:
00
3:
00
6,00
140
3:
00
2014||西世弄杯《程銀
蠶I'绢舂E
B组小绢舂
B绢小绢畚
D绢小组畚
D紺小绢赛C組小绢赛
E紺小紺赛呦小須赛
蜩小組赛嘲呦赛
SHi?
堵as
S利•也大利卫
英+5兰-意大利榔倉瓦•日本瑞士•厄瓜多尔趣•洪却拉斯阿根廷-狡fi爾血牙伊閒■尼曰刊n7
郵巴巴巴巴巴ryrr——-1279
^8
洛尔尔尔
粟场比赛I
球
球離醐n>^swsDI齡76594
射手榜
3
覇S
S露
巴比灵巴r別a
r运行
国製
fi
1
巴茵
功能3:
=r
£
数蹿喜构谍设图形用户界面
碑人妬I
卿比雰I輕—-
射和5
退岀峯疑
厂走行
功能4:
2
6544A333332222222222222222
I:
肛
E-
BIT
功能迭择
某《从谢1
功能5为清空,点击后界而会暗空,此处就不截图了。
5.【总结与提高】
十周的课程设计结束了,在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事w,如何去做一件事情,乂如何完成一件事悄的方法和技巧。
在设计•过程中,和同学们相互探讨,相互学习,相互监督。
我学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世,这次课程设计对我来说受益&多。
数据结构课程设讣是我们专业课程知识综合应用的实践训练,这是我们迈向社会,从事职业工作前一个必不少的过程•“千里之行始于足下r通过这次课程设计,我深深体会到这句千古名言的真正禽义.我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
通过这次的课程设讣,更是让我深刻认识到自己在学习中的不足,同时也找到了克服这些不足的方法,这也是一笔很大的资源。
在以后的实践过程中,我们应该利用更多的时间去做上机实验,加强自学的能力,多编写程丿了:
,相信不久后我们的编程能力都会有很大的提升,能设计出更多的更有创新的作品。