交通信息查询详细设计说明书.docx

上传人:b****6 文档编号:5676730 上传时间:2022-12-31 格式:DOCX 页数:20 大小:171.94KB
下载 相关 举报
交通信息查询详细设计说明书.docx_第1页
第1页 / 共20页
交通信息查询详细设计说明书.docx_第2页
第2页 / 共20页
交通信息查询详细设计说明书.docx_第3页
第3页 / 共20页
交通信息查询详细设计说明书.docx_第4页
第4页 / 共20页
交通信息查询详细设计说明书.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

交通信息查询详细设计说明书.docx

《交通信息查询详细设计说明书.docx》由会员分享,可在线阅读,更多相关《交通信息查询详细设计说明书.docx(20页珍藏版)》请在冰豆网上搜索。

交通信息查询详细设计说明书.docx

交通信息查询详细设计说明书

交通咨询系统

设计成员

孙坤---13111196

叶嘉伟—13111198

余富林—13111197

原赫---13111195

详细设计说明书

1.引言

1.1编写目的

在概要设计设定的大纲与数据结构上进一步完成每一个模块的功能。

写出对应的算法及其伪代码,为下一步细化到代码做准备。

本说明书为程序实现提供细化的参考。

1.2背景

待开发系统名称:

交通信息查询系统

本系统开发人员为本小组全体成员:

13111195原赫

13111196孙坤

13111197余富林

13111198叶嘉伟

1.3定义

迪杰斯特拉算法:

本系统采用的求解最短路径的算法。

1.4参考资料

数据结构(c语言版)严蔚敏吴伟民清华大学出版社

C语言程序设计(第四版)谭浩强清华大学出版社

2.系统结构

以上为本系统的主要结构组成,详细的结构说明参见交通信息查询系统概要设计说明书

3.模块详细设计

3.1模块列表

说明:

以下模块详细设计均以航班一种交通工具为例,对于列车以此类推

模块名称

模块标示符

管理员添加城市

Model1

管理员删除城市

Model2

管理员添加航班

Model3

管理员删除航班

Model4

普通用户查询最少花费航班

Model5

普通用户查询最短时间航班

Model6

3.2模块1(model1)

3.2.1模块描述

该模块所要实现的功能为将一个新城市加入到交通信息库当中。

适用对象为信息库管理员,要求通过键盘输入所要添加的新城市,并将信息保存到对应的文件中去。

同时要求有一定判错功能。

3.2.2输入项

要求输入一个城市名作为添加城市名,为了方便起见,这里运用STRING类作为变量类型。

3.2.3输出项

输出项为添加的string类城市名,要求输出到文件中去,并修改文件中的城市数

3.2.4流程逻辑

3.2.5接口

本模块与其他模块以及整个数据结构的接口为城市文件,通过本模块修改文件以及初始化操作与数据结构关联起来

3.2.6初步代码

intaddcity(graph&t)//返回1表示添加失败,因为城市已经存在

{

chardd;charch;intk;intp=0;stringc;fstreamfile;

printf("\n\n\n");

cout<<"==========================这里是城市添加管理页面================================\n\n\n";

outputcities(t);

cout<<"!

警告:

您的操作将改变交通信息库,输入1继续操作,否则离开"":

";

ch=getchar();dd=ch;

for(;ch!

='\n';)ch=getchar();

if(dd!

='1')return2;

cout<<"\n\n";

cout<<"-----------------请输入想要添加的城市名:

";cin>>c;getchar();

for(k=1;k<=t.citynum;k++)

if(c==str[k])

{

cout<<"抱歉!

您所添加的城市已经存在\n";Sleep(800);return1;

}

file.open("file.txt");

file<

file.seekg(0,ios:

:

end);

file<

file<

file.close();

initialcities(t);

initialflights(t);

initialtrains(t);

cout<<"**********************城市已成功添加了呢~**********************";

Sleep(800);

return0;

}//添加城市函数,运行完之后不必调用城市初始化,初始化已包含在函数中

3.2.7测试计划

测试时通过各种不符合要求的输入来检验本模块的判错能力。

同时注意文件中新生成的信息是否与预想的吻合。

3.3.模块2(model2)

3.3.1模块描述

该模块所要实现的功能为将一个已有城市从交通信息库当中删除。

适用对象为信息库管理员,要求通过键盘输入所要删除的城市,并将信息保存到对应的文件中去。

同时要求有一定判错功能。

3.3.2输入项

要求输入一个城市名作为删除城市名,为了方便起见,这里运用STRING类作为变量类型。

3.3.3输出项

输出项为整个城市列表,要求输出到文件中去,并修改城市数

3.3.4流程逻辑

3.3.5初步代码

intdeletecity(graph&t)//返回1表示删除失败,因为城市不存在

{

chardd;unsignedinthour;unsignedintminute;intdecreasef=0;//删除城市后减少的航班数

intdecreaset=0;//删除城市后减少的列车数

inti,j;stringc;charch;intk;intm;fstreamfile;

//以上为变量声明

cout<<"这里是城市删除管理页面\n\n\n\n";

cout<<"-----------------请输入想要删除的城市:

";

cin>>c;getchar();cout<<"\n\n";

for(k=1;k<=t.citynum;k++)

{

if(c==str[k]){m=k;//m为想要删除城市的下标break;}

if(k==t.citynum){cout<<"抱歉!

您想要删除的城市不存在\n";Sleep(800);return1;}

}

//以上为判定城市是否存在

file.open("file.txt",fstream:

:

out|ios:

:

trunc);file<

for(i=1;i<=t.citynum;i++)//现在的城市数还是未删之前的

{

if(i!

=m)file<

elsecontinue;

}

file.close();

for(i=m,j=1;j<=t.citynum;j++)

{decreasef+=t.map[i][j].flightnum;decreaset+=t.map[i][j].trainnum;}

for(i=1,j=m;i<=t.citynum;i++)

{decreasef+=t.map[i][j].flightnum;decreaset+=t.map[i][j].trainnum;}

decreasef=decreasef-t.map[m][m].flightnum;

decreaset=decreaset-t.map[m][m].trainnum;

//以上已经将数据结构更新完毕

接下来将文件全数更新一下即可

3.3.6测试计划

测试时通过各种不符合要求的输入来检验本模块的判错能力。

同时注意文件中新生成的信息是否与预想的吻合。

3.4.模块3(model3)

3.4.1模块描述

该模块所要实现的功能为将一个新航班加入到交通信息库当中。

适用对象为信息库管理员,要求通过键盘输入所要添加的新航班,并将信息保存到对应的文件中去。

同时要求有一定判错功能。

3.4.2输入项

要求输入一连串信息作为航班信息:

string类型的出发地、目的地、航班号,以钟点形式输入起止时间,以整型输入花费。

3.4.3输出项

输出项为整个型航班信息,要求输出到文件中去,并修改相应量值。

3.4.4流程逻辑

3.4.5初步代码

intaddflight(graph&t)//若返回1则说明所要添加航班已经存在

{chardd;charch;intp=0;intk,k1,k2;intj;inti;stringc,c1,c2;fstreamfile;

//以上为变量声明

file.open("flight.txt");cout<<"这里是航班添加管理页面";outputflights(t);

for(;p==0;)

for(k=1;k<=t.citynum;k++)

{

if(c==str[k]){k1=k;p=1;break;}

if(k==t.citynum)

{

cout<<"-此城市尚未添加,请输入已有的城市作为航班出发点:

";

cin>>c;getchar();cout<<"\n\n";

}

}

cout<<"请输入所要添加航班目的地:

";cin>>c1;getchar();cout<<"\n\n";

for(p=0;p==0;)

for(k=1;k<=t.citynum;k++)

{

if(c1==c)

{

cout<<"---------出发点与目的地不可相同,请重新输入航班目的地:

";

cin>>c1;getchar();cout<<"\n\n";break;

}

if(c1==str[k]){k2=k;p=1;break;}

if(k==t.citynum)

{

cout<<"---------此城市尚未添加,请输入已有的城市作为航班目的地:

";

cin>>c1;getchar();cout<<"\n\n";

}}

cout<<"---------请输入所要添加的航班号:

";cin>>c2;getchar();

for(i=1;i<=t.map[k1][k2].flightnum;i++)

if(t.map[k1][k2].flightinf[i].code==c2)

{

cout<<"您所要添加的航班已经存在,请核实后再进行添加!

\n";

Sleep(800);return1;

}}接下来将航班列表文件更新即可

3.4.6测试计划

测试时通过各种不符合要求的输入来检验本模块的判错能力。

同时注意文件中新生成的信息是否与预想的吻合。

3.5.模块4(model4)

模块4与模块2的思想与流程基本一致这里只提供初步代码

intdeleteflight(graph&t)//若返回值为1,则说明指定删除的航班不存在

{chardd;charch;unsignedinthour;unsignedintminute;fstreamfile;intm;inti,j;intk1,k2;//k1k2用来记录出发点与目的地

intp=0;stringc,c1,c2;intk;

//以上为变量声明

cout<<"这里是航班删除管理页面";outputflights(t);

for(;p==0;)

for(k=1;k<=t.citynum;k++)

{if(c==str[k])

{p=1;k1=k;break;}

if(k==t.citynum)

{

cout<<"此城市尚未添加,请输入已有的城市作为航班出发点:

";

cin>>c;getchar();cout<<"\n\n";

}}

cout<<"---------请输入删除航班目的地:

";

cin>>c1;getchar();cout<<"\n\n";

for(p=0;p==0;)

for(k=1;k<=t.citynum;k++)

{if(c1==c)

{

cout<<"---------出发点与目的地不可相同,请重新输入航班目的地:

";

cin>>c1;getchar();cout<<"\n\n";break;

}

if(c1==str[k]){p=1;k2=k;break;}

if(k==t.citynum)

{

cout<<"---------此城市尚未添加,请输入已有的城市作为航班目的地:

";

cin>>c1;getchar();cout<<"\n\n";

}}

cout<<"输入删除航班航班号";cin>>c2;getchar();cout<<"\n\n";

for(i=1;i<=t.map[k1][k2].flightnum;i++)

{if(c2==t.map[k1][k2].flightinf[i].code){m=i;break;}

if(i==t.map[k1][k2].flightnum)

{cout<<"您所要删除的航班不存在!

";Sleep(800);return1;}}

nflight--;

for(i=m;i

t.map[k1][k2].flightnum--;

接下来更新文件即可

3.5.模块4(model4)

3.5.1模块描述

在这个模块中,普通用户可以查询两座城市之间的最少花费路径。

通过输入两城市名,程序会列出一条花费最短路径以供参考。

3.5.2模块主要算法分析

本模块用到了图论中求解最短路径的迪杰斯特拉算法。

迪杰斯特拉算法需要三个辅助数组来完成最短路径求解。

首先为FINAL[i]数组,它的作用是判断起点到i号结点的最短路径是否已经求解完毕,若FINAL[i]等于1则说明已经结束。

一开始final中只有起点值为1,其余均为0.第二个辅助数组为weight[i],他存储的的是当前到达i结点的路径最短权值。

由图论可推得,起点到某顶点的最短路径要不是起点直达,要不就是当前weight中权值最小顶点路径加上该顶点到i号顶点路径。

所以利用这一思想,不断更新weight与final,并把每条最短路径存在第三个辅助数组PATH中,直到起点到终点的最短路径被求出为止。

3.5.3流程逻辑

3.5.4初步代码

intcostleast(graph&t)//p为传入的出发点,q为传入的终点,若返回值为1的话说明输入城市尚未添加

{charch;charcharway;intjian=1;intp;intq;usingnamespacestd;stringchu;stringdao;

stringc;inti;intj;intk;

intmincost=MAX;intmin;intm;unsignedintn;unsignedintminute;unsignedinthour;

//以上为变量声明

outputcities(t);

Sleep(1000);

outputflights(t);

printf("请输入您的出发城市:

");cin>>chu;getchar();cout<<"\n\n";

printf("请输入您的目标城市:

");cin>>dao;getchar();cout<<"\n\n";

for(i=1;i<=t.citynum;i++)

{if(chu==str[i]){p=i;break;}

elseif(i==t.citynum)

{cout<<"对不起,您输入的出发城市尚未添加!

!

\n";

Sleep(1000);return1;

}}

for(i=1;i<=t.citynum;i++)

{if(dao==str[i]){q=i;break;}

elseif(i==t.citynum)

{cout<<"对不起,您输入的目标城市尚未添加\n";

Sleep(1000);return1;

}}

//以上输入并匹配了出发点目的地

for(i=1;i<=t.citynum;i++)

for(j=1;j<=t.citynum;j++)

{if(t.map[i][j].flightnum==0||i==j)t.map[i][j].weight=MAX;

else

{for(k=1,mincost=MAX;k<=t.map[i][j].flightnum;k++)

{if(t.map[i][j].flightinf[k].cost<=mincost)

{mincost=t.map[i][j].flightinf[k].cost;

t.map[i][j].mincostflight=k;

//当前最小花费的航班编号被记录下来}}

t.map[i][j].weight=mincost;}}//二维数组map的权值已经赋值完毕

for(i=1;i<=t.citynum;i++)

{final[i]=0;weight[i]=t.map[p][i].weight;

if(t.map[p][i].weight!

=MAX)

{path[i][1]=p;path[i][2]=i;}

}final[p]=1;//以上为各个辅助数组的初始化

for(;N

{min=MAX;

for(i=1;i<=t.citynum;i++)

{if(weight[i]<=min&&final[i]!

=1){min=weight[i];j=i;}

}}

final[j]=1;N++;if(j==q){N=1;break;}

//以上程序段对当前已更新的辅助数组们进行处理,选出当前weight数组中的最小项

for(i=1;i<=t.citynum;i++)

{if(final[i]!

=1&&weight[i]>weight[j]+t.map[j][i].weight)

{weight[i]=weight[j]+t.map[j][i].weight;

for(m=1;path[j][m]!

=j;m++)path[i][m]=path[j][m];

path[i][m]=path[j][m];m++;path[i][m]=i;}

}}N=1;

//以上程序段作用为更新各辅助数组中的数据,每次对每个未结束求解顶点对应的数据进行审查

接下来将path[终点]的路径及其信息一一打出即可。

3.5.5测试计划

测试时通过各种情况的交通图来测试算法的正确性。

特别是一些特殊情况一定要多多测试。

3.6.模块5(model5)

3.6.1模块描述

在这个模块中,普通用户可以查询两座城市之间的最少时间路径。

通过输入两城市名,程序会列出一条时间最短路径以供参考。

3.6.2模块主要算法分析

这个模块用的也是迪杰斯特拉算法。

但是由于路径时间与前一趟航班到达时间有关,所以图的权值必须在运行过程中慢慢赋值,这是这一个算法与模块4最大的区别。

3.6.3流程逻辑

若j为终点

3.5.4初步代码

inttimeleast(graph&t)//pq为始末城市

{charcharway;charch;intjian=1;intp;intq;stringchu;stringdao;

unsignedintmin=MAX;unsignedintmintime=MAX;unsignedintdtime;inti;

inta,b,c,d;intk;intj;intm;intn;unsignedintminute;unsignedinthour;

unsignedinth;

printf("请输入您的出发城市:

");cin>>chu;getchar();

printf("请输入您的目标城市:

");

cin>>dao;getchar();cout<

for(i=1;i<=t.citynum;i++)

if(chu==str[i]){p=i;break;}

elseif(i==t.citynum)

{cout<<"对不起,您输入的出发城市尚未添加!

!

\n";

Sleep(1000);return1;}

for(i=1;i<=t.citynum;i++)

{f(dao==str[i]){q=i;break;}

elseif(i==t.citynum)

{cout<<"对不起,您输入的目标城市尚未添加\n";

Sleep(800);return1;}}

for(i=1;i<=t.citynum;i++)

for(j=1;j<=t.citynum;j++)

{

if(t.map[i][j].flightnum==0||i==j)t.map[i][j].weight=MAX;

elset.map[i][j].weight=0;

}//对不连通的城市进行赋值MAX,连通城市初始权值为0

for(i=1;i<=t.citynum;i++,mintime=MAX)

{final[i]=0;

if(i==p)weight[i]=MAX;

elseif(t.map[p][i].flightnum!

=0)

{for(j=1;j<=t.map[p][i].flightnum;j++)

{dtime=(t.map[p][i].flightinf[j].time2-t.map[p][i].flightinf[j].time1+24*3600)%(24*3600);

if(dtime<=mintime){mintime=dtime;t.map[p][i].mintimeflight=j;}

}

weight[i]=mintime;

t.map[p][i].flightinf[j].realwaitingtime=mintime;

}

elseif(t.map[p][i].flightnum==0)weight[i]=MAX;

if(weight[i]!

=MAX){path[i][1]=p;p

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1