C语言实现火车票订票管理(附带源码)

C 语言实现火车票订票管理系统 —— 项目介绍与实现详解

一、项目背景与简介

火车票订票管理系统是一个常见的计算机应用程序,它用于模拟火车票的查询、预订和管理。随着信息化的发展,传统的人工售票模式逐渐被计算机自动化系统所取代。一个完善的火车票管理系统可以大大提高售票效率,并且能够减少人工错误。

本项目的目标是使用 C 语言实现一个简易的火车票订票管理系统,用户可以查询车票、订票、退票等操作。系统还应具备对火车票信息(如车次、日期、座位数等)的管理功能,能够动态更新座位状态,支持用户的基本操作,如查询、预订、退票等。

项目功能需求:

  1. 车票查询:查询指定日期的车次信息,包括车次号、出发站、到达站、剩余座位等信息。
  2. 车票预订:用户可以根据车次信息选择座位进行预订。
  3. 车票退订:用户可以取消已经预订的车票,恢复座位的可用状态。
  4. 显示车次信息:显示所有车次的详细信息,包括车次号、出发时间、剩余座位等。
  5. 数据存储:通过文件将车票信息保存到磁盘,程序退出时保存数据,下次启动时读取数据。

本项目的核心是通过 C 语言实现一个基于命令行的简易车票订票管理系统,使用数组和结构体来管理车票信息,并利用文件操作进行数据存储。

二、项目实现思路

1. 数据结构设计

我们需要定义一些数据结构来表示车票信息、车次信息和用户信息。结构体是实现这些功能的核心部分。

  • 车次信息结构体(Train): 每个车次包括车次号、出发站、到达站、出发时间、座位数等信息。

  • 用户信息结构体(Ticket): 用户预订的票包括车次号、座位号、用户姓名等信息。

  • 座位管理: 为了模拟火车座位的预订,我们需要设置座位数组来管理每个车次的座位情况。每个座位可以用一个字符或整数来表示是否已被预订(如 0 表示未预订,1 表示已预订)。

2. 车票管理功能

系统的功能主要包括:

  • 车票查询:根据日期和车次查询票务信息。
  • 车票预订:用户选择座位并进行预订,系统更新座位信息。
  • 车票退订:用户取消已预订的车票,恢复座位信息。
  • 显示所有车次信息:显示所有车次的出发时间、余票等信息。

3. 文件操作

为了存储车票信息,我们需要使用文件操作:

  • 存储数据:每次修改车票信息时,将数据保存到文件中(如 train_data.dat 文件)。
  • 读取数据:每次启动系统时,从文件中读取数据,以便加载车次和座位信息。

4. 用户交互

系统通过命令行进行交互,用户通过输入操作选项来查询、预订、退订车票等。系统会根据用户输入的指令进行相应操作,并提供反馈。

5. 主程序流程

系统的主流程包括:

  1. 显示主菜单,提示用户选择操作。
  2. 根据用户选择调用相应的功能(查询、预订、退订、退出等)。
  3. 每次操作后更新座位状态,并显示操作结果。
  4. 在程序退出时保存数据。

三、项目完整代码

以下是实现“火车票订票管理系统”的 C 语言代码,代码中已包含详细注释,帮助理解每个模块的作用。

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

#define MAX_TRAINS 5
#define MAX_SEATS 10

// 车次信息结构体
typedef struct {
    int trainNo;              // 车次号
    char departure[30];       // 出发站
    char destination[30];     // 目的站
    char departureTime[20];   // 出发时间
    int availableSeats[MAX_SEATS];  // 座位情况:0 表示空座,1 表示已预订
} Train;

// 用户信息结构体
typedef struct {
    int trainNo;              // 车次号
    int seatNo;               // 座位号
    char name[50];            // 用户姓名
} Ticket;

// 存储车次信息和用户信息的数组
Train trains[MAX_TRAINS];
Ticket tickets[MAX_TRAINS * MAX_SEATS];
int ticketCount = 0;  // 当前已预订的票数

// 函数声明
void loadData();
void saveData();
void displayTrains();
void bookTicket();
void cancelTicket();
int findTrainByNo(int trainNo);
void displayTicketInfo();

int main() {
    int choice;

    loadData();  // 加载数据

    while (1) {
        // 主菜单
        printf("\n==== 火车票订票管理系统 ====\n");
        printf("1. 查询车次信息\n");
        printf("2. 预订车票\n");
        printf("3. 退订车票\n");
        printf("4. 查看已预订票信息\n");
        printf("5. 退出系统\n");
        printf("请选择操作: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                displayTrains();
                break;
            case 2:
                bookTicket();
                break;
            case 3:
                cancelTicket();
                break;
            case 4:
                displayTicketInfo();
                break;
            case 5:
                saveData();  // 保存数据
                printf("退出系统,谢谢使用!\n");
                return 0;
            default:
                printf("无效选择,请重新输入!\n");
        }
    }

    return 0;
}

// 加载数据
void loadData() {
    FILE *file = fopen("train_data.dat", "rb");
    if (file == NULL) {
        printf("没有找到数据文件,系统将从头开始。\n");
        return;
    }

    // 读取车次数据
    fread(trains, sizeof(Train), MAX_TRAINS, file);
    // 读取票务数据
    fread(tickets, sizeof(Ticket), MAX_TRAINS * MAX_SEATS, file);

    fclose(file);
}

// 保存数据
void saveData() {
    FILE *file = fopen("train_data.dat", "wb");
    if (file == NULL) {
        printf("保存数据失败!\n");
        return;
    }

    // 保存车次数据
    fwrite(trains, sizeof(Train), MAX_TRAINS, file);
    // 保存票务数据
    fwrite(tickets, sizeof(Ticket), ticketCount, file);

    fclose(file);
}

// 显示所有车次信息
void displayTrains() {
    printf("\n===== 车次信息 =====\n");
    for (int i = 0; i < MAX_TRAINS; i++) {
        printf("车次号: %d, 出发站: %s, 目的站: %s, 出发时间: %s\n", 
            trains[i].trainNo, trains[i].departure, trains[i].destination, trains[i].departureTime);
        printf("剩余座位: ");
        for (int j = 0; j < MAX_SEATS; j++) {
            printf("%d ", trains[i].availableSeats[j]);
        }
        printf("\n");
    }
}

// 根据车次号查询车次
int findTrainByNo(int trainNo) {
    for (int i = 0; i < MAX_TRAINS; i++) {
        if (trains[i].trainNo == trainNo) {
            return i;  // 返回车次所在数组的索引
        }
    }
    return -1;  // 没有找到
}

// 预订车票
void bookTicket() {
    int trainNo, seatNo;
    char name[50];

    // 输入车次号
    printf("请输入车次号: ");
    scanf("%d", &trainNo);

    // 查找车次
    int trainIndex = findTrainByNo(trainNo);
    if (trainIndex == -1) {
        printf("车次不存在。\n");
        return;
    }

    // 显示车次信息
    printf("请输入预订座位号(1-%d): ", MAX_SEATS);
    scanf("%d", &seatNo);

    if (seatNo < 1 || seatNo > MAX_SEATS) {
        printf("座位号无效。\n");
        return;
    }

    // 检查该座位是否已预订
    if (trains[trainIndex].availableSeats[seatNo - 1] == 1) {
        printf("该座位已被预订,请选择其他座位。\n");
        return;
    }

    // 输入姓名
    printf("请输入您的姓名: ");
    getchar();  // 清除换行符
    fgets(name, sizeof(name), stdin);
    name[strcspn(name, "\n")] = 0;  // 去掉末尾的换行符

    // 预订座位
    trains[trainIndex].availableSeats[seatNo - 1] = 1;
    tickets[ticketCount].trainNo = trainNo;
    tickets[ticketCount].seatNo = seatNo;
    strcpy(tickets[ticketCount].name, name);
    ticketCount++;

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

// 退订车票
void cancelTicket() {
    int trainNo, seatNo;

    // 输入车次号
    printf("请输入车次号: ");
    scanf("%d", &trainNo);

    // 查找车次
    int trainIndex = findTrainByNo(trainNo);
    if (trainIndex == -1) {
        printf("车次不存在。\n");
        return;
    }

    // 输入座位号
    printf("请输入座位号: ");
    scanf("%d", &seatNo);

    if (seatNo < 1 || seatNo > MAX_SEATS) {
        printf("座位号无效。\n");
        return;
    }

    // 查找该座位是否已预订
    if (trains[trainIndex].availableSeats[seatNo - 1] == 0) {
        printf("该座位尚未预订。\n");
        return;
    }

    // 退订座位
    trains[trainIndex].availableSeats[seatNo - 1] = 0;
    printf("车票退订成功!\n");
}

// 查看已预订票信息
void displayTicketInfo() {
    if (ticketCount == 0) {
        printf("没有已预订的票。\n");
        return;
    }

    printf("\n===== 已预订票信息 =====\n");
    for (int i = 0; i < ticketCount; i++) {
        printf("车次号: %d, 座位号: %d, 姓名: %s\n", 
            tickets[i].trainNo, tickets[i].seatNo, tickets[i].name);
    }
}

五、代码解读

1. 车次信息结构体:

typedef struct {
    int trainNo;  // 车次号
    char departure[30];  // 出发站
    char destination[30];  // 目的站
    char departureTime[20];  // 出发时间
    int availableSeats[MAX_SEATS];  // 座位情况
} Train;
  • Train 结构体存储了每个车次的信息,包括车次号、出发站、到达站、出发时间以及座位的情况(用数组 availableSeats 表示,0 表示空座,1 表示已预订)。

2. 票务信息结构体:

typedef struct {
    int trainNo;  // 车次号
    int seatNo;   // 座位号
    char name[50];  // 用户姓名
} Ticket;
  • Ticket 结构体存储了每张票的详细信息,包括车次号、座位号和用户姓名。

3. 数据加载与保存:

  • loadDatasaveData 函数负责从文件读取和写入数据。程序启动时,调用 loadData 函数加载已保存的车票和车次信息。退出时,调用 saveData 函数将数据保存到文件。

4. 车票管理:

  • 预订车票:通过用户输入车次号和座位号进行车票预订。程序检查该座位是否已预订,并记录用户信息。
  • 退订车票:用户输入车次号和座位号后,程序检查该座位是否已预订,并允许用户取消预订。
  • 查询车票信息:程序显示所有已预订的车票信息,包括车次号、座位号和用户姓名。

5. 主程序流程:

  • 主程序展示了一个简单的命令行菜单,用户可以根据菜单选择不同的操作(查询、预订、退订车票等)。

六、项目总结

1. 项目亮点

  • 文件存储功能:通过文件操作实现数据的持久化,保证了数据不会丢失。
  • 座位管理:通过座位数组有效管理每个车次的座位情况,避免了重复预订。
  • 简洁高效:整个系统通过命令行输入进行交互,界面简单,操作直观,适合初学者进行编程练习。

2. 项目收获

  • C 语言基本语法:通过编写此项目,我们加深了对 C 语言数组、结构体、文件操作等基本语法的理解和应用。
  • 系统设计思维:我们学习了如何设计一个简单的管理系统,包括数据存储、用户交互、功能实现等。
  • 文件操作:通过实现数据的读取与写入,我们掌握了文件操作的基本方法,为将来更复杂的应用开发提供了基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值