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;it.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