地铁线路查询系统

本系统提供以下功能:

  • 线路查询: 查询指定线路的详细信息,包括票价、首班时间、末班时间、途径站点等信息。
  • 站点信息查询: 查询指定站点的详细信息,包括站点名称、所在线路、上一站、下一站等信息。
  • 最短路径查询: 规划从起点站到终点站的最短路径,并提供换乘建议。

系统功能实现

#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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录