📄 wyf.cpp
字号:
#include"iostream.h"
#include"string.h"
#include"fstream.h"
#include"stdlib.h"
#include"Station Name.h"
#include"Station Line.h"
#include"math.h"
int StationAndLine[108][31]; //建立矩阵,108为线路数目,31为每条线路的最多站点数
char Sname[800][200];
char out[20]="0"; //给显示车站的站名赋初值为零
void HeadOut(); //程序开头输出的部分
void CoutMenu(); //输出选择菜单
void Wexit(); //退出程序
void main(void)
{
Wzg(Sname);
StationLine(StationAndLine,Sname);
HeadOut();
//*****************以下为功能选择菜单部分代码
Choose: while(1)
{
char choice,enter;
CoutMenu();
cin>>choice;
cin.get(enter);
//*********************************************************************判断指令是否有效
while((choice!='0')&&(choice!='1')&&(choice!='2')&&(choice!='3')&&(choice!='4'))
{
cout<<"对不起,您输入的指令无效!请正确输入指令,范围为0--4"<<endl;
cin.clear();
goto Choose;
}
//**************************************************以下为输入指令是4时所执行的程序代码
while(choice=='4')
{
Wexit();
}
//***************************************************以下为当输入的指令为3时所执行的程序代码
while(choice=='3')
{
int sfz=0; //始发站变量,初值为零
int zdz=0; //终点站变量,初值为零
char begin[20];
cout<<"请输入目标站名:";
cin.getline(begin,20);
if(strcmp(begin,out)==0)
goto Choose;
for(int i=1;i<800;i++)
{
if(!strcmp(begin,Sname[i]))
{
sfz=i;
break;
}
}
while(sfz>=800||sfz<=0)
{
cout<<"对不起,没有 \""<<begin<<"\"站 您是不是要找"<<endl;
for(int i=1;i<800;i++)
{
if(!strcmp(begin,Sname[i]))
{
sfz=i;
break; //跳出本层循环,以减少运算时间
}
}
for(unsigned int x=strlen(begin);x>=2;x=x-2)
{
cout<<x/2<<endl;
for(i=1;i<800;i++)
if(!strncmp(Sname[i],begin,x)&&strncmp(Sname[i],begin,x+2))
cout<<Sname[i]<<" ";
cout<<endl;
}
cout<<"请再次输入您要查询的起始站名:";
cin.getline(begin,20); //获取需要的站点信息
if(strcmp(begin,out)==0)
goto Choose;
for( i=1;i<800;i++)
{
if(!strcmp(begin,Sname[i]))
sfz=i;
break;
}
cout<<Sname[sfz]<<endl;
}
int onway[108]; //经过该站点的公交路线
onway[0]=0;
int wayNo[31]; //在该条路线上的第几站
wayNo[0]=0;
for(int way=1;way<108;way++) //逐个查询各条线路
{
for(int sta=1,Zdpd=0;sta<31&&StationAndLine[way][sta]>0;sta++)//逐个查询某条线路的所有站点
{
if(StationAndLine[way][sta]==sfz)
{
onway[0]++; //指向下一个存储空间
onway[onway[0]]=way; //记录下经过该站点的线路
wayNo[0]++;
wayNo[wayNo[0]]=sta; //记录下该站点的站点号
}
}
}
for(int p=1;p<=onway[0];p++) //逐个定位到经过筛选的线路
{
cout<<onway[p]<<"路车经过 "<<begin<<" 站"<<endl;
for(int q=1;q<31&&StationAndLine[onway[p]][q]>0;q++)
{
if(q>1)
cout<<"<===>";
cout<<Sname[StationAndLine[onway[p]][q]]; //逐个输出指定线路上的各个站点,先进行路线的查询,再进行站点的输出
}
cout<<endl;
}
cout<<"******************************************************"<<endl;
cout<<endl<<endl<<endl;
}
//**************************************************************以下为选择2的指令所对应的代码
while(choice=='2')
{
WYF: cout<<"输入你想查询的公交路线:";
char lx[20]; //存储线路的输入信息
int chang=0;
int LL=0; //输入信息转换为数字后的存储地址
char w1,w2,w3; //用于判断信息的可信性
cin>>lx;
chang=strlen(lx);
if(chang>=4) //输入的信息过多
goto RCIN;
if(strcmp(lx,out)==0)
{
cout<<endl;
break;
}
w1=lx[0];w2=lx[1];w3=lx[2]; //取出输入的字符串的前三位
if(((w1-48)==1)&&((w2-48)==0)&&((w3-48)<=8)||((w3-48)>=0)) //判断输入的是否是三位数
{
LL=100*(w1-48)+10*(w2-48)+(w3-48); //取出需要的路线号
cout<<LL<<endl;
if(LL>108)
goto RCIN;
else goto Shuchu;
}
else if(((w1-48)>=0)&&((w1-48)<=9)&&((w2-48)>=0)&&((w2-48)<=9)) //判断输入的是否是二位数
{
LL=10*(w1-48)+(w2-48); //取出需要的线路号
cout<<LL<<endl;
goto Shuchu;
}
else if(((w1-48)>0)&&((w1-48)<=9)) //判断输入的是否是个位数
{
LL=(w1-48);cout<<LL<<endl; //取出需要的线路号
goto Shuchu;
}
else goto RCIN;
RCIN: cout<<" 对不起,本程序中不含有您想查询的这一路线!!!! 请重新输入你想查询的公交路线:有效路线范围从1--108"<<endl;
cin.clear();
cin.ignore(20,'\n'); //取出缓冲区的其余字符
goto WYF;
Shuchu: for(int p=1;p<31&&StationAndLine[LL][p]>0;p++)
cout<<Sname[StationAndLine[LL][p]]<<"---";
cout<<endl<<endl;
cout<<"******************************************************************************"<<endl;
cout<<endl<<endl;
}
//******************************************************************************以下为输入指令为1时所执行的程序代码
while(choice=='1')
{
int sfz=0; //始发站
int zdz=0; //终点站
char begin[20],end[20];
kk: cout<<"输入起始站名:";
cin.getline(begin,20);
if(!strcmp(begin,out)) //进行车站匹配
{
cout<<endl<<endl;
goto Choose;
}
cout<<endl;
for(int i=1;i<800;i++)
{
if(!strcmp(begin,Sname[i]))
{
sfz=i;
break;
}
}
while(sfz>=800||sfz<=0)
{
cout<<"无 \""<<begin<<"\" 站 你是不是要找"<<endl;
for(int i=1;i<800;i++)
{
if(!strcmp(begin,Sname[i]))
{
sfz=i;
break;
}
}
for(unsigned int x=strlen(begin);x>=2;x=x-2)
{
cout<<x/2<<endl;
for(i=1;i<800;i++)
if(!strncmp(Sname[i],begin,x)&&strncmp(Sname[i],begin,x+2))
cout<<Sname[i]<<" ";
cout<<endl;
}
cout<<"请再次输入起始站名:";
cin.getline(begin,20);
if(!strcmp(begin,out)) //进行车站匹配
{
cout<<endl<<endl;
goto Choose;
}
for( i=1;i<800;i++)
{
if(!strcmp(begin,Sname[i]))
sfz=i;
break;
}
cout<<Sname[sfz]<<endl;
}
/*匹配终点站*/
cout<<"输入终点车站的站名:";
cin.getline(end,20);
if(!strcmp(end,out)) //进行车站匹配
{
cout<<endl<<endl;
goto Choose;
}
cout<<endl;
for(i=1;i<800;i++)
{
if(!strcmp(end,Sname[i]))
{
zdz=i;
break;
}
}
while(zdz>=800||zdz<=0)
{
cout<<"无 \""<<end<<"\" 站 你是不是要找"<<endl;
for(int i=1;i<800;i++)
{
if(!strcmp(end,Sname[i]))
{
zdz=i;
break;
}
}
for(unsigned int x=strlen(end);x>=2;x=x-2)
{
cout<<x/2<<endl;
for(i=1;i<800;i++)
if(!strncmp(Sname[i],end,x)&&strncmp(Sname[i],end,x+2))
cout<<Sname[i]<<" ";
cout<<endl;
}
cout<<"请再次输入终点站名:";
cin.getline(end,20);
if(!strcmp(end,out)) //进行车站匹配
{
cout<<endl<<endl;
goto Choose;
}
for( i=1;i<800;i++)
{
if(!strcmp(end,Sname[i]))
zdz=i;
}
cout<<Sname[zdz]<<endl;
}
cout<<sfz<<Sname[sfz]<<endl;
cout<<zdz<<Sname[zdz]<<endl;
//********************************************************算法部分
int onway[108]; //经过始发站的公交路线
onway[0]=0;
int wayNo[31]; //在该条路线上的第几站
wayNo[0]=0;
//**************************************************************
int onway2[108]; //用于二次转车
onway2[0]=0;
int wayNo2[31]; //用于二次转车
wayNo2[0]=0;
int qqq=0; //标记转车情况
int i2=0; //二次转车中记录线路
int j2=0; //二次站点中记录站点
int num2=0; //用于二次转车中记录站点数
int moon=1; //用于输出判断
//**************************************************************
PPP: for(int way=1,Zdpd=0;way<108;way++)
{
for(int sta=1;sta<31&&StationAndLine[way][sta]>0;sta++)
{
if(StationAndLine[way][sta]==sfz)
{
onway[0]++; //记录路线
onway[onway[0]]=way;
wayNo[0]++; //记录站点
wayNo[wayNo[0]]=sta;
for(int destination=1;destination<31&&StationAndLine[way][destination]>0;destination++)//扫描站点
if(StationAndLine[way][destination]==zdz) //判断匹配情况
{
Zdpd++;
cout<<"你可以乘坐"<<way<<"路车直接到达"<<Sname[zdz]<<" 路程为"<<abs(sta-destination)<<"站!"<<endl;
moon++;
goto kk;
}
}
}
}
//**********************************************没有直达车情况下的代码
if(!Zdpd)
{if(moon==1)cout<<"对不起,无直达车"<<endl;moon++;} //moon用来表示输出这一信息的次数
else cout<<Zdpd<<endl;
int Zcpd=0; //判断转车(一次)
if(!Zdpd)
{
for(i=1;i<=onway[0];i++) //经过的第i趟车,onway[i]代表第i趟车的车次
for(int j=1;j<31&&j!=wayNo[i];j++) //第i趟车的第j个站
for(int way=1,Zdpd=0;way<108;way++)
{ //将这个站视为始发站 重复第一步
for(int sta=1;sta<31&&StationAndLine[way][sta]>0;sta++)//以下部分类似于直达判断
{
if(StationAndLine[way][sta]==StationAndLine[onway[i]][j])
{
for(int destination=1;StationAndLine[way][destination]>0;destination++)
{
if(StationAndLine[way][destination]==zdz)
{
if(qqq==1)
{
cout<<"要转两次车"<<" 请先乘坐"<<onway2[i2]<<"到"<<Sname[sfz]<<"然后,";
num2=abs(j2-wayNo2[i2]);//第二次转车经历的站点数目
}
if(qqq==0)
cout<<"转一次车,";
cout<<"您可以乘坐"<<onway[i]<<"路车到达"<<Sname[StationAndLine[onway[i]][j]];
cout<<"再转乘"<<way<<"到达"<<Sname[zdz];
//用于计算站点数的三部分,分别为所乘的三次车经历的站点数,转一次车时num2为零
cout<<" 路程为"<<abs(sta-destination)+abs(wayNo[i]-j)+num2;
cout<<"站!"<<endl;
Zcpd++; //表明能够通过转车到达目的站点
}
}
}
}
}
}
if(!Zcpd)
{
qqq=1;
for(int q1=0;q1<108;q1++)
{
onway2[q1]=onway[q1]; //存储已得信息
}
for(int q2=0;q2<31;q2++)
{
wayNo2[q2]=wayNo[q2]; //同上
}
for( i2=1;i2<=onway2[0];i2++)
for( j2=1;j2<31&&j2!=wayNo2[i2];j2++)
{
sfz=StationAndLine[onway2[i2]][j2];
goto PPP;
}
}
if(Zdpd==0&&Zcpd==0) //需要转两次车以上
cout<<"对不起,转车次数过多,请打Taxi"<<endl;
}
}
}
void HeadOut()
{
cout<<"------------------------Welcome To Our Bus Asker System----------------------"<<endl<<endl;
cout<<" --------- ※※ 作 者:王颖锋 王志刚 ※※ --------- "<<endl;
cout<<" --------- ※※ 指导老师:茅耀斌 ※※ --------- "<<endl;
cout<<"#############################################################################"<<endl;
cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl<<endl;
}
void CoutMenu()
{
cout<<" 请选择你需要的功能:"<<endl;
cout<<" <1> 查询指定所乘车站到目的地"<<endl;
cout<<" <2> 查询指定公交路线所经过的站点"<<endl;
cout<<" <3> 查询经过指定站点的公交车次"<<endl;
cout<<" <0> 返回主菜单 "<<endl;
cout<<" <4> 退出程序"<<endl;
cout<<" 请输入您的选择(本程序支持模糊查询,但请保证您所输入的地址的首字正确): "<<endl;
}
void Wexit()
{
cout<<"感谢您的使用,设计不到之处敬请原谅!"<<endl;
cout<<"*************************************************************"<<endl;
exit(1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -