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

📄 最终修改.txt

📁 本程序实现的是南京的公交线路查询
💻 TXT
📖 第 1 页 / 共 3 页
字号:

#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<math.h>
struct change/////标记中转一次时由起点到终点的所有属性
{
	char round[20];////中转点名称
	char begin_line[20];////起始到中转点要坐的车号
	int begin_id;/////起点到中转的id号
	char end_line[20];///记录中转到终点的车号
	int end_id;////中转到终点的id号
	int lu_cheng;/////要经过的路程数
	
};

struct together
{
	char way[20];////标记是哪一路车
	int num;////标记着一路车在整个路线的位置
};

char input1[20];////
char input2[20];////两个字符数组,用于存放两个输入的字符

struct station
{
	char name[20];////站点的名字
	together biaoji[40];///包括车号和站点的排序
	int num;////标记已经有了多少个站台库
	int line_in;////标记有了多少条线路入栈
	int quan;/////比较在模糊算法中的比较权值
	//	int way[100];////经过站点的车的车号
	//	int biaoji[200];////biaoji数组的作用是标明当前站台是某一条公交线的正向第几站
	//	station *next;///指向下一个站点
};

struct bus
{
//	int num;////公交车的车号,整型值
	char name[20];////公交车的车号
	char line[50][20];///////记录这一条公交线所经过的车站的名字
	int geshu;////记录这一条线共有多少条站
	int id;/////用于记录本站在bus_line数组中的标号
	
};
station stage[2000];
bus bus_line[200];
int stage_num=0;////record tmpe stage
int bus_num=0;///record temp bus
/*
int char_int(char m)
{
	switch(m)
	{
	case '0':return 0;break;
	case '1':return 1;break;
	case '2':return 2;break;
	case '3':return 3;break;
	case '4':return 4;break;
	case '5':return 5;break;
	case '6':return 6;break;
	case '7':return 7;break;
	case '8':return 8;break;
	case '9':return 9;break;
		
	}
}
*/
///////将字符数组的值转化为整数值//////
/*
int convert(char*p)
{
	
	int tmp;////
	tmp=char_int(p[0])*100+char_int(p[1])*10+char_int(p[2]);
	return tmp;
	
}
*/

//////////***函数的作用是产生字符串比较的权值,看他们的相似程度***////////////
int mohu(char *mohu_in,char *have)
{
	
	int tmp_num=0;
	int ret_num=0;
	int max;////数组中长度比较长的那一个的长度
	int min;////数组中长度比较短的那一个
	if(strlen(mohu_in)>=strlen(have))
	{
		
		max=strlen(mohu_in);
		min=strlen(have);
		
	}
	else
	{
		
		max=strlen(have);
		min=strlen(mohu_in);
		
		
	}
	
	for(int wife0=0;wife0<=(max-min);wife0++)////总共要比较的次数
	{
		for(int wife1=0;wife1<min;wife1++)///对于每一次比较而言所要比较的字符的数目
		{
			if(strlen(mohu_in)>=strlen(have))//////字符char0的长度大于字符串char1的情况
			{
				
				if(have[wife1]==mohu_in[wife1+wife0])
					tmp_num++;
				
				
			}
			else
			{
				if(mohu_in[wife1]==have[wife1+wife0])
					tmp_num++;
				
				
				
				
			}
			
			
			
		}
		if(tmp_num>=ret_num)
			ret_num=tmp_num;
		tmp_num=0;
		
	}
	return ret_num;
	
}
///////////////////////****以上函数是模糊搜索要用到的函数*****///////////////////////////

////////****下面函数的作用是建立stage结构体和bus结构体*****////////////
void read_file(void)
{
	char ch;
	int tmp1=0;////用于记录站牌的数字
	int tmp2=0;////用于记录在一条公交线上的站牌数量
	int tmp3=0;////用于记录一个站牌的字符到了第几个
	int enable_add_line=1;////允许现在是加入到公交线路中
	
	ifstream infile;
	infile.open("公交线路.txt");
	
	while(infile>>ch)
	{	
		
		if(ch==' ')continue;/////不考虑空格在其中的作用
		if(ch==':')///////当遇到':'时表示公交线路名字的输入结束,把输入字符只当作字符来看
		{
			enable_add_line=0;
			continue;
		}

		if(enable_add_line==1)
		{
			bus_line[bus_num].name[tmp1]=ch;
			tmp1++;
			//		if(tmp1==3)tmp1=0;
			//////****首先得到站牌的号码***/////
		}
		else
		{
			
			if(ch==',')////tmp2记录在每一条线上的站点
			{
				tmp2++;
				tmp3=0;
			}
			else
			{
				if(ch==';')
				{
					enable_add_line=1;//////当遇到';'时表示一条公交线路的录入结束了,允许加入到公交线的名字
					bus_line[bus_num].id=bus_num;

		//曹金灿改	bus_line[bus_num].num=convert(bus_line[bus_num].name);
					bus_line[bus_num].geshu=tmp2;
					bus_num++;////;为每一条线路的结束标志
					
					tmp1=0;
					tmp2=0;
					tmp3=0;
					///////***重新初始化等待下一次**//////
				}
				else
				{
					bus_line[bus_num].line[tmp2][tmp3]=ch;
					//		cout<<tmp2;
					tmp3++;
				}
				
			}
			
			
			
			
		}
		
		
		
		
	}
	
	infile.close();
	
}

/////////*****将TXT文档中的值写到bus_line结构体中*****//////////
///////****以下函数的的作用是处理站点所对应的公交线路的值****/////////
////////**以下的函数的处理可以在一个bus_line结构体数组中取值**///////

int judge(char*p1,char*p2)
{
	int kk;
	kk=strcmp(p1,p2);
	if(kk==0)
		return 1;/////相等为1,不相等为0  
	else
		return 0;
}


void gene_station(void)
{
	int tmp1;///记录200条公交线进展到了哪一个
	int tmp2;////一条公交线所经历的站点数
	int tmp3;///
	int tmp4=0;////标记有了多少个站台库
	int enable=1;/////标记要插入的的是不是有了,起先是都允许插入的,如果有相同的就不允许插入
	int start_up=1;/////第一次初始化的标志位
	int counter=0;////纪录这是经过这一个站点的第几条线
	int flag_tmp=1;
	for(tmp1=0;tmp1<=bus_num;tmp1++)////遍历所有的公交线
	{
		
		//test	else///////////***在以后的路线中,首先要查找和前面的是不是有重复,没有重复再加入新的站点****///////////////
		//test	   {
		for(tmp2=0;tmp2<=bus_line[tmp1].geshu;tmp2++)///tmp2 指在一条公交线所经过的站点数
		{
			////查找和前面的是不是有重复///
			for(tmp3=0;tmp3<=stage_num;tmp3++)/////tmp3标记现有的站点的数量
			{
				int cao;
				cao=strcmp(bus_line[tmp1].line[tmp2],stage[tmp3].name);
				if(cao==0)////如果相同则将车辆信息加入到这一个站点
				{
					
					stage[0].num=0;
					strcpy(stage[tmp3].biaoji[stage[tmp3].line_in].way,bus_line[tmp1].name);
					stage[tmp3].biaoji[stage[tmp3].line_in].num=tmp2;////一辆车的下行站点数
					enable=0;
					stage[tmp3].line_in++;
					break;
				}
				
			}
			//////////////////判断重复结束///////////////////////
			if(enable==1)////在查找的过程中如果没有发现相同的则允许加入新的站点
			{	///**注意在新的站点加入的过程中,要将当前值纪录进去**///
				stage_num++;
				tmp4++;
				strcpy(stage[stage_num].name,bus_line[tmp1].line[tmp2]);
				strcpy(stage[stage_num].biaoji[0].way,bus_line[tmp1].name);
				stage[stage_num].biaoji[0].num=tmp2;////一辆车的下行站点数
				stage[stage_num].num=stage_num;
				stage[stage_num].line_in=1;/////标记入栈的已经有了一个			
				
			}
			
			
			enable=1;/////为下一个站点的进入而准备
			
		}
		
		
		//test		}
		
	}	
}
////////****站点录入结束,已经成功****///////////



void main(void)
{
	int begin_stage=-1;/////起点站所在整个stage队列数组中的位置
	int end_stage=-1;////终点站在整个stage队列数组中的位置
	int correct0=0;
	int correct1=0;
	int correct2=0;
	//////////////////////////////////////////////
	char same[20][20];//////用于记录不需要转车的交集
	char same1_1[20][20];////用于记录需要转车时起点到中途的路径
	int same1_1counter=0;
	char same1_2[20][20];///用于记录需要转车时从中转站到终点的路径,和上面一一对应
	int same1_2counter=0;
	///////////////////////////////////////////////////////
	int same_counter0=0;/////用于记录不要转车的交集个数
	int same_counter1=0;/////用于记录要转一次车的交集个数
	int same_counter2=0;/////用于记录要转两次车的交集个数
//	char zhongtu0[20];/////用于中途转车的地点
	int enable_add=1;/////看当前的车站点是不是可以加入
	int cross_stage=0;///计算从起始站可以到达的站台的集合
	
	char line_all[1000][20];/////用于记录从起点站出发所有可能到达站的集合
	char line_num[200][20];/////存放line_all数组站台所经过的公交车的路数
	int line_num_flag=0;/////已经有多少公交车进入line_num数组
	int line_num_enable=1;
	int zhongzhuan_counter=0;
//	station begin[30];
//	station end[30];
	int out_enter=0;
	change zhongzhuan[100];/////查询时的中转站
	
	
	change least;///////存放临时的zhongzhuan数组,用于排序
	
	read_file();
	gene_station();	
	
	
	
	//////////////////////////////////////
	while(1)
	{
		int fun;
		char input_line[10];
		int boy0;
		int girl0;
		int boy1;
		int girl1;
		char input_stage[20];
		char mind;
		int compare;
		int she;/////用在模糊函数的处理中
		int xiao0[100];///找到最大权值的ID(num),有可能存在相同的权值
		int xiao0_counter=0;
		int xiao1=0;////临时的值,
		int tishi=0;/////输入乘车的选择方案以便具体给出经过哪些站点
		int line_cmp_result;
		cout<<"            功能菜单选项"<<endl;
		cout<<endl;
		cout<<"            0.退出"<<endl;
		cout<<endl;
		cout<<"            1.查询某一条公交线的状况"<<endl;
		cout<<endl;
		cout<<"            2.查询经过某一个站点的所有的公交线路"<<endl;
		cout<<endl;
		cout<<"            3.查询从起点到终点的所有路径"<<endl;
		cout<<endl;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -