厦门地铁票务管理系统 C语言实现

该系统旨在为厦门地铁乘客提供便捷的票务查询服务,主要功能包括:

  1. 系统功能

    1. 新线路/新站点相关信息(线路编号、途径站点信息等)录入。
    2. 列车时刻信息(线路编号、日期、起点、终点、发车时间、到达时间)录入。
    3. 根据用户输入线路信息查询线路详细信息。
    4. 根据用户输入起终点信息查询票价信息。
    5. 根据用户输入起终点信息查询应乘坐地铁线路信息及途径站点信息、发车时间、到达时间、乘坐的站数和换乘信息等。
    6. 列车时刻信息查询(按线路编号、起点、终点、终点和日期等查询)。
    7. 按起点/终点统计每日的车次数。
  2. 系统主界面应有以下功能选项

    • 录入新线路、站点信息
    • 查询票价
    • 查询线路及站点信息
    • 统计列车时刻及车次信息
    • 退出

数据结构设计

为了实现上述功能,需要设计以下数据结构:

  1. 线路信息结构体(Route)

    • 包含线路编号、途径站点信息等。
  2. 列车时刻表结构体(TrainSchedule)

    • 包含线路编号、日期、起点、终点、发车时间、到达时间。
  3. 票价信息结构体(TicketPrice)

    • 包含起点、终点和票价信息。
  4. 地铁线路信息结构体(SubwayRoute)

    • 包含起点、终点、途径站点信息、发车时间、到达时间、乘坐的站数和换乘信息等。

功能实现方法

在程序中,可以使用以下方法实现功能需求:

  1. 新线路/新站点相关信息录入

    • 通过读取用户输入的线路编号和途径站点信息,创建 Route 结构体并保存到文件中。
  2. 列车时刻信息录入

    • 通过读取用户输入的线路编号、日期、起点、终点、发车时间和到达时间,创建 TrainSchedule 结构体并保存到文件中。
  3. 查询线路详细信息

    • 通过读取用户输入的线路编号,从文件中查找对应的 Route 结构体并输出相关信息。
  4. 查询票价信息

    • 通过读取用户输入的起点和终点信息,从文件中查找对应的 TicketPrice 结构体并输出票价信息。
  5. 查询应乘坐地铁线路信息及途径站点信息、发车时间、到达时间、乘坐的站数和换乘信息等

    • 通过读取用户输入的起点和终点信息,从文件中查找对应的 SubwayRoute 结构体并输出相关信息。
  6. 列车时刻信息查询

    • 根据用户输入的查询条件(线路编号、起点、终点、日期等),从文件中查找对应的 TrainSchedule 结构体并输出相关信息。
  7. 按起点/终点统计每日的车次数

    • 通过读取文件中所有 TrainSchedule 结构体的信息,统计每日起点/终点的车次数并输出。

文件存储方案

对于文件存储数据,可以使用文本文件或二进制文件进行存储。具体实现方法可以参考下面的示例代码:

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

// 定义数据结构
typedef struct {
    char routeNo[20]; // 线路编号
    char station[20][20]; // 途径站点信息
    int stationCount; // 站点数量
} Route;

typedef struct {
    char routeNo[20]; // 线路编号
    char date[20]; // 日期
    char startStation[20]; // 起点站
    char endStation[20]; // 终点站
    char startTime[20]; // 发车时间
    char endTime[20]; // 到达时间
} TrainSchedule;

typedef struct {
    char startStation[20]; // 起点站
    char endStation[20]; // 终点站
    int ticketPrice; // 票价
} TicketPrice;

typedef struct {
    char startStation[20]; // 起点站
    char endStation[20]; // 终点站
    char routeNo[20]; // 地铁线路编号
    char stations[20][20]; // 途径站点信息
    int stationCount; // 站点数量
    char startTime[20]; // 发车时间
    char endTime[20]; // 到达时间
    int stationNum; // 乘坐的站数
    char transferInfo[20]; // 换乘信息
} SubwayRoute;

// 文件操作函数
void writeRouteToFile(Route route) {
    FILE *fp = fopen("route.dat", "ab");
    fwrite(&route, sizeof(Route), 1, fp);
    fclose(fp);
}

void writeTrainScheduleToFile(TrainSchedule schedule) {
    FILE *fp = fopen("train_schedule.dat", "ab");
    fwrite(&schedule, sizeof(TrainSchedule), 1, fp);
    fclose(fp);
}

void writeTicketPriceToFile(TicketPrice price) {
    FILE *fp = fopen("ticket_price.dat", "ab");
    fwrite(&price, sizeof(TicketPrice), 1, fp);
    fclose(fp);
}

void writeSubwayRouteToFile(SubwayRoute route) {
    FILE *fp = fopen("subway_route.dat", "ab");
    fwrite(&route, sizeof(SubwayRoute), 1, fp);
    fclose(fp);
}

void readRouteFromFile(char routeNo[20]) {
    FILE *fp = fopen("route.dat", "rb");
    Route route;
    while (fread(&route, sizeof(Route), 1, fp)) {
        if (strcmp(route.routeNo, routeNo) == 0) {
            printf("线路编号:%s\n", route.routeNo);
            printf("途径站点:");
            for (int i = 0; i < route.stationCount; i++) {
                printf("%s ", route.station[i]);
            }
            printf("\n");
        }
    }
    fclose(fp);
}

void readTicketPriceFromFile(char startStation[20], char endStation[20]) {
    FILE *fp = fopen("ticket_price.dat", "rb");
    TicketPrice price;
    while (fread(&price, sizeof(TicketPrice), 1, fp)) {
        if (strcmp(price.startStation, startStation) == 0 && strcmp(price.endStation, endStation) == 0) {
            printf("%s站到%s站的票价为:%d元\n", price.startStation, price.endStation, price.ticketPrice);
        }
    }
    fclose(fp);
}

void readSubwayRouteFromFile(char startStation[20], char endStation[20]) {
    FILE *fp = fopen("subway_route.dat", "rb");
    SubwayRoute route;
    while (fread(&route, sizeof(SubwayRoute), 1, fp)) {
        if (strcmp(route.startStation, startStation) == 0 && strcmp(route.endStation, endStation) == 0) {
            printf("从%s站到%s站的地铁线路:%s\n", route.startStation, route.endStation, route.routeNo);
            printf("途径站点:");
            for (int i = 0; i < route.stationCount; i++) {
                printf("%s ", route.stations[i]);
            }
            printf("\n");
            printf("发车时间:%s,到达时间:%s,乘坐站数:%d,换乘信息:%s\n", route.startTime, route.endTime, route.stationNum, route.transferInfo);
        }
    }
    fclose(fp);
}

void readTrainScheduleFromFile(char routeNo[20], char startStation[20], char endStation[20], char date[20]) {
    FILE *fp = fopen("train_schedule.dat", "rb");
    TrainSchedule schedule;
    int count = 0;
    while (fread(&schedule, sizeof(TrainSchedule), 1, fp)) {
        if (strcmp(schedule.routeNo, routeNo) == 0 && strcmp(schedule.startStation, startStation) == 0
            && strcmp(schedule.endStation, endStation) == 0 && strcmp(schedule.date, date) == 0) {
            printf("车次:%d\n", ++count);
            printf("线路编号:%s,日期:%s\n", schedule.routeNo, schedule.date);
            printf("起点:%s,终点:%s\n", schedule.startStation, schedule.endStation);
            printf("发车时间:%s,到达时间:%s\n", schedule.startTime, schedule.endTime);
        }
    }
    fclose(fp);
}

void statisticTrainSchedule(char station[20], char date[20]) {
    FILE *fp = fopen("train_schedule.dat", "rb");
    TrainSchedule schedule;
    int count = 0;
    while (fread(&schedule, sizeof(TrainSchedule), 1, fp)) {
        if (strcmp(schedule.startStation, station) == 0 && strcmp(schedule.date, date) == 0) {
            count++;
        }
    }
    printf("%s站每日车次数:%d\n", station, count);
    fclose(fp);
}

// 主函数
int main() {
    int choice;
    do {
        printf("\n");
        printf("1. 录入新线路、站点信息\n");
        printf("2. 查询票价\n");
        printf("3. 查询线路及站点信息\n");
        printf("4. 统计列车时刻及车次信息\n");
        printf("5. 退出\n");
        printf("请选择功能:");
        scanf("%d", &choice);
        switch (choice) {
            case 1: {
                // 录入新线路、站点信息
                Route route;
                printf("请输入线路编号:");
                scanf("%s", route.routeNo);
                printf("请输入途径站点(以空格分隔):");
                char stationName[20];
                route.stationCount = 0;
                while (scanf("%s", stationName)) {
                    strcpy(route.station[route.stationCount++], stationName);
                    if (getchar() == '\n') {
                        break;
                    }
                }
                writeRouteToFile(route);
                break;
            }
            case 2: {
                // 查询票价
                char startStation[20], endStation[20];
                printf("请输入起点站:");
                scanf("%s", startStation);
                printf("请输入终点站:");
                scanf("%s", endStation);
                readTicketPriceFromFile(startStation, endStation);
                break;
            }
            case 3: {
                // 查询线路及站点信息
                char routeNo[20];
                printf("请输入线路编号:");
                scanf("%s", routeNo);
                readRouteFromFile(routeNo);
                break;
            }
            case 4: {
                // 统计列车时刻及车次信息
                int subChoice;
                do {
                    printf("\n");
                    printf("1. 按线路编号查询列车时刻信息\n");
                    printf("2. 按起点/终点/日期查询列车时刻信息\n");
                    printf("3. 按起点统计每日车次数\n");
                    printf("4. 按终点统计每日车次数\n");
                    printf("5. 返回上一级菜单\n");
                    printf("请选择功能:");
                    scanf("%d", &subChoice);
                    switch (subChoice) {
                        case 1: {
                            // 按线路编号查询列车时刻信息
                            char routeNo[20];
                            printf("请输入线路编号:");
                            scanf("%s", routeNo);
                            readTrainScheduleFromFile(routeNo, "", "", "");
                            break;
                        }
                        case 2: {
                            // 按起点/终点/日期查询列车时刻信息
                            char routeNo[20], startStation[20], endStation[20], date[20];
                            printf("请输入线路编号(可不填):");
                            scanf("%s", routeNo);
                            printf("请输入起点站(可不填):");
                            scanf("%s", startStation);
                            printf("请输入终点站(可不填):");
                            scanf("%s", endStation);
                            printf("请输入日期(可不填):");
                            scanf("%s", date);
                            readTrainScheduleFromFile(routeNo, startStation, endStation, date);
                            break;
                        }
                        case 3: {
                            // 按起点统计每日车次数
                            char station[20], date[20];
                            printf("请输入站点名称:");
                            scanf("%s", station);
                            printf("请输入日期:");
                            scanf("%s", date);
                            statisticTrainSchedule(station, date);
                            break;
                        }
                        case 4: {
                            // 按终点统计每日车次数
                            char station[20], date[20];
                            printf("请输入站点名称:");
                            scanf("%s", station);
                            printf("请输入日期:");
                            scanf("%s", date);
                            statisticTrainSchedule(station, date);
                            break;
                        }
                        case 5: {
                            // 返回上一级菜单
                            break;
                        }
                        default: {
                            printf("无效选择,请重新输入\n");
                            break;
                        }
                    }
                } while (subChoice != 5);
                break;
            }
            case 5: {
                // 退出
                break;
            }
            default: {
                printf("无效选择,请重新输入\n");
                break;
            }
        }
    } while (choice != 5);

    return 0;
}

该示例代码仅供参考,实际开发中需要根据具体需求进行修改和完善。

厦门地铁票务管理系统 C语言实现

原文地址: https://www.cveoy.top/t/topic/oKUu 著作权归作者所有。请勿转载和采集!

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