📌  相关文章
📜  C中的铁路预订系统(1)

📅  最后修改于: 2023-12-03 14:40:25.445000             🧑  作者: Mango

铁路预订系统 - C语言

简介

铁路预订系统是一款用C语言编写的控制台应用程序。该系统可以让用户输入出发站点和目的地,并返回可用的前往站点和车次信息。同时,用户可以进行预订操作,并根据已有的订单信息做出相应的处理。

该系统基于C语言开发,采用了链表数据结构和文件操作技术来对车次和订单信息进行存储和管理。

功能
  1. 输入出发站点和目的地,返回可用的前往站点和车次信息。
  2. 根据用户选择,进行车票预订和取消预订。
  3. 显示已有的订单信息。
  4. 保存当前的订单信息到文件中。
  5. 从文件中读取已有的订单信息。
技术实现

数据结构

铁路预订系统使用了链表数据结构来存储车次信息和订单信息。

车次信息链表的每个节点包含了车次编号、出发站点、目的地、出发时间、到达时间、车票价格以及余票数量等信息。

订单信息链表的每个节点包含了订单编号、车次信息、乘车人姓名和座位号等信息。

文件操作

铁路预订系统使用了文件操作技术来实现车次信息和订单信息的持久化,即读取和保存。

车次信息保存在train.txt的文件中,每行对应一条车次信息。订单信息保存在order.txt的文件中,每行对应一条订单信息。

在程序启动时,会从文件中读取已有的车次信息和订单信息,并构造链表进行管理。在程序退出时,会将当前的订单信息保存到文件中。

车票预订及计算

铁路预订系统可以让用户进行车票预订和取消预订。当用户选择预订时,系统会检查当前车次的余票数量是否足够,若足够,则会生成一条新的订单信息,并修改车次的余票信息。订单编号的生成采用了时间戳和随机数的方式。

若余票数量不足,则会提示用户预订失败。当用户选择取消预订时,系统会根据订单编号将对应的订单信息删除,并修改车次的余票数量。在车票预订和取消预订时,系统会根据车票的价格计算订单的总价。

代码片段

以下是铁路预订系统的部分代码。

车次信息结构体定义

struct Train {
    char id[10]; // 车次编号
    char start[20]; // 出发站点
    char end[20]; // 目的地
    char departure[10]; // 出发时间
    char arrival[10]; // 到达时间
    double price; // 车票价格
    int tickets; // 余票数量
    struct Train* next; // 下一条车次信息
};

订单信息结构体定义

struct Order {
    char id[20]; // 订单编号
    struct Train* train; // 对应的车次信息
    char name[20]; // 乘车人姓名
    char seat[5]; // 座位号
    double price; // 订单总价
    struct Order* next; // 下一条订单信息
};

车次信息保存到文件中

void save_trains() {
    FILE* fp = fopen("train.txt", "w");
    if (fp == NULL) {
        printf("Failed to save trains.\n");
        exit(1);
    }
    struct Train* p = trains_head;
    while (p != NULL) {
        fprintf(fp, "%s %s %s %s %s %lf %d\n", p->id, p->start, p->end, p->departure, p->arrival, p->price, p->tickets);
        p = p->next;
    }
    fclose(fp);
}

从文件中读取车次信息

void load_trains() {
    FILE* fp = fopen("train.txt", "r");
    if (fp == NULL) {
        printf("Failed to load trains.\n");
        exit(1);
    }
    char id[10], start[20], end[20], departure[10], arrival[10];
    double price;
    int tickets;
    while (fscanf(fp, "%s %s %s %s %s %lf %d\n", id, start, end, departure, arrival, &price, &tickets) != EOF) {
        add_train(id, start, end, departure, arrival, price, tickets);
    }
    fclose(fp);
}

进行车票预订

void book_ticket() {
    char start[20], end[20];
    printf("Enter start station: ");
    scanf("%s", start);
    printf("Enter end station: ");
    scanf("%s", end);

    struct Train* p = find_train(start, end);
    if (p == NULL) {
        printf("No available trains.\n");
        return;
    }

    printf("Choose a train (ID: %s, departure: %s, arrival: %s, price: %.2lf, tickets: %d):\n",
           p->id, p->departure, p->arrival, p->price, p->tickets);

    char choice;
    printf("Book a ticket (Y/N)? ");
    scanf(" %c", &choice);
    if (choice == 'Y' || choice == 'y') {
        if (p->tickets > 0) {
            char name[20], seat[5];
            printf("Enter your name: ");
            scanf("%s", name);
            printf("Choose a seat number (e.g., 6C): ");
            scanf("%s", seat);

            book_train(p, name, seat);
            printf("Booked successfully. Your order ID is %s.\n", orders_head->id);
        } else {
            printf("No available tickets.\n");
        }
    }
}