Bootstrap

C语言实现地铁线路管理系统 含源码 福利

基本功能

  1. 线路信息输入
  • 用户能够输入地铁线路编号和站点信息。
  • 例如,第一行输入 “9 35” 表示地铁9号线共有35个站点,站点编号从1至35。第二行输入35个站点名称“songjiangnanzhan zuibaichi songjiangtiyuzhongxin songjiangxincheng songjiangdaxuecheng ……”。说明:这里输入的是拼音,可以考虑输入中文,这样更直观。
  1. 换乘站信息输入
  • 用户能够输入换乘站信息。
  • 例如,输入 “3 5 9 16” 表示地铁3号线的第5站与地铁9号线的第16站之间可以进行换乘。也可输入“3 yishanlu 9 yishanlu”,表示地铁3号线的yishanlu与9号线的yishanlu之间可以换乘。
  1. 线路信息修改
  • 系统应支持以下修改操作:
    • 扩充线路长度:例如,将9号线的站点数量从35增加到40。
    • 缩短线路长度:例如,将9号线的站点数量从35减少到30。
    • 删除换乘站:允许用户删除指定线路间的换乘关系,例如删除9号线和3号线的yishanlu站的换乘。
    • 封闭线路区间:例如,封闭9号线的第16站至第18站,使得这三站无法出入或进行换乘。
    • 恢复线路区间:例如,恢复9号线的第16站
  1. 线路查询功能
    - 输入线路号查询:例如,输入9,可以输出9号线的站点以及换乘信息。
  2. 路线查询功能
  • 以上线路信息中,每两站之间距离均为1,所有换乘距离均为0。用户可以查询从某一站点到另一站点的最短路线。系统将输出以下结果之一:
    • 无需换乘则输出路线和起止站点。例如,输入“songjiangdaxuecheng shijidadao”,则输出“乘坐9号线 songjiangdaxuecheng上车, shijidadao下车”
    • 换乘路线所有必要的换乘站点和线路。例如,输入“songjiangdaxuecheng zhongshangongyuan”,则输出“9号线 songjiangdaxuecheng上, yishanlu下\n3号线yishanlu上,zhongshangongyuan下”以及“9号线 songjiangdaxuecheng上, yishanlu下\n4号线yishanlu上,zhongshangongyuan下”
    • 不可到达,如果站点暂时封闭或者不存在等情况则不可到达。
    • 如果多条路线均最短,则都输出。如上例,3号和4号线都可以到达zhongshangongyuan,因此输出了两条路线。
  1. 用户界面
  • 系统应提供一个简洁直观的菜单,使用户能够轻松输入、修改和查询地铁线路信息。

源码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STATIONS 100
#define MAX_LINES 10
#define MAX_NAME_LENGTH 50

typedef struct {
    int line_number;
    int station_count;
    char stations[MAX_STATIONS][MAX_NAME_LENGTH];
} Line;

typedef struct {
    int line1;
    int station1;
    int line2;
    int station2;
} Transfer;

Line lines[MAX_LINES];
Transfer transfers[MAX_STATIONS];
int line_count = 0;
int transfer_count = 0;

void input_line_info() {
    printf("请输入地铁线路编号和站点信息(例如:9 35):");
    scanf("%d %d", &lines[line_count].line_number, &lines[line_count].station_count);
    getchar(); // 吃掉换行符
    printf("请输入站点名称(例如:songjiangnanzhan zuibaichi ...):");
    for (int i = 0; i < lines[line_count].station_count; i++) {
        scanf("%s", lines[line_count].stations[i]);
    }
    line_count++;
}

void input_transfer_info() {
    printf("请输入换乘站信息(例如:3 5 9 16 或 3 yishanlu 9 yishanlu):");
    char input[100];
    getchar(); // 吃掉换行符
    fgets(input, sizeof(input), stdin);
    if (sscanf(input, "%d %d %d %d", &transfers[transfer_count].line1, &transfers[transfer_count].station1, &transfers[transfer_count].line2, &transfers[transfer_count].station2) == 4) {
        transfer_count++;
    } else {
        int line1, line2;
        char station1[MAX_NAME_LENGTH], station2[MAX_NAME_LENGTH];
        sscanf(input, "%d %s %d %s", &line1, station1, &line2, station2);
        for (int i = 0; i < line_count; i++) {
            if (lines[i].line_number == line1) {
                for (int j = 0; j < lines[i].station_count; j++) {
                    if (strcmp(lines[i].stations[j], station1) == 0) {
                        transfers[transfer_count].line1 = line1;
                        transfers[transfer_count].station1 = j;
                    }
                }
            }
            if (lines[i].line_number == line2) {
                for (int j = 0; j < lines[i].station_count; j++) {
                    if (strcmp(lines[i].stations[j], station2) == 0) {
                        transfers[transfer_count].line2 = line2;
                        transfers[transfer_count].station2 = j;
                    }
                }
            }
        }
        transfer_count++;
    }
}

void modify_line_info() {
    int choice;
    printf("请选择修改操作:\n1. 扩充线路长度\n2. 缩短线路长度\n3. 删除换乘站\n4. 封闭线路区间\n5. 恢复线路区间\n");
    scanf("%d", &choice);
    switch (choice) {
        case 1:
            // 扩充线路长度
            break;
        case 2:
            // 缩短线路长度
            break;
        case 3:
            // 删除换乘站
            break;
        case 4:
            // 封闭线路区间
            break;
        case 5:
            // 恢复线路区间
            break;
        default:
            printf("无效选择\n");
    }
}

void query_line_info() {
    int line_number;
    printf("请输入线路号查询:");
    scanf("%d", &line_number);
    for (int i = 0; i < line_count; i++) {
        if (lines[i].line_number == line_number) {
            printf("线路 %d 的站点信息:\n", line_number);
            for (int j = 0; j < lines[i].station_count; j++) {
                printf("%s ", lines[i].stations[j]);
            }
            printf("\n");
            return;
        }
    }
    printf("未找到线路 %d 的信息\n", line_number);
}

void query_route() {
    char start[MAX_NAME_LENGTH], end[MAX_NAME_LENGTH];
    printf("请输入起始站点和目的站点:");
    scanf("%s %s", start, end);
    // 实现路线查询功能
}

void display_menu() {
    printf("地铁线路管理系统\n");
    printf("1. 线路信息输入\n");
    printf("2. 换乘站信息输入\n");
    printf("3. 线路信息修改\n");
    printf("4. 线路查询功能\n");
    printf("5. 路线查询功能\n");
    printf("0. 退出\n");
    printf("请选择操作:");
}

int main() {
    int choice;
    while (1) {
        display_menu();
        scanf("%d", &choice);
        switch (choice) {
            case 1:
                input_line_info();
                break;
            case 2:
                input_transfer_info();
                break;
            case 3:
                modify_line_info();
                break;
            case 4:
                query_line_info();
                break;
            case 5:
                query_route();
                break;
            case 0:
                printf("退出系统\n");
                return 0;
            default:
                printf("无效选择\n");
        }
    }
    return 0;
}

;