交通信息查询详细设计说明书Word格式文档下载.docx
《交通信息查询详细设计说明书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《交通信息查询详细设计说明书Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
模块名称
模块标示符
管理员添加城市
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);
!
警告:
您的操作将改变交通信息库,输入1继续操作,否则离开"
:
ch=getchar();
dd=ch;
for(;
ch!
='
\n'
)ch=getchar();
if(dd!
1'
)return2;
\n\n"
-----------------请输入想要添加的城市名:
cin>
>
c;
getchar();
for(k=1;
k<
=t.citynum;
k++)
if(c==str[k])
{
抱歉!
您所添加的城市已经存在\n"
Sleep(800);
return1;
}
file.open("
file.txt"
file<
setw(6)<
t.citynum+1<
endl;
file.seekg(0,ios:
end);
file.close();
initialcities(t);
initialflights(t);
initialtrains(t);
**********************城市已成功添加了呢~**********************"
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表示删除失败,因为城市不存在
unsignedinthour;
unsignedintminute;
intdecreasef=0;
//删除城市后减少的航班数
intdecreaset=0;
//删除城市后减少的列车数
inti,j;
intm;
//以上为变量声明
cout<
这里是城市删除管理页面\n\n\n\n"
-----------------请输入想要删除的城市:
cout<
if(c==str[k]){m=k;
//m为想要删除城市的下标break;
if(k==t.citynum){cout<
抱歉!
您想要删除的城市不存在\n"
//以上为判定城市是否存在
fstream:
out|ios:
trunc);
t.citynum-1<
for(i=1;
i<
i++)//现在的城市数还是未删之前的
if(i!
=m)file<
str[i]<
elsecontinue;
for(i=m,j=1;
j<
j++)
{decreasef+=t.map[i][j].flightnum;
decreaset+=t.map[i][j].trainnum;
for(i=1,j=m;
i++)
{decreasef+=t.map[i][j].flightnum;
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;
intk,k1,k2;
intj;
inti;
stringc,c1,c2;
flight.txt"
这里是航班添加管理页面"
outputflights(t);
p==0;
)
for(k=1;
{
if(c==str[k]){k1=k;
p=1;
break;
if(k==t.citynum)
{
cout<
-此城市尚未添加,请输入已有的城市作为航班出发点:
cin>
}
}
请输入所要添加航班目的地:
c1;
for(p=0;
if(c1==c)
---------出发点与目的地不可相同,请重新输入航班目的地:
if(c1==str[k]){k2=k;
---------此城市尚未添加,请输入已有的城市作为航班目的地:
}}
---------请输入所要添加的航班号:
c2;
=t.map[k1][k2].flightnum;
if(t.map[k1][k2].flightinf[i].code==c2)
cout<
您所要添加的航班已经存在,请核实后再进行添加!
\n"
Sleep(800);
}}接下来将航班列表文件更新即可
3.4.6测试计划
3.5.模块4(model4)
模块4与模块2的思想与流程基本一致这里只提供初步代码
intdeleteflight(graph&
t)//若返回值为1,则说明指定删除的航班不存在
unsignedintminute;
intk1,k2;
//k1k2用来记录出发点与目的地
这里是航班删除管理页面"
{if(c==str[k])
{p=1;
k1=k;
此城市尚未添加,请输入已有的城市作为航班出发点:
---------请输入删除航班目的地:
{if(c1==c)
}
if(c1==str[k]){p=1;
k2=k;
输入删除航班航班号"
{if(c2==t.map[k1][k2].flightinf[i].code){m=i;
}
if(i==t.map[k1][k2].flightnum)
{cout<
您所要删除的航班不存在!
"
return1;
}}
nflight--;
for(i=m;
t.map[k1][k2].flightnum;
i++)t.map[k1][k2].flightinf[i]=t.map[k1][k2].flightinf[i+1];
t.map[k1][k2].flightnum--;
接下来更新文件即可
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;
intmincost=MAX;
intmin;
unsignedintn;
Sleep(1000);
请输入您的出发城市:
chu;
请输入您的目标城市:
dao;
{if(chu==str[i]){p=i;
elseif(i==t.citynum)
{cout<
对不起,您输入的出发城市尚未添加!
!
\n"
Sleep(1000);
}}
{if(dao==str[i]){q=i;
对不起,您输入的目标城市尚未添加\n"
//以上输入并匹配了出发点目的地
for(i=1;
for(j=1;
{if(t.map[i][j].flightnum==0||i==j)t.map[i][j].weight=MAX;
else
{for(k=1,mincost=MAX;
=t.map[i][j].flightnum;
{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的权值已经赋值完毕
{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<
t.citynum;
{min=MAX;
for(i=1;
{if(weight[i]<
=min&
&
final[i]!
=1){min=weight[i];
j=i;
}}
final[j]=1;
N++;
if(j==q){N=1;
break;
//以上程序段对当前已更新的辅助数组们进行处理,选出当前weight数组中的最小项
{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为终点
inttimeleast(graph&
t)//pq为始末城市
{charcharway;
intq;
unsignedintmin=MAX;
unsignedintmintime=MAX;
unsignedintdtime;
inta,b,c,d;
intn;
unsignedinth;
if(chu==str[i]){p=i;
{f(dao==str[i]){q=i;
}}
for(j=1;
if(t.map[i][j].flightnum==0||i==j)t.map[i][j].weight=MAX;
elset.map[i][j].weight=0;
}//对不连通的城市进行赋值MAX,连通城市初始权值为0
i++,mintime=MAX)
if(i==p)weight[i]=MAX;
elseif(t.map[p][i].flightnum!
=0)
{for(j=1;
=t.map[p][i].flightnum;
{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