火车管理系统代码 c语言

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

typedef struct {
    char trainNumber[10];
    char departure[50];
    char destination[50];
    char departureTime[6];
    char arrivalTime[6];
    float price;
    int totalSeats;
    int bookedSeats;
} Train;

typedef struct {
    char passengerName[50];
    char trainNumber[10];
} Booking;

void addTrain(Train** trains, int* trainCount, const char* filename) {
    *trains = (Train*)realloc(*trains, (*trainCount + 1) * sizeof(Train));
    if (*trains == NULL) {
        printf("内存分配失败!\n");
        return;
    }
    Train* newTrain = &(*trains)[*trainCount];
    printf("输入新火车班次号: ");
    scanf("%s", newTrain->trainNumber);
    printf("输入出发地: ");
    scanf("%s", newTrain->departure);
    printf("输入目的地: ");
    scanf("%s", newTrain->destination);
    printf("输入出发时间 (HH:MM): ");
    scanf("%s", newTrain->departureTime);
    printf("输入到达时间 (HH:MM): ");
    scanf("%s", newTrain->arrivalTime);
    printf("输入票价: ");
    scanf("%f", &newTrain->price);
    printf("输入总座位数: ");
    scanf("%d", &newTrain->totalSeats);
    newTrain->bookedSeats = 0;
    (*trainCount)++;
    printf("火车班次已添加成功。\n");

    // 保存火车班次到文件
    FILE* file = fopen("trains_data.txt", "a");
    if (file == NULL) {
        printf("无法打开文件\n");
        return;
    }
    fprintf(file, "%s,%s,%s,%s,%s,%.2f,%d\n",
        newTrain->trainNumber,
        newTrain->departure,
        newTrain->destination,
        newTrain->departureTime,
        newTrain->arrivalTime,
        newTrain->price,
        newTrain->totalSeats);
    fclose(file);
}

void deleteTrain(Train** trains, int* trainCount, const char* filename) {
    if (*trainCount == 0) {
        printf("没有火车班次可删除。\n");
        return;
    }

    char trainNumber[10];
    printf("请输入要删除的火车班次号: ");
    scanf("%s", trainNumber);

    // 查找火车班次
    int trainIndex = -1;
    for (int i = 0; i < *trainCount; ++i) {
        if (strcmp((*trains)[i].trainNumber, trainNumber) == 0) {
            trainIndex = i;
            break;
        }
    }

    if (trainIndex == -1) {
        printf("找不到火车班次:%s\n", trainNumber);
        return;
    }

    // 删除找到的火车班次
    for (int i = trainIndex; i < *trainCount - 1; i++) {
        (*trains)[i] = (*trains)[i + 1];
    }

    (*trainCount)--;
    printf("火车班次:%s 已删除。\n", trainNumber);

    // 保存更新后的火车班次到文件
    FILE* file = fopen("trains_data.txt", "w");
    if (file == NULL) {
        printf("无法打开文件\n");
        return;
    }
    for (int i = 0; i < *trainCount; ++i) {
        fprintf(file, "%s,%s,%s,%s,%s,%.2f,%d\n",
            (*trains)[i].trainNumber,
            (*trains)[i].departure,
            (*trains)[i].destination,
            (*trains)[i].departureTime,
            (*trains)[i].arrivalTime,
            (*trains)[i].price,
            (*trains)[i].totalSeats);
    }
    fclose(file);
}

void bookTicket(Train trains[], int trainCount, Booking bookings[], int* bookingCount) {
    char trainNumber[10];
    printf("请输入火车班次: ");
    scanf("%s", trainNumber);

    // 查找火车班次
    int trainIndex = -1;
    for (int i = 0; i < trainCount; ++i) {
        if (strcmp(trains[i].trainNumber, trainNumber) == 0) {
            trainIndex = i;
            break;
        }
    }

    if (trainIndex == -1) {
        printf("找不到该火车班次,请重新输入!\n");
        return;
    }

    if (trains[trainIndex].bookedSeats >= trains[trainIndex].totalSeats) {
        printf("抱歉,该火车已无空座位!\n");
        return;
    }

    // 为乘客预订火车票
    printf("请输入乘客姓名: ");
    char passengerName[50];
    getchar(); // 清除缓冲区的换行符
    fgets(passengerName, 50, stdin);
    passengerName[strcspn(passengerName, "\n")] = 0; // 这行代码将passengerName数组中的换行符(由fgets附加)替换为空字符,以去除换行符。

    strcpy(bookings[*bookingCount].passengerName, passengerName);
    strcpy(bookings[*bookingCount].trainNumber, trainNumber);
    (*bookingCount)++;
    trains[trainIndex].bookedSeats++;

    printf("火车票预订成功!\n");
}

void cancelTicket(Booking bookings[], int* bookingCount) {
    if (*bookingCount == 0) {
        printf("目前没有预订记录!\n");
        return;
    }

    char passengerName[50];
    printf("请输入乘客姓名进行取消: ");
    getchar(); // 清除缓冲区的换行符
    fgets(passengerName, 50, stdin);
    passengerName[strcspn(passengerName, "\n")] = 0; // 移除fgets附加的换行符

    for (int i = 0; i < *bookingCount; ++i) {
        if (strcmp(bookings[i].passengerName, passengerName) == 0) {
            for (int j = i; j < *bookingCount - 1; ++j) {
                bookings[j] = bookings[j + 1];
            }
            (*bookingCount)--;
            printf("预订已成功取消。\n");
            return;
        }
    }

    printf("未找到该乘客的预订记录。\n");
}

void printBookings(const Booking bookings[], int bookingCount) {
    if (bookingCount == 0) {
        printf("没有预订记录。\n");
        return;
    }

    printf("当前所有预订记录:\n");
    for (int i = 0; i < bookingCount; ++i) {
        printf("乘客姓名: %s, 火车班次: %s\n", bookings[i].passengerName, bookings[i].trainNumber);
    }
}

void queryTrains(const Train trains[], int trainCount) {
    printf("可用的火车班次:\n");
    for (int i = 0; i < trainCount; ++i) {
        printf("火车班次: %s, 从 %s 到 %s, 出发时间: %s, 到达时间: %s, 价格: %.2f, 可用座位: %d\n",
            trains[i].trainNumber, trains[i].departure, trains[i].destination,
            trains[i].departureTime, trains[i].arrivalTime, trains[i].price,
            trains[i].totalSeats - trains[i].bookedSeats);

    }
}

void TrainsFile(Train** trains, int* trainCount, const char* filename) {
    FILE* file = fopen(filename, "r+");
    if (file == NULL) {
        perror("无法打开文件");
        return;
    }

    char buffer[256];
    while (fgets(buffer, sizeof(buffer), file)) {
        *trains = realloc(*trains, (*trainCount + 1) * sizeof(Train));
        if (*trains == NULL) {
            perror("内存分配失败");
            fclose(file);
            return;
        }
        Train* newTrain = &(*trains)[*trainCount];
        sscanf(buffer, "%[^,],%[^,],%[^,],%[^,],%[^,],%f,%d",
            newTrain->trainNumber,
            newTrain->departure,
            newTrain->destination,
            newTrain->departureTime,
            newTrain->arrivalTime,
            &newTrain->price,
            &newTrain->totalSeats);
        newTrain->bookedSeats = 0;  // 初始化预订座位为0
        (*trainCount)++;
    }
    fclose(file);
    printf("火车班次数据加载完毕。共加载%d趟火车。\n", *trainCount);
}

void modifyTrain(Train trains[], int trainCount, const char* filename) {
    char trainNumber[10];
    printf("请输入要修改的火车班次号: ");
    scanf("%s", trainNumber);

    // 查找火车班次
    int trainIndex = -1;
    for (int i = 0; i < trainCount; ++i) {
        if (strcmp(trains[i].trainNumber, trainNumber) == 0) {
            trainIndex = i;
            break;
        }
    }

    if (trainIndex == -1) {
        printf("找不到火车班次:%s\n", trainNumber);
        return;
    }

    // 修改火车班次的信息
    Train* train = &trains[trainIndex];
    printf("输入新的出发地 (当前:%s): ", train->departure);
    scanf("%s", train->departure);
    printf("输入新的目的地 (当前:%s): ", train->destination);
    scanf("%s", train->destination);
    printf("输入新的出发时间 (当前:%s): ", train->departureTime);
    scanf("%s", train->departureTime);
    printf("输入新的到达时间 (当前:%s): ", train->arrivalTime);
    scanf("%s", train->arrivalTime);
    printf("输入新的票价 (当前:%f): ", train->price);
    scanf("%f", &train->price);
    printf("输入新的总座位数 (当前:%d): ", train->totalSeats);
    scanf("%d", &train->totalSeats);

    printf("火车班次:%s 已修改。\n", trainNumber);

    // 保存更新后的火车班次到文件
    FILE* file = fopen("trains_data.txt", "w");
    if (file == NULL) {
        printf("无法打开文件\n");
        return;
    }
    for (int i = 0; i < trainCount; ++i) {
        fprintf(file, "%s,%s,%s,%s,%s,%.2f,%d\n",
            trains[i].trainNumber,
            trains[i].departure,
            trains[i].destination,
            trains[i].departureTime,
            trains[i].arrivalTime,
            trains[i].price,
            trains[i].totalSeats);
    }
    fclose(file);
}

void searchTrainsByLocation(const Train trains[], int trainCount) {
    char departure[50];
    char destination[50];
    printf("请输入出发地: ");
    scanf("%s", departure);
    printf("请输入目的地: ");
    scanf("%s", destination);

    // 查找符合出发地和目的地的火车班次
    printf("符合出发地和目的地的火车班次:\n");
    int flag = 1;
    for (int i = 0; i < trainCount; ++i) {
        if (strcmp(trains[i].departure, departure) == 0 && strcmp(trains[i].destination, destination) == 0) {
            flag = 0;
            printf("火车班次: %s, 从 %s 到 %s, 出发时间: %s, 到达时间: %s, 价格: %.2f, 可用座位: %d\n",
                trains[i].trainNumber, trains[i].departure, trains[i].destination,
                trains[i].departureTime, trains[i].arrivalTime, trains[i].price,
                trains[i].totalSeats - trains[i].bookedSeats);
        }
    }
    if (flag) {
        printf("无此航班\n");
    }
}

void adminMenu(Train** trains, int* trainCount, Booking bookings[], int* bookingCount) {
    int choice;
    while (1) {
        printf("管理员菜单\n");
        printf("1. 添加火车班次\n");
        printf("2. 删除火车班次\n");
        printf("3. 修改火车班次\n");
        printf("4. 查看预订记录\n");
        printf("5. 返回主菜单\n");
        printf("请选择操作: ");
        scanf("%d", &choice);
        getchar(); // 清除缓冲区的换行符

        switch (choice) {
        case 1:
            addTrain(trains, trainCount, "trains_data.txt");
            break;
        case 2:
            deleteTrain(trains, trainCount, "trains_data.txt");
            break;
        case 3:
            modifyTrain(*trains, *trainCount, "trains_data.txt");
            break;
        case 4:
            printBookings(bookings, *bookingCount);
            break;
        case 5:
            return;
        default:
            printf("无效的选项,请重新选择!\n");
        }
    }
}

void buyerMenu(Train trains[], int trainCount, Booking bookings[], int* bookingCount) {
    int choice;
    while (1) {
        printf("买家菜单\n");
        printf("1. 查询所有火车班次\n");
        printf("2. 根据出发地和目的地查询火车班次\n");
        printf("3. 预订火车票\n");
        printf("4. 取消预订\n");
        printf("5. 返回主菜单\n");
        printf("请选择操作: ");
        scanf("%d", &choice);
        getchar(); // 清除缓冲区的换行符

        switch (choice) {
        case 1:
            queryTrains(trains, trainCount);
            break;
        case 2:
            searchTrainsByLocation(trains, trainCount);
            break;
        case 3:
            bookTicket(trains, trainCount, bookings, bookingCount);
            break;
        case 4:
            cancelTicket(bookings, bookingCount);
            break;
        case 5:
            return;
        default:
            printf("无效的选项,请重新选择!\n");
        }
    }
}

int main() {
    Booking bookings[100]; // 假设最多100个预订
    int bookingCount = 0;

    Train* trains = NULL;
    int trainCount = 0;

    // 加载火车数据
    TrainsFile(&trains, &trainCount, "trains_data.txt");

    int choice;
    while (1) {
        printf("火车票管理系统\n");
        printf("1. 管理员登录\n");
        printf("2. 买家登录\n");
        printf("3. 退出\n");
        printf("请选择操作: ");
        scanf("%d", &choice);
        getchar(); // 清除缓冲区的换行符

        switch (choice) {
        case 1:
            adminMenu(&trains, &trainCount, bookings, &bookingCount);
            break;
        case 2:
            buyerMenu(trains, trainCount, bookings, &bookingCount);
            break;
        case 3:
            printf("谢谢使用,再见!\n");
            free(trains); // 释放动态分配的内存
            exit(0);
        default:
            printf("无效的选项,请重新选择!\n");
        }
    }

    free(trains);
    return 0;

要使用以源代码记得使用创建一个文件夹,并且将源代码中的文件夹名字改成你文件的名字,否则会报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值