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

📄 new_file.cpp

📁 本程序实现的是南京的公交线路查询
💻 CPP
📖 第 1 页 / 共 5 页
字号:
								//////**下面的进一步的设计思想是对change_two[200]数组进行赋值,得到具体的方案**//////
								
								for(int xz4=0;xz4<same2_middle_flag;xz4++)
								{
									change_two[xz4].my_id=xz4;////对change_two[200]的id进行赋值
									strcpy(change_two[xz4].change_line2,same2_middle[xz4]);////对change_two[200]的中转公交线路进行赋值
									////**以下是查询中转公交线路的id值**////
									change_two[xz4].change_id2=return_bus_id(same2_middle[xz4]);////得到了中间一路的公交车的id号码的值
								}
								change_two_flag=same2_middle_flag;/////change_two_flag表示的是中转线路的条数
								////***根据中转的公交线路集和起始站所能达到的公交线路集的交点可以得到转车的地点***////
								for(int pyk0=0;pyk0<change_two_flag;pyk0++)////遍历所有的中间路线的数量
								{
									change_two[pyk0].begin_to_change1_flag=0;////中转1站点的数量,起始值为0
									change_two[pyk0].end_to_change2_flag=0;////中转2站点的数量,起始值为0
									
									for(int pyk1=0;pyk1<=bus_line[change_two[pyk0].change_id2].geshu;pyk1++)////遍历所有中转路线所经过的站点
									{
										for(int pyk2=0;pyk2<line_num_flag;pyk2++)/////遍历所有由起点站可以直接达到的站台
										{
											int tmp_pyk;
											tmp_pyk=strcmp(line_all[pyk2],bus_line[change_two[pyk0].change_id2].line[pyk1]);
											if(tmp_pyk==0)//////如果找到中转点,则将其计入在起点到中转的1号中转站中
											{
												strcpy(change_two[pyk0].begin_to_change1[change_two[pyk0].begin_to_change1_flag].change_round,line_all[pyk2]);
												
												//**在整个站台数组中寻找到当前中转站台的ID号**//
												for(int baby0=0;baby0<=stage_num;baby0++)////遍历所有的站点
												{
													int tmp_baby0;
													tmp_baby0=strcmp(stage[baby0].name,line_all[pyk2]);
													if(tmp_baby0==0)/////找到了相同的站点,将ID值赋值进去
													{
														change_two[pyk0].begin_to_change1[change_two[pyk0].begin_to_change1_flag].change_round_id=stage[baby0].num;				
													}														
												}
												
												change_two[pyk0].begin_to_change1_flag++;//////站点的数量变多
												
											}																						
										}
										
										for(int pyk3=0;pyk3<line_num_flag2;pyk3++)/////遍历所有终点站可以直接到达的站点
										{
											int tmp_pyk3;
											tmp_pyk3=strcmp(line_all2[pyk3],bus_line[change_two[pyk0].change_id2].line[pyk1]);
											if(tmp_pyk3==0)////如果找到交点,将其计入到终点到中转2的站点数组中
											{
												
												strcpy(change_two[pyk0].end_to_change2[change_two[pyk0].end_to_change2_flag].change_round,line_all2[pyk3]);
												for(int son0=0;son0<=stage_num;son0++)/////比较中转2站点和所有的站台库
												{
													int tmp_son0;
													tmp_son0=strcmp(line_all2[pyk3],stage[son0].name);
													if(tmp_son0==0)////找到相同的站点,将ID值进入
													{
														change_two[pyk0].end_to_change2[change_two[pyk0].end_to_change2_flag].change_round_id=stage[son0].num;					
													}
													
												}
												change_two[pyk0].end_to_change2_flag++;
												
											}																																																		
										}
									}																											
								}
								////测试 cout<<"第一条公交线路为"<<change_two[2].change_line2<<",她的经过的两个 站点分别为"<<change_two[2].begin_to_change1[0].change_round<<"第二个为"<<change_two[2].end_to_change2[0].change_round<<endl;
								/////////**到现在为止,得到了两个中转站的站点的名称和两个中转站之间的路线,下一步是要得到起点到中转1和终点到中转2的公交车的ID号**//////////		
								///**由上面可以得到起点车站的id号为begin_stage,,终点车站的id号为end_stage**///
								///*下面的程序的设计思想是,在站台库中找到中转1的站台的id号,所经过这个站点的公交线路与起始站的公交线路的交集就是起点到中转1的公交路线,可能有多个*///
								/////**遍历所有的中间路线,对于每一个中间路线而言要遍历其所有的中转站点,对于每一个中转站点要遍历其所有的经过的公交线路,再与经过起始站点的公交路线相比较**////
								for(int pyk4=0;pyk4<change_two_flag;pyk4++)//////遍历所有的中间路线
								{
									
									/////////**起点到中转1部分的程序**//////////
									for(int pyk5=0;pyk5<change_two[pyk4].begin_to_change1_flag;pyk5++)/////遍历所有的以本条公交线为中转的所有起点到中转1的方案
									{
										change_two[pyk4].begin_to_change1[pyk5].change_line_num=0;
										
										for(int pyk6=0;pyk6<stage[change_two[pyk4].begin_to_change1[pyk5].change_round_id].line_in;pyk6++)////遍历中转站的所有经过的路线值
										{
											for(int pyk7=0;pyk7<stage[begin_stage].line_in;pyk7++)////遍历所有的起点站点所经过的路线
											{
												int tmp_pyk7;
												tmp_pyk7=strcmp(stage[begin_stage].biaoji[pyk7].way,stage[change_two[pyk4].begin_to_change1[pyk5].change_round_id].biaoji[pyk6].way);
												if(tmp_pyk7==0)//////找到中转1与起点所共有的公交路线
												{
													strcpy(change_two[pyk4].begin_to_change1[pyk5].change_line_name[change_two[pyk4].begin_to_change1[pyk5].change_line_num],stage[begin_stage].biaoji[pyk7].way);////赋值到公交线路
													change_two[pyk4].begin_to_change1[pyk5].change_line_id[change_two[pyk4].begin_to_change1[pyk5].change_line_num]=return_bus_id(stage[begin_stage].biaoji[pyk7].way);/////赋值与本条线路所对应的ID值
													change_two[pyk4].begin_to_change1[pyk5].qidian_stage_num[change_two[pyk4].begin_to_change1[pyk5].change_line_num]=stage[begin_stage].biaoji[pyk7].num;//////记录起点在本条起点到中转1的公交路线中对应的站号
													change_two[pyk4].begin_to_change1[pyk5].zhongdian_stage_num[change_two[pyk4].begin_to_change1[pyk5].change_line_num]=stage[change_two[pyk4].begin_to_change1[pyk5].change_round_id].biaoji[pyk6].num;//////记录中转站1在本条起点到中转1的站号
													change_two[pyk4].begin_to_change1[pyk5].distance[change_two[pyk4].begin_to_change1[pyk5].change_line_num]=abs(stage[begin_stage].biaoji[pyk7].num-stage[change_two[pyk4].begin_to_change1[pyk5].change_round_id].biaoji[pyk6].num);////赋值两者所差的距离值
													change_two[pyk4].begin_to_change1[pyk5].change_line_num++;////得到的由起点到中转1的路线的数量变多						
													
												}
												
											}											
										}										
									}																		
									//////**终点到中转2部分的程序**//////
									for(int pyk8=0;pyk8<change_two[pyk4].end_to_change2_flag;pyk8++)//////遍历所有此中转线对应的中转2的可能数目
									{
										change_two[pyk4].end_to_change2[pyk8].change_line_num=0;
										for(int pyk9=0;pyk9<stage[change_two[pyk4].end_to_change2[pyk8].change_round_id].line_in;pyk9++)////遍历所有的经过中转2的路线
										{
											for(int pyk10=0;pyk10<stage[end_stage].line_in;pyk10++)///遍历所有经过终点的路线
											{
												int tmp_pyk10;
												tmp_pyk10=strcmp(stage[end_stage].biaoji[pyk10].way,stage[change_two[pyk4].end_to_change2[pyk8].change_round_id].biaoji[pyk9].way);
												if(tmp_pyk10==0)////比较得到了中转2到终点相同的公交路线
												{
													strcpy(change_two[pyk4].end_to_change2[pyk8].change_line_name[change_two[pyk4].end_to_change2[pyk8].change_line_num],stage[end_stage].biaoji[pyk10].way);
													change_two[pyk4].end_to_change2[pyk8].change_line_id[change_two[pyk4].end_to_change2[pyk8].change_line_num]=return_bus_id(stage[end_stage].biaoji[pyk10].way);////赋值与本条路线所对应的ID值
													change_two[pyk4].end_to_change2[pyk8].qidian_stage_num[change_two[pyk4].end_to_change2[pyk8].change_line_num]=stage[change_two[pyk4].end_to_change2[pyk8].change_round_id].biaoji[pyk9].num;///////记录在中转2到终点的公交线路中的起点(中转2)的站台号
													change_two[pyk4].end_to_change2[pyk8].zhongdian_stage_num[change_two[pyk4].end_to_change2[pyk8].change_line_num]=stage[end_stage].biaoji[pyk10].num;////得到了终点在中转2到终点的公交线路中的站台号
													change_two[pyk4].end_to_change2[pyk8].distance[change_two[pyk4].end_to_change2[pyk8].change_line_num]=abs(stage[end_stage].biaoji[pyk10].num-stage[change_two[pyk4].end_to_change2[pyk8].change_round_id].biaoji[pyk9].num);
													change_two[pyk4].end_to_change2[pyk8].change_line_num++;											
												}											
											}																				
										}										
									}									
									/////////***到现在为止已经得到了由一条中间线路得到的起始线和终了线所应该乘坐的公交线路***/////////
								}
								
								
								////////**程序的主体算法已经完成,下面将所得到的结果整理后到final_out数组中便于输出,标记为final_out_flag**///////
								for(int yml0=0;yml0<change_two_flag;yml0++)////遍历所有的中间路线
								{
									for(int yml1=0;yml1<change_two[yml0].begin_to_change1_flag;yml1++)/////遍历所有的这一条中间线路的可能中转1站点
									{
										for(int yml2=0;yml2<change_two[yml0].end_to_change2_flag;yml2++)////遍历所有对应于这一条中间线路的中转2站点,此时两个中转站已经确定下来了
										{
											for(int yml3=0;yml3<change_two[yml0].begin_to_change1[yml1].change_line_num;yml3++)////对应于同一个zhongzhuan1,遍历起点到中转1的所有可能公交路线
											{
												for(int yml4=0;yml4<change_two[yml0].end_to_change2[yml2].change_line_num;yml4++)//////对应于同一个zhongzhuan2,遍历终点到中转2的所有可能公交路线
												{
													int use_for_tmp0;////中转1在stage数组中的ID号
													int use_for_tmp1;////中转2在stage数组钟的ID号
													int use_for_tmp2;/////得到的是中转1在中转公交线路中的位置值
													int use_for_tmp3;/////得到的是中转2在中转公交线路中的位置值
													strcpy(final_out[final_out_flag].zhongzhuan1_stage,change_two[yml0].begin_to_change1[yml1].change_round);////将中转1的站点值进入final_out数组
													strcpy(final_out[final_out_flag].zhongzhuan2_stage,change_two[yml0].end_to_change2[yml2].change_round);/////将中转2的站点值进入final_out数组


													strcpy(final_out[final_out_flag].begin_to_zhongzhuan1,change_two[yml0].begin_to_change1[yml1].change_line_name[yml3]);///将起点到中转1所要乘坐的公交线路的名称进入final_out数组
													final_out[final_out_flag].begin_to_zhongzhuan1_begin_num=change_two[yml0].begin_to_change1[yml1].qidian_stage_num[yml3];//////将起点在整个起点到中转1的公交线路中的站牌号赋值进入
													final_out[final_out_flag].begin_to_zhongzhuan1_end_num=change_two[yml0].begin_to_change1[yml1].zhongdian_stage_num[yml3];//////将中转1在整个起点到中转1的公交线路中的站牌号赋值进入final_out结构体数组
//													final_out[final_out_flag].begin_to_zhongzhuan1_id=return_bus_id(final_out[final_out_flag].begin_to_zhongzhuan1);/////返回起点到中转1的公交路线ID值

													strcpy(final_out[final_out_flag].zhongzhuan2_to_end,change_two[yml0].end_to_change2[yml2].change_line_name[yml4]);/////将中转2到终点所要乘坐的公交车进入final_out数组
													final_out[final_out_flag].zhongzhuan2_to_end_begin_num=change_two[yml0].end_to_change2[yml2].qidian_stage_num[yml4];/////将中转2这个站台在整个中转2到终点的公交线路中的站牌号进入final_out结构体数组
													final_out[final_out_flag].zhongzhuan2_to_end_end_num=change_two[yml0].end_to_change2[yml2].zhongdian_stage_num[yml4];//////将终点在整个中转2到终点的公交线路中的站牌号进入final_out结构体数组
//													final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_id=return_bus_id(final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2);/////返回中转1到中转2的公交路线ID值

													strcpy(final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2,change_two[yml0].change_line2);/////得到了中转1到中转2的公交路线的名字
													final_out[final_out_flag].my_id=final_out_flag;/////将ID值得到
													final_out[final_out_flag].begin_to_zhongzhuan1_stage_flag=change_two[yml0].begin_to_change1[yml1].distance[yml3];////起点到中转1所要经过的距离知道了
//													final_out[final_out_flag].zhongzhuan2_to_end_id=return_bus_id(final_out[final_out_flag].zhongzhuan2_to_end);///返回中转2到终点的公交线路的ID值

													final_out[final_out_flag].zhongzhuan2_to_end_stage_flag=change_two[yml0].end_to_change2[yml2].distance[yml4];////记录从中转2到终点所要经过的站台数量
													////**下面的这段函数的作用是得到中转1到中转2的所经过的距离以及之间的公交站点的名字存放到final_out数组中**////
													use_for_tmp0=return_stage_id(change_two[yml0].begin_to_change1[yml1].change_round);/////得到了中转1的id号
													use_for_tmp1=return_stage_id(change_two[yml0].end_to_change2[yml2].change_round);/////得到了中转2的ID号
													////***首先得到的是中转1 对应于这个中间路线上所处的位置***////
													for(int yml5=0;yml5<=stage[use_for_tmp0].line_in;yml5++)
													{
														int tmp_yml5;
														tmp_yml5=strcmp(stage[use_for_tmp0].biaoji[yml5].way,change_two[yml0].change_line2);
														if(tmp_yml5==0)/////通过比较得到了此站点在这一条中间路线上,由此得到他在中间路线上的位置
														{
															use_for_tmp2=stage[use_for_tmp0].biaoji[yml5].num;
														}
													}
													///**得到中转2对应于这一条中间路线上的位置**///
													for(int yml6=0;yml6<=stage[use_for_tmp1].line_in;yml6++)
													{
														int tmp_yml6;
														tmp_yml6=strcmp(stage[use_for_tmp1].biaoji[yml6].way,change_two[yml0].change_line2);
														if(tmp_yml6==0)
														{								
														use_for_tmp3=stage[use_for_tmp1].biaoji[yml6].num;
														
														}													
													}
													final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_begin_num=use_for_tmp2;/////得到了中转1在本条中转1到中转2的公交路线中的站牌号
													final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_end_num=use_for_tmp3;/////得到了中转2在本条中转1到中转2的公交线路中的站牌号
													final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_stage_flag=abs(use_for_tmp2-use_for_tmp3);/////得到了两个中转站之间需要经过的站台的数量
													final_out[final_out_flag].begin_to_end_distance=final_out[final_out_flag].begin_to_zhongzhuan1_stage_flag+final_out[final_out_flag].zhongzhuan1_to_zhongzhuan2_stage_flag+final_out[final_out_flag].zhongzhuan2_to_end_stage_flag;/////总共经过的距离为起点到中转1+中转1到中转2+中转2到终点
													final_out_flag++;///////可选的起点到终点的方案变多了




												}
											
											
											
											}
											
											
											
											
											
										}
									}							
									
								}
								
								///**下面将得到的起点到终点的站台的总数目按从小到大的顺序排列,从而得到最终结果**//
								for(int sdl0=0;sdl0<final_out_flag;sdl0++)
								{
									for(int sdl1=0;sdl1<final_out_flag;sdl1++)
									{
									two_to_out tmp_use;
									if(final_out[sdl0].begin_to_end_distance<final_out[sdl1].begin_to_end_distance)/////如果要比较的第一个值大于后来的值,则后移
									{
										tmp_use=final_out[sdl0];
										final_out[sdl0]=final_out[sdl1];
										final_out[sdl1]=tmp_use;///////交换
									
									}									
									}									
									
								}								
								cout<<"从起点到终点的所有可选方案有"<<final_out_flag<<"种"<<endl;				
								for(int peijian0=0;peijian0<101;peijian0++)///////由于DOS界面输出会翻页,下一步要做的是将其输出到当前目录的txt下,解决这个问题
								{	cout<<"第"<<peijian0+1<<"种路径为:"<<endl;
									cout<<"坐->"<<final_out[peijian0].begin_to_zhongzhuan1<<"到->"<<final_out[peijian0].zhongzhuan1_stage<<"下车,坐->"<<final_out[peijian0].zhongzhuan1_to_zhongzhuan2<<"到->"<<final_out[peijian0].zhongzhuan2_stage<<"下车,再乘坐->"<<final_out[peijian0].zhongzhuan2_to_end<<"到终点站,累计"<<final_out[peijian0].begin_to_end_distance<<"站"<<endl;									
								}
								cout<<endl;
								cout<<endl;
								int my_will;
								cout<<"提示: 输入要选择的方案编号可以查看具体经过哪些站点,暂时只支持查询前100种方案,输入0退出"<<endl;
								cin>>my_will;
								if(my_will==0)goto labnext;////输入0退出查询
								if(my_will<101)
								{
								cout<<"从起点"<<input1<<"出发乘坐"<<final_out[my_will-1].begin_to_zhongzhuan1<<"路,经过"<<final_out[my_will-1].begin_to_zhongzhuan1_stage_flag<<"站,到达中转1"<<final_out[my_will-1].zhongzhuan1_stage<<"如下所示:"<<endl;
								output_stage_with_line(final_out[my_will-1].begin_to_zhongzhuan1_begin_num,final_out[my_will-1].begin_to_zhongzhuan1_end_num,return_bus_id(final_out[my_will-1].begin_to_zhongzhuan1));////输出从起点到中转1所要经过的公交站台的名字
								cout<<endl;
								cout<<"从第一次中转到第二次中转所要坐的公交车为-> "<<final_out[my_will-1].zhongzhuan1_to_zhongzhuan2<<"从"<<final_out[my_will-1].zhongzhuan1_stage<<"出发,经过"<<final_out[my_will-1].zhongzhuan1_to_zhongzhuan2_stage_flag<<"站,到达中转2"<<final_out[my_will-1].zhongzhuan2_stage<<"如下所示:"<<endl;
								output_stage_with_line(final_out[my_will-1].zhongzhuan1_to_zhongzhuan2_begin_num,final_out[my_will-1].zhongzhuan1_to_zhongzhuan2_end_num,return_bus_id(final_out[my_will-1].zhongzhuan1_to_zhongzhuan2));////输出从起点到中转1所要经过的公交站台的名字
								cout<<endl;
								cout<<"从第二次中转到终点所要坐的公交车为-> "<<final_out[my_will-1].zhongzhuan2_to_end<<"从"<<final_out[my_will-1].zhongzhuan2_stage<<"出发,经过"<<final_out[my_will-1].zhongzhuan2_to_end_stage_flag<<"站到达终点站"<<input2<<"如下所示:"<<endl;
								output_stage_with_line(final_out[my_will-1].zhongzhuan2_to_end_begin_num,final_out[my_will-1].zhongzhuan2_to_end_end_num,return_bus_id(final_out[my_will-1].zhongzhuan2_to_end));////输出从起点到中转1所要经过的公交站台的名字
								cout<<endl;////输出结束
								}
								else
								{
								
								cout<<"输入的方案查询有错误"<<endl;
								
								}

					}
					
					
			}
			
			
			
labnext:	cout<<"  想继续吗(Y/N)?"<<endl;
			cin>>mind;
			if(mind=='Y'||mind=='y')
			{
				zhongzhuan_counter=0;
				line_num_enable=1;
				line_num_flag=0;
				cross_stage=0;
				enable_add=1;
				same_counter2=0;
				same_counter1=0;
				same_counter0=0;
				same1_2counter=0;
				same1_1counter=0;
				correct2=0;
				correct1=0;
				correct0=0;
				end_stage=-1;
				begin_stage=-1;
				out_enter=0;//////用于经过的站点输出时的回车输出
				xiao1=0;////临时的值
				xiao0_counter=0;
				////**  以下的变量初始化是为了换乘两次车所准备的   **////
				change_two_flag=0;
				enable_add2=1;
				cross_stage2=0;
				line_num_flag2=0;
				line_num_enable2=1;
				zhongzhuan_counter2=0;

				final_out_flag=0;
				continue;
			}
			else
				break;
			
			
			}
			
			/////////////程序完成////////////////			
}

⌨️ 快捷键说明

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