地铁线路查询系统 - 最短路径规划、车站信息查询
地铁线路查询系统
本系统提供以下功能:
- 线路查询: 查询指定线路的详细信息,包括票价、首班时间、末班时间、途径站点等信息。
- 站点信息查询: 查询指定站点的详细信息,包括站点名称、所在线路、上一站、下一站等信息。
- 最短路径查询: 规划从起点站到终点站的最短路径,并提供换乘建议。
系统功能实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXNAMELEN 50
// 地铁线路结构体
typedef struct Line {
char name[MAXNAMELEN];
int price;
char starttime[MAXNAMELEN];
char endtime[MAXNAMELEN];
int stationnum;
struct Station *stations;
} Line;
// 地铁站点结构体
typedef struct Station {
char name[MAXNAMELEN];
int distance;
} Station;
// 地铁系统结构体
typedef struct Subway {
int linenum;
Line *lines;
} Subway;
// 加载地铁数据
void load_data(Subway *subway) {
FILE *fp = fopen("subway.txt", "r");
if (fp == NULL) {
printf("无法打开文件");
exit(1);
}
fscanf(fp, "%d", &subway->linenum);
subway->lines = (Line *)malloc(sizeof(Line) * subway->linenum);
for (int i = 0; i < subway->linenum; i++) {
Line *line = &subway->lines[i];
fscanf(fp, "%s %d %s %s %d", line->name, &line->price, line->starttime, line->endtime, &line->stationnum);
line->stations = (Station *)malloc(sizeof(Station) * line->stationnum);
for (int j = 0; j < line->stationnum; j++) {
Station *station = &line->stations[j];
fscanf(fp, "%s %d", station->name, &station->distance);
}
}
fclose(fp);
}
// 保存地铁数据
void save_data(Subway *subway) {
FILE *fp = fopen("subway.txt", "w");
if (fp == NULL) {
printf("无法打开文件");
exit(1);
}
fprintf(fp, "%d ", subway->linenum);
for (int i = 0; i < subway->linenum; i++) {
Line *line = &subway->lines[i];
fprintf(fp, "%s %d %s %s %d ", line->name, line->price, line->starttime, line->endtime, line->stationnum);
for (int j = 0; j < line->stationnum; j++) {
Station *station = &line->stations[j];
fprintf(fp, "%s %d ", station->name, station->distance);
}
}
fclose(fp);
}
// 打印线路信息
void print_line_info(Line *line) {
printf("线路名称: %s\n", line->name);
printf("票价: %d元\n", line->price);
printf("首班时间: %s\n", line->starttime);
printf("末班时间: %s\n", line->endtime);
printf("途径站点: \n");
for (int i = 0; i < line->stationnum; i++) {
printf("%s ", line->stations[i].name);
}
printf("\n");
}
// 打印站点信息
void print_station_info(Line *line, int station_index) {
printf("站点名称: %s\n", line->stations[station_index].name);
printf("所在线路: %s\n", line->name);
if (station_index > 0) {
printf("上一站: %s\n", line->stations[station_index - 1].name);
} else {
printf("这是起点站\n");
}
if (station_index < line->stationnum - 1) {
printf("下一站: %s\n", line->stations[station_index + 1].name);
} else {
printf("这是终点站\n");
}
}
// 查找最短路径 (TODO)
void find_shortest_path(Subway *subway, char start_station[], char end_station[]) {
printf("起点: %s\n", start_station);
printf("终点: %s\n", end_station);
}
int main() {
Subway subway;
load_data(&subway);
int option;
do {
printf("***请选择功能: ***\n");
printf("**1.线路查询 **\n");
printf("**2.站点信息查询 **\n");
printf("**3.最短路径查询 **\n");
printf("**4.保存信息到文件 **\n");
printf("**5.从文件中读取信息 **\n");
printf("**6.退出 **\n");
scanf("%d", &option);
switch (option) {
case 1: {
printf("请输入线路名称: ");
char line_name[MAXNAMELEN];
scanf("%s", line_name);
Line *line = NULL;
for (int i = 0; i < subway.linenum; i++) {
if (strcmp(subway.lines[i].name, line_name) == 0) {
line = &subway.lines[i];
break;
}
}
if (line == NULL) {
printf("没有找到线路 %s\n", line_name);
} else {
print_line_info(line);
}
break;
}
case 2: {
printf("请输入站点名称: ");
char station_name[MAXNAMELEN];
scanf("%s", station_name);
int station_index = -1;
for (int i = 0; i < subway.linenum; i++) {
for (int j = 0; j < subway.lines[i].stationnum; j++) {
if (strcmp(subway.lines[i].stations[j].name, station_name) == 0) {
station_index = j;
print_station_info(&subway.lines[i], j);
break;
}
}
if (station_index != -1) {
break;
}
}
if (station_index == -1) {
printf("没有找到站点 %s\n", station_name);
}
break;
}
case 3: {
printf("请输入起点站和终点站: ");
char start_station[MAXNAMELEN], end_station[MAXNAMELEN];
scanf("%s %s", start_station, end_station);
find_shortest_path(&subway, start_station, end_station);
break;
}
case 4: {
save_data(&subway);
printf("信息已保存到文件\n");
break;
}
case 5: {
load_data(&subway);
printf("信息已从文件中读取\n");
break;
}
case 6: {
printf("退出程序\n");
break;
}
default: {
printf("无效选项\n");
break;
}
}
} while (option != 6);
return 0;
}
添加新功能
- 实时车辆位置查询: 为了实现实时车辆位置查询,需要与地铁公司合作获取实时数据。可以使用 API 或其他数据接口获取车辆位置信息。
- 换乘建议: 可以根据最短路径算法,计算出不同线路之间的换乘方案,并推荐最短换乘时间和最少换乘次数的方案。
- 车站设施查询: 可以预先收集每个车站的设施信息,例如无障碍设施、电梯、洗手间等,并将其存储到数据库或文件中。用户查询时,可以从数据库或文件中获取相应的设施信息。
- 实时票价: 需要与地铁公司合作,获取实时票价信息。
代码示例
由于代码示例需要具体实现,涉及到与地铁公司合作获取实时数据,在此不提供具体代码。建议您寻找相关的开源项目或 API 来实现这些功能。
原文地址: https://www.cveoy.top/t/topic/oB2I 著作权归作者所有。请勿转载和采集!