数据结构与算法——课程设计报告(全国交通咨询模拟)

C++ 全国交通咨询模拟

源文件点击此处下载⏬

1 要求

【问题描述】
全国交通咨询模拟**
处于对不同目的的旅客对交通工具有不同的要求。例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次数最少。编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。

2 需求分析

2.1 产品需求概述

2.1.1 功能简介
【基本要求】
(1)提供对城市信息进行编辑(如:添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
【总体设计】
本程序运用了图这种数据结构,并以邻接表作交通图的存储结构。
数据对象V:V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:R={VR}
VR={<v,w>|v,w∈V且P(v,w),<v,w>表示从v到w的弧。
谓词P(v,w)定义了弧<v,w>的意义或信息}

基本操作:
AdjInitiate(&G)初始化邻接表
AdjDestroy(&G)撤销邻接表
InsertVertex(&G,i,&a)插入结点
DeleteVertex(&G,i)删除结点
InsertEdge()插入边
DeleteEdge()删除边
GetFirstVex()取第一个邻接结点
GetNextVex()取下一个邻接结点
CreatGraph()创建图
邻接表的存储结构
typedef struct Node
{ int dest;
struct Node *next;
int t_time;
float t_price;
int t_start[5];
int t_get[5];
int f_time;
float f_price;
int f_start[5];
int f_get[5];
}Edge;
typedef struct
{ DataType data[20];
int score;
Edge *adj;
}AdjLHeight;
typedef struct
{ AdjLHeight a[Max];
int numOfVerts;
int numOfEdges;
}AdjLGraph;
栈的存储结构
typedef struct snode
{ int data;
struct snode *next;
}LSNode;

其他基本操作:
void Administer(AdjLGraph *G);
void UserDemand(AdjLGraph *G);
void CreatTraffic(AdjLGraph *G);
void EditCity(AdjLGraph *G);
void AddCity(AdjLGraph *G);
void DeleteCity(AdjLGraph *G);
void EditTraffic(AdjLGraph *G);
int AddTraffic(AdjLGraph *G,int a[]);
int DeleteTraffic(AdjLGraph *G,int a[]);
void LeastMoney(AdjLGraph *G,int v1,int v2,int Traffic[])
void LeastTime(AdjLGraph *G,int v1,int v2,int Traffic[])

2.1.2 运行环境
1.硬件环境:
Win7/10
2.软件环境:
Vs2017/Dev-C++

2.2 功能需求

2.2.1实现提示
(1)对全国城市交通图和班车时刻表及飞机航班表的编辑,应该提供文件形式输入和键盘输入两种方式。飞机航班表的信息应包括:起始站的出发时间、终点站的到达时间和票价;列车时刻表则需根据交通图给出各个路段的详细信息,例如:对于从北京到上海的火车,需给出北京至天津、天津至徐州及徐州至各段的出发时间、到达时间和票价信息。
(2)以邻接表作交通图的存储结构,表示边的结点内除含有邻接点的信息外,包括交通工具、路程中消耗的时间和花费以及出发和到达的时间等多项属性。

3 系统主要函数说明

系统主要函数表

int main()主函数
void Administer(AdjLGraph *G)管理员操作界面函数
void UserDemand(AdjLGraph *G)用户操作界面函数
void EditCity(AdjLGraph *G)编辑城市函数
void CreatTraffic(AdjLGraph *G)创建交通函数
void AddCity(AdjLGraph *G)添加城市函数
void DeleteCity(AdjLGraph *G)删除城市函数
void EditTraffic(AdjLGraph *G)编辑交通函数
int AddTraffic(AdjLGraph *G, int a[])添加交通函数
int DeleteTraffic(AdjLGraph *G, int a[])删除交通函数

4 源代码

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
typedef char DataType;
#define Max 30
#define MaxEdges 60
#define MaxWeight 10000
int Traffic[5 * MaxEdges];
int tag = 0;
#include"Adj.h"
#include"LStack.h"
#include"Dijkstra.h"
void Administer(AdjLGraph *G);
void UserDemand(AdjLGraph *G);
void CreatTraffic(AdjLGraph *G);
void EditCity(AdjLGraph *G);
void AddCity(AdjLGraph *G);
void DeleteCity(AdjLGraph *G);
void EditTraffic(AdjLGraph *G);
int AddTraffic(AdjLGraph *G, int a[]);
int DeleteTraffic(AdjLGraph *G, int a[]);
int main()
{
	AdjLGraph G;
	AdjInitiate(&G);
	int i;
	do
	{
		system("cls");
		printf("\n\n\n                               全国交通资讯模拟\n\n");
		printf("\n                               请选择程序功能:\n\n");
		printf("                     ╭──────────────────╮\n\n");
		printf("                    │              1=管理系统              │\n\n");
		printf("                    │              2=用户咨询              │\n\n");
		printf("                    │              3=退出                  │\n\n");
		printf("                    ╰───────────────────╯\n\n");
		printf("                                   选择?");
		scanf("%d", &i);
		getchar();
		switch (i)
		{
		case 1:Administer(&G);
			break;
		case 2:UserDemand(&G);
			break;
		case 3:break;
		}
	} while (i != 3);
	system("pause");
	return 0;
}
void Administer(AdjLGraph *G)
{
	int i;
	do
	{
		system("cls");
		printf("\n\n\n                               全国交通资讯模拟\n\n");
		printf("\n                               请选择程序功能:\n\n");
		printf("                     ╭──────────────────╮\n\n");
		printf("                    │            1=初始化交通系统          │\n\n");
		printf("                    │            2=编辑城市                │\n\n");
		printf("                    │            3=编辑交通                │\n\n");
		printf("                    │            4=返回                    │\n\n");
		printf("                    ╰───────────────────╯\n\n");
		printf("                                   选择?");
		scanf("%d", &i);
		getchar();
		switch (i)
		{
		case 1:CreatTraffic(G);
			break;
		case 2:EditCity(G);
			break;
		case 3:EditTraffic(G);
			break;
		case 4:break;
		}
	} while (i != 4);
}
void UserDemand(AdjLGraph *G)
{
	int i = 0, e = 0, j, v1, v2;
	FILE *fp, *fr;
	if ((fp = fopen("C:\\suanfa\\city.txt", "rb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	while (!feof(fp))//feof()这个函数是用来判断指针是否已经到达文件尾部的

	{
		fscanf(fp, "%10s", G->a[i].data);//输入时,%10s表示最多接受10个字符,多余的忽略;
		//输出时, % 10s表示字符串长度不足10个时,左边补空格,保证占10个字节位置,10个及以上原样输出。字符串
		i++;
	}
	fclose(fp); 
	G->numOfVerts = i;
	if ((fr = fopen("C:\\suanfa\\traffic.txt", "rb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	while (!feof(fr))
	{
		fscanf(fr, "%5d", &Traffic[e]);//整形字节
		if (Traffic[e] == -1)e--;
		e++;
	}
	fclose(fr);
	G->numOfEdges = e / 5;
	if (tag == 0)

	{
		for (j = 0;j < G->numOfEdges;j++)
		{
			Edge *p;
			p = (Edge *)malloc(sizeof(Edge));              /*申请邻接边单链表结点空间*/
			p->dest = Traffic[5 * j + 1];                      /*置邻接边弧头序号*/
			p->next = G->a[Traffic[5 * j]].adj;              /*新结点插入单链表的表头*/
			G->a[Traffic[5 * j]].adj = p;                  /*头指针指向新的单链表表头*/
			EditEdge(p, Traffic[5 * j + 2], Traffic[5 * j + 3], Traffic[5 * j + 4]);
		}
	}
	system("cls");
	for (j = 0;j < G->numOfVerts;j++)
	printf("%d=%s\n", j, G->a[j].data);
	printf("\n                             选取起始站:");
	scanf("%d", &v1);
	printf("\n                             选取终点站:");
	scanf("%d", &v2);
	do
	{
		system("cls");
		printf("\n\n\n                               全国交通资讯模拟\n\n");
		printf("\n                               请选择程序功能:\n\n");
		printf("                     ╭──────────────────╮\n\n");
		printf("                    │               1=最省钱到达           │\n\n");
		printf("                    │               2=最快到达             │\n\n");
		printf("                    │               3=返回                 │\n\n");
		printf("                    ╰───────────────────╯\n\n");
		printf("                                   选择?");
		scanf("%d", &i);
		getchar();
		switch (i)
		{
		case 1:LeastMoney(G, v1, v2, Traffic);
			break;
		case 2:LeastTime(G, v1, v2, Traffic);
			break;
		case 3:AdjDestroy(G);AdjInitiate(G);
			break;
		}
	} while (i != 3);
	tag = 0;
}
void CreatTraffic(AdjLGraph *G)
{
	tag = 1;
	int i = 0, e = 0, j, v1, v2;
	DataType city[Max][20];
	char flag = 'Y';
	while (flag == 'y' || flag == 'Y')
	{
		system("cls");
		printf("\n\n\n\n\n\n\n                             输入城市名:");
		gets(city[i]);
		i++;
		printf("\n                             继续输入?(Y/N)(不分大小写)");
		flag = getchar();
		getchar();
	}
	printf("\n                             是否保存城市文本?(Y/N)(不分大小写)");
	flag = getchar();
	getchar();
	if (flag == 'y' || flag == 'Y')
	{
		FILE *fp;
		if ((fp = fopen("C:\\suanfa\\city.txt", "wb")) == NULL)
		{
			printf("无法打开文件!\n");
		}
		for (j = 0;j < i;j++)
			fprintf(fp, "%10s", city[j]);
		fclose(fp);
	}
	do
	{
		system("cls");
		for (j = 0;j < i;j++)
		printf("%d=%s\n", j, city[j]);
		printf("\n                             选择初始站:");
		scanf("%d", &v1);
		printf("\n                             选择到达站:");
		scanf("%d", &v2);
		getchar();
		Traffic[5 * e] = v1;
		Traffic[5 * e + 1] = v2;
		e++;
		printf("\n                             继续编辑?(Y/N)");
		flag = getchar();
		getchar();
	} while (flag == 'Y' || flag == 'y');
	CreatGraph(G, city[0], i, Traffic, e);
	printf("\n                             是否保存交通道路文本?(Y/N)");
	flag = getchar();
	getchar();
	if (flag == 'y' || flag == 'Y')
	{
		FILE *fp;
		if ((fp = fopen("C:\\suanfa\\traffic.txt", "wb")) == NULL)
		{
			printf("无法打开文件!\n");
		}
		for (j = 0;j < 5 * e;j++)
		{
			fprintf(fp, "%5d", Traffic[j]);
		}

		fclose(fp);
	}
}
void EditCity(AdjLGraph *G)
{
	int i = 0, e = 0, j;
	FILE *fp, *fr;
	if ((fp = fopen("C:\\suanfa\\city.txt", "rb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	while (!feof(fp))
	{
		fscanf(fp, "%10s", G->a[i].data);
		i++;
	}
	fclose(fp);
	G->numOfVerts = i;
	if ((fr = fopen("C:\\suanfa\\traffic.txt", "rb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	while (!feof(fr))
	{
		fscanf(fr, "%5d", &Traffic[e]);
		if (Traffic[e] == -1)e--;
		e++;
	}
	fclose(fr);
	G->numOfEdges = e / 5;
	if (tag == 0)
	{
		for (j = 0;j < G->numOfEdges;j++)
		{
			Edge *p;
			p = (Edge *)malloc(sizeof(Edge));              /*申请邻接边单链表结点空间*/
			p->dest = Traffic[5 * j + 1];                      /*置邻接边弧头序号*/
			p->next = G->a[Traffic[5 * j]].adj;              /*新结点插入单链表的表头*/
			G->a[Traffic[5 * j]].adj = p;                    /*头指针指向新的单链表表头*/
			EditEdge(p, Traffic[5 * j + 2], Traffic[5 * j + 3], Traffic[5 * j + 4]);
		}
	}
	system("cls");
	system("cls");
	printf("\n\n\n                               全国交通资讯模拟\n\n");
	printf("\n                               请选择程序功能:\n\n");
	printf("                     ╭──────────────────╮\n\n");
	printf("                    │              1=新增城市              │\n\n");
	printf("                    │              2=删除城市              │\n\n");
	printf("                    │               3=返回                 │\n\n");
	printf("                    ╰───────────────────╯\n\n");
	scanf("%d", &i);
	getchar();
	switch (i)
	{
	case 1:AddCity(G);
		break;
	case 2:DeleteCity(G);
		break;
	case 3:break;
	}
}
void AddCity(AdjLGraph *G)
{
	tag = 1;
	int i = 0, j;
	DataType city[Max][20];
	if (G->numOfVerts < Max)
	{
		FILE *fp;
		if ((fp = fopen("C:\\suanfa\\city.txt", "rb")) == NULL)
		{
			printf("无法打开文件!\n");
		}
		while (!feof(fp))
		{
			fscanf(fp, "%10s", city[i]);
			i++;
		}
		fclose(fp);
		system("cls");
		for (j = 0;j < G->numOfVerts;j++)
		printf("%d=%s\n", j, G->a[j].data);
		printf("\n                             输入城市名:");
		DataType a[20];
		scanf("%s", a);
		strcpy(city[i], a);
		i++;
		FILE *fr;
		if ((fr = fopen("C:\\suanfa\\city.txt", "wb")) == NULL)
		{
			printf("无法打开文件!\n");
		}
		for (j = 0;j < i;j++)
		fprintf(fr, "%10s", city[j]);
		fclose(fr);
		InsertVertex(G, G->numOfVerts, a);
	}
	else printf("城市数量已达最大值");
}
void DeleteCity(AdjLGraph *G)
{
	tag = 1;
	int v1, j, e = 0;
	system("cls");
	for (j = 0;j < G->numOfVerts;j++)
    printf("%d=%s\n", j, G->a[j].data);
	printf("\n                             选取城市序号:");
	scanf("%d", &v1);
	j = 0;
	while (j < G->numOfEdges)
	{
		if (Traffic[5 * j] == v1 || Traffic[5 * j + 1] == v1)
		{
			Traffic[5 * j] = -1;
			Traffic[5 * j + 1] = -1;
			Traffic[5 * j + 2] = -1;
			Traffic[5 * j + 3] = -1;
			Traffic[5 * j + 4] = -1;
		}
		j++;
	}
	j = 0;
	while (j < G->numOfEdges)
	{
		if (Traffic[5 * j] > v1)Traffic[5 * j]--;
		if (Traffic[5 * j + 1] > v1)Traffic[5 * j + 1]--;
		j++;
	}
	FILE *fp;
	if ((fp = fopen("C:\\suanfa\\traffic.txt", "wb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	for (j = 0;j < 5 * G->numOfEdges;j++)
	{
		fprintf(fp, "%5d", Traffic[j]);
	}
	fclose(fp);
	DeleteVertex(G, v1);
	if ((fp = fopen("C:\\suanfa\\traffic.txt", "rb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	while (!feof(fp))
	{
		fscanf(fp, "%5d", &Traffic[e]);
		if (Traffic[e] == -1)e--;
		e++;
	}
	fclose(fp);
	G->numOfEdges = e / 5;
	if ((fp = fopen("C:\\suanfa\\traffic.txt", "wb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	for (j = 0;j < 5 * G->numOfEdges;j++)
	{
		fprintf(fp, "%5d", Traffic[j]);
	}
	fclose(fp);
	if ((fp = fopen("C:\\suanfa\\city.txt", "wb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	for (j = 0;j < G->numOfVerts;j++)
	{
		fprintf(fp, "%10s", G->a[j].data);
	}
	fclose(fp);
}
void EditTraffic(AdjLGraph *G)
{
	int i = 0, e = 0, j;
	FILE *fp, *fr;
	if ((fp = fopen("C:\\suanfa\\city.txt", "rb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	while (!feof(fp))
	{
		fscanf(fp, "%10s", G->a[i].data);
		i++;
	}
	fclose(fp);
	G->numOfVerts = i;
	if ((fr = fopen("C:\\suanfa\\traffic.txt", "rb")) == NULL)
	{
		printf("无法打开文件!\n");
	}
	while (!feof(fr))
	{
		fscanf(fr, "%5d", &Traffic[e]);
		if (Traffic[e] == -1)e--;
		e++;
	}
	fclose(fr);
	G->numOfEdges = e / 5;
	if (tag == 0)
	{
		for (j = 0;j < G->numOfEdges;j++)
		{
			Edge *p;
			p = (Edge *)malloc(sizeof(Edge));              /*申请邻接边单链表结点空间*/
			p->dest = Traffic[5 * j + 1];                      /*置邻接边弧头序号*/
			p->next = G->a[Traffic[5 * j]].adj;              /*新结点插入单链表的表头*/
			G->a[Traffic[5 * j]].adj = p;                    /*头指针指向新的单链表表头*/
			EditEdge(p, Traffic[5 * j + 2], Traffic[5 * j + 3], Traffic[5 * j + 4]);
		}
	}
	system("cls");
	printf("\n\n\n                               全国交通资讯模拟\n\n");
	printf("\n                               请选择程序功能:\n\n");
	printf("                     ╭──────────────────╮\n\n");
	printf("                    │                1=新增道路            │\n\n");
	printf("                    │                2=删除道路            │\n\n");
	printf("                    │                3=返回                │\n\n");
	printf("                    ╰───────────────────╯\n\n");
	printf("                                   选择?");
	scanf("%d", &i);
	switch (i)
	{
	case 1:AddTraffic(G, Traffic);
		break;
	case 2:DeleteTraffic(G, Traffic);
		break;
	case 3:break;
	}
}
int AddTraffic(AdjLGraph *G, int a[])
{
	tag = 1;
	int i, j, v1, v2;
	system("cls");
	for (j = 0;j < G->numOfVerts;j++)
	printf("%d=%s\n", j, G->a[j].data);
	printf("\n                             选取城市序号:");
	scanf("%d", &v1);
	printf("\n                             选取另一个城市序号:");
	scanf("%d", &v2);
	if (v1 < 0 || v1 >= G->numOfVerts || v2 < 0 || v2 >= G->numOfVerts)
	{
		system("cls");
		printf("\n\n\n\n\n\n\n                             城市序号参数越界出错!");
		printf("\n\n\n                               全国交通资讯模拟\n\n");
		printf("\n                               请选择程序功能:\n\n");
		printf("                     ╭──────────────────╮\n\n");
		printf("                    │          1=返回                      │\n\n");
		printf("                    ╰───────────────────╯\n\n");
		printf("                                   选择?");
		scanf("%d", &i);
		getchar();
		do
		{
			switch (i)
			{
			case 1:return 0;
			}
		} while (i != 1);
	}
	else
	{
		j = GetFirstVex(*G, v1);
		if (j == -1)
		{
			Traffic[5 * G->numOfEdges] = v1;
			Traffic[5 * G->numOfEdges + 1] = v2;
			char flag;
			InsertEdge(G, v1, v2);
			printf("\n                             是否保存交通道路文本?(Y/N)");
			flag = getchar();
			getchar();
			if (flag == 'y' || flag == 'Y')
			{
				FILE *fp;
				if ((fp = fopen("C:\\suanfa\\traffic.txt", "wb")) == NULL)
				{
					printf("无法打开文件!\n");
				}
				for (j = 0;j < 5 * G->numOfEdges;j++)
				{
					fprintf(fp, "%5d", Traffic[j]);
				}
				fclose(fp);
			}
			return 1;
		}
		else
		{
			while (j != v2 && j != -1)
			j = GetNextVex(*G, v1, j);
			if (j == v2)
			{
				system("cls");
				printf("\n\n\n\n\n\n\n                   %s--%s已被编辑过", G->a[v1].data, G->a[v2].data);
				printf("\n                             如需改动数据可先删除后再重新编辑");
				printf("\n\n\n                               全国交通资讯模拟\n\n");
				printf("\n                               请选择程序功能:\n\n");
				printf("                     ╭──────────────────╮\n\n");
				printf("                    │          1=返回                      │\n\n");
				printf("                    ╰───────────────────╯\n\n");
				printf("                                   选择?");
				scanf("%d", &i);
				getchar();
				do
				{
					switch (i)
					{
					case 1:return 0;
					}
				} while (i != 1);
			}
			else
			{
				char flag;
				Traffic[5 * G->numOfEdges] = v1;
				Traffic[5 * G->numOfEdges + 1] = v2;
				InsertEdge(G, v1, v2);
				printf("\n                             是否保存交通道路文本?(Y/N)");
				flag = getchar();
				getchar();
				if (flag == 'y' || flag == 'Y')
				{
					FILE *fp;
					if ((fp = fopen("C:\\suanfa\\traffic.txt", "wb")) == NULL)
					{
						printf("无法打开文件!\n");
					}
					for (j = 0;j < 5 * G->numOfEdges;j++)
					{
						fprintf(fp, "%5d", Traffic[j]);
					}
					fclose(fp);
				}
				return 1;
			}
		}
	}
}
int DeleteTraffic(AdjLGraph *G, int a[])
{
	tag = 1;
	int i, j, v1, v2, e = 0;
	system("cls");
	for (j = 0;j < G->numOfVerts;j++)
	printf("%d=%s\n", j, G->a[j].data);
	printf("\n                             选取城市序号:");
	scanf("%d", &v1);
	printf("\n                             选取另一个城市序号:");
	scanf("%d", &v2);
	if (DeleteEdge(G, v1, v2) == 0)
	{
		printf("\n\n\n                               全国交通资讯模拟\n\n");
		printf("\n                               请选择程序功能:\n\n");
		printf("                     ╭──────────────────╮\n\n");
		printf("                    │          1=返回                      │\n\n");
		printf("                    ╰───────────────────╯\n\n");
		printf("                                   选择?");
		scanf("%d", &i);
		getchar();
		do
		{
			switch (i)
			{
			case 1:return 0;
			}
		} while (i != 1);
	}
	j = 0;
	while (Traffic[5 * j] != v1 || Traffic[5 * j + 1] != v2)j++;
	Traffic[5 * j] = -1;
	Traffic[5 * j + 1] = -1;
	Traffic[5 * j + 2] = -1;
	Traffic[5 * j + 3] = -1;
	Traffic[5 * j + 4] = -1;
	char flag;
	getchar();
	printf("\n                             是否保存交通道路文本?(Y/N)");
	flag = getchar();
	getchar();
	printf("%c\n", flag);
	if (flag == 'y' || flag == 'Y')
	{
		FILE *fp;
		if ((fp = fopen("C:\\suanfa\\traffic.txt", "wb")) == NULL)
		{
			printf("无法打开文件!\n");
		}
		for (j = 0;j < 5 * (G->numOfEdges + 1);j++)
		{
			fprintf(fp, "%5d", Traffic[j]);
		}
		fclose(fp);
		if ((fp = fopen("C:\\suanfa\\traffic.txt", "rb")) == NULL)
		{
			printf("无法打开文件!\n");
		}
		while (!feof(fp))
		{
			fscanf(fp, "%5d", &Traffic[e]);
			if (Traffic[e] == -1)e--;
			e++;
		}
		fclose(fp);
		G->numOfEdges = e / 5;
		if ((fp = fopen("C:\\suanfa\\traffic.txt", "wb")) == NULL)
		{
			printf("无法打开文件!\n");
		}
		for (j = 0;j < 5 * G->numOfEdges;j++)
		{
			fprintf(fp, "%5d", Traffic[j]);
		}
		fclose(fp);
	}
	return 1;}

5 说明

首先应该管理员操作在文件中输入一定的数据,否则会出现错误。
例如文件内容:

哈尔滨 长春 大连 天津 北京 呼和浩特 兰州 西宁 乌鲁木齐 徐州 西安 上海 武汉 成都 福州 南昌 株洲 贵阳 昆明 深圳 广州 柳州 南宁 辽阳

0 1 242 625 700 1 0 242 1000 909 3 4 137 1000 1300 4 3 137 800 1400 4 5 668 1245 1530 5 4 668 750 1200 5 6 1145 1120 1330 6 5 1145 1000 900 6 7 216 1345 700 7 6 216 830 945 6 8 1892 1520 900 8 6 1892 700 650 3 9 674 1020 900 9 3 674 1025 809 6 10 676 900 900 10 6 676 900 1000 9 11 651 1200 700 11 9 651 900 1400 10 13 842 1600 1723 13 10 842 1900 2000 11 15 825 1000 900 15 11 825 700 800 12 16 409 840 920 16 12 409 1200 1340 13 17 967 830 830 17 13 967 1000 900 13 18 1100 1000 900 18 13 1100 900 800 14 15 622 808 900 15 14 622 1000 1400 15 16 367 1400 1400 16 15 367 900 900 16 17 907 1200 1200 17 16 907 1000 1000 17 18 639 1200 1000 18 17 1400 1430 2000 16 20 675 1000 1000 20 16 675 900 1300 19 20 140 1000 900 20 19 140 1900 1800 16 21 672 1000 1000 21 16 672 1000 1000 21 22 255 909 920 22 21 255 1000 1300 0 23 800 800 200 2 23 560 200 312 1 5 5800 14 1800
然后进行用户操作根据自身需求结合菜单指示进行查询!

  • 48
    点赞
  • 325
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 55
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GodOuO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值