📄 最终修改.txt
字号:
#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 + -