北邮数据结构与算法课程设计大作业

一、实验题目

当一个用户从甲地到乙地时,由于不同需求,就有不同的交通路线,有人希望以最短时间到达,有人希望用最少的换乘次数等。请编写一北京地铁线路查询系统,通过输入起始站、终点站,为用户提供两种决策的交通咨询。

设计要求:

1.提供对地铁线路进行编辑的功能,要求可以添加或删除线路。

2.提供两种决策:最短时间,最少换乘次数。

3.中途换乘站换乘耗时为5分钟,地铁在除始发站外每一站停留1分钟。

4.按照始发站时间、地铁时速及停留时间推算之后各个线路的地铁到站时间。

5.该系统以人机对话方式进行。系统自动获取当前时间,用户输入起始站,终点站以及需求原则(需求原则包括最短距离,最短时间,最少换乘次数),系统输出乘车方案:乘几号线,距离,时间,费用,换乘方法等相关信息。

二、代码实现

#include<iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#define MAX 9999//根据权重调整
#define N 20//最长名称
#define NUM 999//最大站数
using namespace std;
struct station//站点信息
{
	char station[N];//站点名称
	bool change;//换乘状态,1为是,0为否
	int tag;//站点所属线路个数
	char Line[6][N];//站点所属线路名称
};
struct adjacence//两站间信息
{
	int weight;//两站间乘坐时间,包括地铁停留时间,单位为米/分
	char line[N];//两站共同所属线路名称
	int distance;//两站间距离,单位为米
	int inaline;//两站是否属于一条线路,是为1,否为MAX
};
struct timetable
{
	char lines[N];//线路名称
	char firststa[N];//起点站
	char nextsta[N];//起点站的下一站
	bool isweekend;//工作日为0,周末为1
	bool exacttime[24][60];//具体发车时间
};
class subway
{
private:
	int nowsum;//实际地铁站数
	int nowsub;//实际地铁线路数
	int nowtimesum;//实际时间表数,每条线路有四份时间表
	char subname[NUM][N];//地铁线路名称
	int path[NUM];//途径站点路径
	bool s[NUM];//记录站点是否已被添加,即起始站到该站点的最短路径是否已被找到
	int disk[NUM];//记录起始站到某站点的乘坐时间,不包括换乘时间
	int stack[NUM];//存储起始站到终点站路径的栈
	int stackft[NUM];//为了subtime函数创建的stack的副本,subway中所有名为xx+ft的,都是xx for time的意思,为副本
	int top = -1;//栈顶标记
	int topft = -1;//副本
	station sta[NUM];//地铁站点数组
	adjacence adj[NUM][NUM];//地铁图
	timetable tt[NUM];//时间表数组
public:
	subway()//构造函数,private成员初始化
	{
		nowsum = 0;
		nowsub = 0;
		nowtimesum = 0;
		for (int i = 0; i < NUM; i++)
		{
			sta[i].tag = 0;//地铁站点数组初始化
			sta[i].change = 0;
			sta[i].station[0] = { '\0' };
			sta[i].Line[0][0] = sta[i].Line[1][0] = sta[i].Line[2][0] = { '\0' };
			sta[i].Line[3][0] = sta[i].Line[4][0] = sta[i].Line[5][0] = { '\0' };
			subname[i][0] = { '\0' };
			for (int j = 0; j < NUM; j++)
			{//地铁图地铁图
				adj[i][j].weight = MAX;
				adj[i][j].line[0] = { '\0' };
				adj[i][j].distance = MAX;
				adj[i][j].inaline = MAX;
			}
			tt[i].isweekend = 0;//时间表数组
			tt[i].lines[0] = tt[i].firststa[0] = tt[i].nextsta[0] = { '\0' };
			for (int j = 0; j < 24; j++)
			{
				for (int k = 0; k < 60; k++)
					tt[i].exacttime[j][k] = 0;
			}
		}
	}
	void push(int n)//入栈
	{
		if (top < NUM - 1)
		{
			top++;
			stack[top] = n;
		}
		else
			return;
	}
	void pushft(int n)//入栈,副本
	{
		if (topft < NUM - 1)
		{
			topft++;
			stackft[topft] = n;
		}
		else
			return;
	}
	bool empty()//判断栈是否为空
	{
		if (top < 0)
			return 1;
		else
			return 0;
	}
	bool emptyft()//判断栈是否为空,副本
	{
		if (topft < 0)
			return 1;
		else
			return 0;
	}
	int pop()//出栈
	{
		if (empty())
			return -1;
		else
			return stack[top--];
	}
	int popft()//出栈,副本
	{
		if (emptyft())
			return -1;
		else
			return stackft[topft--];
	}
	int search(char * s)//查找s在地铁站点数组中的下标
	{
		for (int i = 0; i < nowsum; i++)
		{
			if (!strcmp(sta[i].station, s))
				return i;
		}
		return -1;//若数组中不存在该站点
	}
	void create(int n)//创建地铁图
	{
		while (n)//读取线路的大循环
		{
			char linename[N];//每条线路的名称
			int sum;//每条线路的站数
			int speed;//每条线路的平均速度
			cin >> linename >> sum;
			strcpy(subname[nowsub++], linename);
			cout << linename << "线 共" << sum << "个站" << endl;
			cin >> speed;
			int last = -1;//上一站,表示现在的站是否为线路起点站
			while (sum)//读取站点的小循环
			{
				char name[N];//站点名称
				bool ischange;//站点换乘状态
				int Distance;//两站间距离
				cin >> name >> ischange >> Distance;
				if (ischange == 1)//是换乘站
					cout << name << "(换乘站)->";
				else//非换乘站
					cout << name << "->";
				if (search(name) == -1)//若该站点是第一次出现
				{
					strcpy(sta[nowsum].station, name);
					sta[nowsum].change = ischange;
					strcpy(sta[nowsum].Line[sta[nowsum].tag++], linename);
					if (last != -1)//非线路起始站
					{
						strcpy(adj[last][nowsum].line, linename);
						strcpy(adj[nowsum][last].line, linename);
						adj[last][nowsum].distance = adj[nowsum][last].distance = Distance;
						adj[last][nowsum].weight = adj[nowsum][last].weight = round(Distance / speed) + 1;
					}//+1是地铁在每一站停留的时间
					last = nowsum;//更新上一站
					nowsum++;//更新站点总数
				}
				else//若该站点已存在
				{
					strcpy(sta[search(name)].Line[sta[search(name)].tag++], linename);
					if (last != -1)//非线路起始站
					{
						strcpy(adj[last][search(name)].line, linename);
						strcpy(adj[search(name)][last].line, linename);
						adj[last][search(name)].distance = adj[search(name)][last].distance = Distance;
						adj[last][search(name)].weight = adj[search(name)][last].weight = round(Distance / speed) + 1;
					}//+1是地铁在每一站停留的时间
					last = search(name);//更新上一站
				}
				sum--;
			}
			char back = 8;//回退两格,删除多余的一个"->"
			cout << back << back << "  " << endl << endl;
			n--;
		}
	}
	void creattimetable()//创建时间表
	{
		freopen("首站发车时间.txt", "r", stdin);//打开文件读取内容
		int n;//时间表总数
		cin >> n;
		while (n)//读取线路时间表的大循环
		{
			int is = 0;
			char name1[N], name2[N], name3[N];
			cin >> name1 >> name2 >> name3 >> is;
			strcpy(tt[nowtimesum].lines, name1);//线路名称
			strcpy(tt[nowtimesum].firststa, name2);//起始站
			strcpy(tt[nowtimesum].nextsta, name3);//起始站的下一站
			tt[nowtimesum].isweekend = is;//是否为周末,是为1,否为0
			int m;//线路运行的小时个数
			cin >> m;
			while (m)//读取每个小时发车时间的小循环
			{
				int k;//小时
				cin >> k;
				int a;//分钟
				while (cin >> a)
				{
					tt[nowtimesum].exacttime[k][a] = 1;
					if (cin.get() == '\n')
						break;
				}
				m--;
			}
			n--;
			nowtimesum++;
		}
		cin.clear();更改cin的状态标示符
		freopen("CON", "r", stdin);//将标准输入重定向为 CON 控制台
		freopen("CON", "w", stdout);
	}
	void dijkstra(int start, int end)//寻找最短时间的方案
	{//按路径长度递增的次序产生起点站到其余各站点的最短路径
		for (int i = 0; i < nowsum; i++)
		{//初始化辅助数组
			s[i] = 0;
			disk[i] = adj[start][i].weight;
			path[i] = start;
		}
		s[start] = 1;//起始站已被添加
		disk[start] = 0;//起始站到自身耗费时间为0
		int minweight;
		for (int i = 0; i < nowsum - 1; i++)
		{//找到未被添加的最小权重值即最短时间的站点
			int m = -1, j = 0;
			minweight = MAX;
			for (j = 0; j < nowsum; j++)//更新辅助数组
			{
				if (!s[j] && disk[j] < minweight)
				{
					minweight = disk[j];
					m = j;//选出从起点站能够直接到达某个站点的所有路径中最短的路径
				}
			}
			s[m] = 1;//标记该站点已找到最短路径
			if (m == end)//若已找到到达终点站的最短路径
				return;
			for (int k = 0; k < nowsum; k++)
			{//找出以这条路径作为转发路径到达其他站点的路径
				if (!s[k])
				{
					int Weight = minweight + adj[m][k].weight;
					if (!strcmp(adj[path[m]][m].line, adj[m][k].line))
					{//若无需换乘
						if (Weight < disk[k])
						{//若新路径更短则更新路径
							disk[k] = Weight;
							path[k] = m;//记录该站点的前驱站点
						}
					}
					else
					{//若需要换乘
						if (Weight + 5 < disk[k])
						{//路径长度需额外加5,即中途换乘站的换乘耗时
							disk[k] = Weight + 5;
							path[k] = m;//记录该站点的前驱顶点
						}
					}
				}
			}
		}
	}
	int leastchange(int start, int end)//寻找最少换乘次数的方案
	{
		for (int i = 0; i < nowsum; i++)
		{
			for (int j = 0; j < nowsum; j++)
			{
				for (int k = 0; i != j && k <= sta[nowsum].tag; k++)
				{//通过比较所属线路名称确认两个站点的关系
					if (!strcmp(sta[i].Line[0], sta[j].Line[k]) || !strcmp(sta[i].Line[1], sta[j].Line[k]) || !strcmp(sta[i].Line[2], sta[j].Line[k]))
						adj[i][j].inaline = adj[j][i].inaline = 1;//如果二者在同一条线上,inaline设为1
				}
			}
		}
		int disk1[NUM];
		for (int i = 0; i < nowsum; i++)
		{//初始化辅助数组
			s[i] = 0;
			disk1[i] = adj[start][i].inaline;
			path[i] = start;
		}
		s[start] = 1;//起始站已被添加
		disk1[start] = 0;//起始站到自身耗费时间为0
		int minweight;
		for (int i = 0; i < nowsum - 1; i++)
		{//找到未被添加的最小权重值即最短时间的站点
			int m = -1, j = 0;
			minweight = MAX;
			for (j = 0; j < nowsum; j++)//更新辅助数组
			{
				if (!s[j] && disk1[j] < minweight)
				{
					minweight = disk1[j];
					m = j;//选出从起点站能够直接到达某个站点的所有路径中最短的路径
				}
			}
			s[m] = 1;//标记该站点已找到最短路径
			if (m == end)//若已找到到达终点站的最短路径
				break;
			for (int k = 0; k < nowsum; k++)
			{//找出以这条路径作为转发路径到达其他站点的路径
				int Weight = minweight + adj[m][k].inaline;
				if (!s[k] && Weight < disk1[k])
				{
					disk1[k] = Weight;
					path[k] = m;//记录该站点的前驱站点
				}
			}
		}
		for (int i = 0; i < nowsum; i++)//重新初始化辅助数组
			s[i] = 0;
		s[start] = 1;//起始站已被添加
		int m = disk1[end];
		int k = end, p = path[end];
		while (m - 1)
		{
			for (int j = 0; j < nowsum; j++)
			{
				if (!s[j] && disk1[j] == m - 1 && j != p)
					path[j] = start;
			}
			m--;
			k = p;
			p = path[k];
		}
		m = disk1[end], k = end;
		while (m)
		{
			int t = path[k];//找到终点站的前驱站点
			s[k] = 0;
			p = path[k];
			if (adj[p][k].weight < MAX)
			{//即终点站与其前驱站点相邻
				s[k] = 1;//标记终点站
				k = p;//迭代,将其前驱站点作为新的终点站
				p = path[k];
				m--;
			}
			else
			{//其前驱站点要经过同线路上的其他站点才能到达终点站
				int j = 0;
				char r[N];
				for (int i = 0; i < sta[k].tag; i++)
				{
					if (!strcmp(sta[p].Line[0], sta[k].Line[i]) || !strcmp(sta[p].Line[1], sta[k].Line[i]) || !strcmp(sta[p].Line[2], sta[k].Line[i]))
						strcpy(r, sta[k].Line[i]);
				}
				do
				{//找到同线路上该前驱站点的相邻站点
					bool is = 0;
					s[p] = 1;
					if (!s[j] && adj[p][j].weight < MAX && !strcmp(adj[p][j].line, r))
					{
						s[j] = 1;//标记相邻站点
						path[j] = p;
						is = 1;
					}
					if (j < nowsum)
					{
						if (is == 0)
							j++;//遍历
						else
						{
							if (j == k)
							{//直到到达终点站,终止循环
								k = t;
								j = nowsum;
							}
							else
							{//找到相邻站点后迭代
								p = j;
								j = 0;
							}
						}
					}
					else
					{//遍历完毕都没有找到下一个站点,说明该站点是在线路的反方向
						p = path[p];//回退到上一个站点
						j = 0;
					}
				} while (j < nowsum);
				m--;
			}
		}
		return disk1[end] - 1;//返回换乘次数
	}
	void subtime(tm* present, int start, int end)//计算下一趟地铁到达出发站的时间
	{
		bool date = 0;//是否为周末
		int hour = present->tm_hour;//小时,取值范围为[0,23]
		int minute = present->tm_min;//分钟,取值范围为[0,59]
		if (present->tm_wday == 0 || present->tm_wday == 6)//星期几,取值范围为[0,6]
			date = 1;
		else
			date = 0;
		int k = start, p = popft();//出发站和出发站的下一站
		int spend = 0;//地铁从首站到用户规定的出发站所要耗费的时间
		int First = -1;//时间表数组下标
		for (int i = 0; i < nowsum; i++)
			s[i] = 0;//初始化辅助数组
		for (int i = 0; i < nowtimesum; i++)
		{//寻找时间表的大循环
			if (!strcmp(adj[k][p].line, tt[i].lines) && tt[i].isweekend == date)
			{//寻找起始线路对应时间(工作日或周末)的时间表
				First = i;//记录时间表位置
				s[search(tt[i].firststa)] = 1;//标记首站
				int j = search(tt[i].nextsta);//首站的下一站,表示方向
				spend += adj[search(tt[i].firststa)][j].weight;
				for (int r = 0; r < nowsum; r++)
				{//累加时间的小循环
					if (!s[r] && adj[j][r].weight < MAX && !strcmp(adj[j][r].line, tt[i].lines))
					{//寻找该线路上的下一站
						s[r] = 1;//标记
						spend += adj[j][r].weight;
						if (r == k)
						{//到达出发站,终止小循环和大循环
							i = nowtimesum;
							break;
						}
						if (r == p)
						{//先到达出发站的下一站,说明方向相反,终止小循环
							spend = 0;
							break;
						}
						j = r;
						r = 0;//迭代
					}
				}
			}
		}
		while (topft >= 0)
			popft();//清空栈
		if (First == -1)
		{//没有该线路对应的时间表
			cout << "(线路暂无起点站发车时间表,若需要知道下一趟地铁到达时间,请询问相关工作人员)" << endl;
			return;
		}
		int j;
		for (j = 0; j < 60; j++)
		{
			if (tt[First].exacttime[hour - 1][j] && j + spend >= minute + 60)
			{//上个小时出发的地铁发车时间(分)加上从首站到出发站的时间需大于等于现在的时间(分)+60
				cout << "下一趟地铁预计将在" << hour << "时" << j + spend - 60 << "分到达出发站,请做好准备" << endl;
				break;//例:11:55出发的车运行10分钟能让12:03到达站台的用户乘坐,55+10>03+60
			}
		}
		if (j == 60)
		{
			for (j = 0; j < 60; j++)
			{
				if (tt[First].exacttime[hour][j] && j + spend >= minute)
				{//这个小时出发的地铁发车时间(分)加上从首站到出发站的时间需大于等于现在的时间(分)
					cout << "下一趟地铁预计将在" << hour << "时" << j + spend << "分到达出发站,请做好准备" << endl;
					break;//例:12:00出发的车运行10分钟能让12:08到达站台的用户乘坐,00+10>08
				}
			}
		}
		if (j == 60)
		{
			for (j = 0; j < 60; j++)
			{
				if (tt[First].exacttime[hour + 1][j] && j + spend >= minute - 60)
				{//下个小时出发的地铁发车时间(分)加上从首站到出发站的时间需大于等于现在的时间(分)-60
					cout << "下一趟地铁预计将在" << hour + 1 << "时" << j + spend << "分到达出发站,请做好准备" << endl;
					break;//例:13:00出发的车运行5分钟能让12:59到达站台的用户乘坐,00+5>59-60
				}
			}
		}
		if (j == 60)//说明现在不是这趟地铁的运行时间
			cout << "(当前非该趟列车运行时间,请更换出行方式)";
	}
	void print(int start, int end, int k, int p)//打印结果
	{
		int last = start;//保存上一站
		int n = 1;//记录已乘坐的站数
		int next = pop();//栈顶元素,表示下一站
		char LINE[N];//线路名称
		int totaltime = 0;//总时间
		int totaldistance = 0;//总距离
		totaltime += adj[last][next].weight;
		totaldistance += adj[last][next].distance;
		strcpy(LINE, adj[last][next].line);
		if (p == 1)
			cout << "最短时间的方案:";
		else
			cout << "最少换乘次数的方案:";
		cout << "(乘坐" << LINE << "线)" << sta[start].station << "->";//打印起始线路和起点站
		last = next;//更新上一站
		while (!empty())//迭代直到栈空
		{
			next = pop();
			if (strcmp(LINE, adj[last][next].line) != 0)//需要换乘
			{//将每一次last和next对应站点的权重即时间相加,并额外加上每次换乘消耗的5分钟,得到总时间
				totaltime += adj[last][next].weight + k * 5;
				totaldistance += adj[last][next].distance;//将每一次last和next对应站点的距离相加得到总距离
				strcpy(LINE, adj[last][next].line);//打印乘坐站数和此换乘
				cout << "(换乘" << LINE << "线)" << sta[last].station << "->";
			}
			else
			{
				totaltime += adj[last][next].weight;
				totaldistance += adj[last][next].distance;
				cout << sta[last].station << "->";
			}
			last = next;//更新上一站
		}
		cout << sta[end].station << endl;
		int price = 0;//由总距离得到总价格
		if (totaldistance <= 6000)
			price = 3;
		else
		{
			if (totaldistance <= 12000)
				price = 4;
			else
			{
				if (totaldistance <= 22000)
					price = 5;
				else
					if (totaldistance <= 32000)
						price = 6;
					else
						price = ceil((totaldistance - 32000) / 20000) + 6;
			}
		}
		cout << "总距离为" << totaldistance << "米,总时间为" << totaltime << "分钟,费用为" << price << "元" << endl;
		time_t nowtime;
		time(&nowtime);//获取1970年1月1日0点0分0秒到现在经过的秒数
		tm* present = localtime(&nowtime);//转换为本地时间
		subtime(present, start, end);//计算到站时间
	}
	void program(int n)//查询线路
	{
		int start, end;
		char startname[N], endname[N];
		cout << "请输入起始站名和终点站名,两站之间用回车分开" << endl;//输入起始站和终点站
		cin >> startname;
		cin >> endname;
		cout << endl;
		start = search(startname);//查找起点站在地铁站点数组中的下标
		end = search(endname);//查找终点站在地铁站点数组中的下标
		int k = 0;
		if (n == 1)
			dijkstra(start, end);//查询换乘
		else
			k = leastchange(start, end);//查询换乘
		topft = top;
		for (int i = end; i != start; i = path[i])
			push(i);//路径追溯
		for (int i = end; i != start; i = path[i])
			pushft(i);//路径追溯
		print(start, end, k, n);//打印结果
	}
	void add()//添加线路
	{
		char linename[N];//每条线路的名称
		int sum;//每条线路的站数
		int speed;//每条线路的平均速度
		cin >> linename >> sum;
		strcpy(subname[nowsub++], linename);
		cin >> speed;
		int last = -1;//上一站,表示现在的站是否为线路起点站
		int resum = sum;
		int position[NUM] = { 0 };//记录站点位置
		while (sum)//循环读取站点
		{
			char name[N];//站点名称
			bool ischange;//站点换乘状态
			int Distance;//两站间距离
			cin >> name >> ischange >> Distance;
			if (search(name) == -1)//若该站点是第一次出现
			{
				strcpy(sta[nowsum].station, name);
				sta[nowsum].change = ischange;
				strcpy(sta[nowsum].Line[sta[nowsum].tag++], linename);
				if (last != -1)//非线路起始站
				{
					strcpy(adj[last][nowsum].line, linename);
					strcpy(adj[nowsum][last].line, linename);
					adj[last][nowsum].distance = adj[nowsum][last].distance = Distance;
					adj[last][nowsum].weight = adj[nowsum][last].weight = round(Distance / speed) + 1;
				}//+1是地铁在每一站停留的时间
				last = nowsum;//更新上一站
				position[sum] = last;
				nowsum++;//更新站点总数
			}
			else//若该站点已存在
			{
				sta[search(name)].change = ischange;
				strcpy(sta[search(name)].Line[sta[search(name)].tag++], linename);
				if (last != -1)//非线路起始站
				{
					strcpy(adj[last][search(name)].line, linename);
					strcpy(adj[search(name)][last].line, linename);
					adj[last][search(name)].distance = adj[search(name)][last].distance = Distance;
					adj[last][search(name)].weight = adj[search(name)][last].weight = round(Distance / speed) + 1;
				}//+1是地铁在每一站停留的时间
				last = search(name);//更新上一站
				position[sum] = last;
			}
			sum--;
		}
		cout << endl;
		cout << linename << "线 共" << resum << "个站" << endl;
		for (int i = resum; i > 0; i--)
		{
			if (sta[position[i]].change == 1)//是换乘站
				cout << sta[position[i]].station << "(换乘站)->";
			else//非换乘站
				cout << sta[position[i]].station << "->";
		}
		char back = 8;//回退两格,删除多余的一个"->"
		cout << back << back << "  " << endl;
	}
	void omit()//删除线路
	{
		char ch[N];//线路名称
		cin >> ch;
		for (int i = 0; i < nowsub; i++)
		{//在线路数组中删除线路
			if (!strcmp(subname[i], ch))
			{//寻找该线路位置
				while (i < nowsub)
				{//其后的线路依次复制到前一个位置,覆盖掉该线路
					strcpy(subname[i], subname[i + 1]);
					i++;
				}
				strcpy(subname[i], "");//删除最后一个站点(已被复制到前一个位置)
				nowsub--;//地铁线路数减一
				break;
			}
		}
		for (int i = 0; i < nowsum; i++)
		{//在站点数组和地铁图中删除站点
			for (int j = 0; j < sta[i].tag; j++)
			{
				if (!strcmp(sta[i].Line[j], ch))
				{//在站点数组中找到该线路上的站点
					if (sta[i].tag == 1)
					{//如果站点只属于该线路
						sta[i].tag--;//删除线路信息
						strcpy(sta[i].Line[0], "");
						for (int k = 0; k < nowsum; k++)
						{//更新地铁图
							strcpy(adj[i][k].line, "");
							adj[i][k].weight = adj[k][i].weight = adj[i][k].distance = adj[k][i].distance = MAX;
						}
					}
					else
					{//如果站点也属于其他线路
						sta[i].tag--;
						if (j == 5)//存储在最后一个位置
							strcpy(sta[i].Line[5], "");
						else
						{//其后的线路依次复制到前一个位置,覆盖掉该线路
							for (int k = 5; k > j; k--)
								strcpy(sta[i].Line[k - 1], sta[i].Line[k]);
							j--;//往后寻找是否还有该线路
						}
					}
				}
			}
		}
		for (int i = 0; i < nowsum; i++)
		{//遍历地铁图
			for (int j = 0; j < nowsum; j++)
			{
				if (!strcmp(adj[i][j].line, ch))
				{//删除线路信息并最大化权重和距离
					strcpy(adj[i][j].line, "");
					adj[i][j].weight = adj[i][j].distance = MAX;
				}
			}
		}
	}
	void alter(int n)//编辑线路
	{
		if (n == 1)
		{
			cout << "请按如下格式输入:" << '\n' << "线路名称 站点个数" << '\n' << "地铁运行平均速度(单位为米/分)" << endl;
			cout << "站点名称 是否为换乘站(是输1,否输0) 上一站到该站的距离(单位为米,最先输入的站点为0)" << endl;
			cout << "(每一行输入一个站点,不得超过" << NUM - nowsum << "个站点,不支持原本在一条线路上的相邻两站在新线路上也相邻的情况)" << endl << endl;
			cout << "示例如下:" << '\n' << "3号 3" << '\n' << "667" << '\n' << "第1个站 0 0" << '\n' << "第2个站 1 1000" << '\n' << "第3个站 0 1000" << endl << endl;
			add();//添加线路
		}
		else
		{
			cout << "请选择要删除的线路(完整输入)" << endl;
			for (int i = 0; i < nowsub; i++)
				cout << subname[i] << ' ';
			cout << endl;
			omit();//删除线路
		}
	}
};
int main()
{
	freopen("地铁线路数据.txt", "r", stdin);//打开文件读取内容
	int SUM;//地铁线路总数
	cin >> SUM;
	subway sub;
	sub.create(SUM);//创建地铁图
	cin.clear();//更改cin的状态标示符
	freopen("CON", "r", stdin);//将标准输入重定向为 CON 控制台
	freopen("CON", "w", stdout);
	sub.creattimetable();//创建时间表
	cout << "此为北京地铁线路查询系统:" << endl;//交互界面
	cout << "1.查询线路" << endl;
	cout << "2.编辑线路" << endl;
	cout << "3.退出系统" << endl;
	cout << "请输入数字:" << endl;
	int n;
	cin >> n;
	if (n == 3)
		return 0;
	do//用户不输入3就一直循环
	{
		if (n == 1)
		{
			cout << "请选择需求原则:" << endl;
			cout << "1.最短时间" << endl;
			cout << "2.最少换乘次数" << endl;
			cout << "3.退出系统" << endl;
			cout << "请输入数字:" << endl;
			int n1;
			cin >> n1;
			if (n1 == 3)
				return 0;
			sub.program(n1);//查询线路
		}
		else
		{
			cout << "请选择操作内容:" << endl;
			cout << "1.添加线路" << endl;
			cout << "2.删除线路" << endl;
			cout << "3.退出系统" << endl;
			cout << "请输入数字:" << endl;
			int n2;
			cin >> n2;
			if (n2 == 3)
				return 0;
			sub.alter(n2);//编辑线路
		}
		cout << endl;
		cout << "1.查询线路" << endl;
		cout << "2.编辑线路" << endl;
		cout << "3.退出系统" << endl;
		cout << "请输入数字:" << endl;
		cin >> n;
	} while (n != 3);
	return 0;
}

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值