⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wyf.cpp

📁 本软件能够查询南京市的公交线路
💻 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 + -