weixin_44785119 2019-06-18 22:13 采纳率: 0%
浏览 716

飞机订票系统(数据结构课设论文)

1、创建一个数组,指定所有的座位,4*20个座位,0和3为靠窗,1和2为过道和一条链表记录所有已售机票(5分)
2、选座系统,打印出所有的座位,已选的和未选的(8分)
3、登录窗口分为管理员(机票的登记,座位状态修改)和用户(查看自己机票信息)(10分)
4、数据进行文件保存,每次打开读取上次保存的数据(5分)

  • 写回答

1条回答

  • 芣苢的成长之路 2023-06-27 12:14
    关注
    
    #include <stdio.h>
    #include <stdlib.h>
    
    #define ROWS 4
    #define COLS 20
    
    int seats[ROWS][COLS]; // 0和3为靠窗,1和2为过道
    int sold_seats = 0; // 已售机票数
    
    // 定义链表节点结构体
    struct Node {
        int row;
        int col;
        struct Node *next;
    };
    
    struct Node *sold_list = NULL; // 已售机票的链表头指针
    
    // 初始化座位
    void init_seats() {
        for (int i = 0; i < ROWS; i++) {
            for (int j = 0; j < COLS; j++) {
                if (j == 0 || j == COLS - 1) {
                    seats[i][j] = (i == 0 || i == ROWS - 1) ? 0 : 3; // 靠窗
                } else {
                    seats[i][j] = (i == 1 || i == 2) ? 1 : 2; // 过道
                }
            }
        }
    }
    
    // 添加已售机票到链表中
    void add_sold_seat(int row, int col) {
        struct Node *p = (struct Node *)malloc(sizeof(struct Node));
        p->row = row;
        p->col = col;
        p->next = sold_list;
        sold_list = p;
        sold_seats++;
    }
    
    // 删除已售机票链表中的指定节点
    void delete_sold_seat(int row, int col) {
        struct Node *p = sold_list;
        struct Node *prev = NULL;
        while (p != NULL) {
            if (p->row == row && p->col == col) {
                if (prev == NULL) {
                    sold_list = p->next;
                } else {
                    prev->next = p->next;
                }
                free(p);
                sold_seats--;
                return;
            }
            prev = p;
            p = p->next;
        }
    }
    
    // 打印所有座位及其状态
    void print_seats() {
        printf("    A B C D E F G H I J K L M N O P Q R S T\n");
        for (int i = 0; i < ROWS; i++) {
            printf("%2d ", i + 1);
            for (int j = 0; j < COLS; j++) {
                if (seats[i][j] == 0) {
                    printf("X "); // 已售座位
                } else if (seats[i][j] == 3) {
                    printf("W "); // 靠窗座位
                } else {
                    printf("_ "); // 未售座位和过道座位
                }
            }
            printf("\n");
        }
    }
    
    // 选择座位
    void select_seat() {
        int row, col;
        printf("Please enter the row number: ");
        scanf("%d", &row);
        printf("Please enter the column letter (A-T): ");
        char col_letter;
        scanf(" %c", &col_letter);
        col = col_letter - 'A';
        if (row < 1 || row > ROWS || col < 0 || col >= COLS) {
            printf("Invalid seat number.\n");
            return;
        }
        if (seats[row - 1][col] == 0) {
            printf("The seat is already sold.\n");
            return;
        }
        add_sold_seat(row - 1, col);
        seats[row - 1][col] = 0;
        printf("The seat is successfully sold.\n");
    }
    
    // 取消座位
    void cancel_seat() {
        int row, col;
        printf("Please enter the row number: ");
        scanf("%d", &row);
        printf("Please enter the column letter (A-T): ");
        char col_letter;
        scanf(" %c", &col_letter);
        col = col_letter - 'A';
        if (row < 1 || row > ROWS || col < 0 || col >= COLS) {
            printf("Invalid seat number.\n");
            return;
        }
        if (seats[row - 1][col] != 0) {
            printf("Theseat is not sold.\n");
            return;
        }
        delete_sold_seat(row - 1, col);
        seats[row - 1][col] = (col == 0 || col == COLS - 1) ? 3 : 2; // 靠窗或过道
        printf("The seat is successfully canceled.\n");
    }
    
    // 登录
    void login() {
        int role;
        printf("Please choose your role:\n");
        printf("1. Administrator\n");
        printf("2. User\n");
        scanf("%d", &role);
        if (role == 1) {
            // 管理员
            int choice;
            do {
                printf("Please choose operation:\n");
                printf("1. Register ticket\n");
                printf("2. Change seat status\n");
                printf("3. Quit\n");
                scanf("%d", &choice);
                switch (choice) {
                    case 1: {
                        select_seat();
                        break;
                    }
                    case 2: {
                        cancel_seat();
                        break;
                    }
                    case 3: {
                        break;
                    }
                    default: {
                        printf("Invalid choice.\n");
                        break;
                    }
                }
                print_seats();
            } while (choice != 3);
        } else if (role == 2) {
            // 用户
            int row, col;
            printf("Please enter the row number: ");
            scanf("%d", &row);
            printf("Please enter the column letter (A-T): ");
            char col_letter;
            scanf(" %c", &col_letter);
            col = col_letter - 'A';
            if (row < 1 || row > ROWS || col < 0 || col >= COLS) {
                printf("Invalid seat number.\n");
                return;
            }
            struct Node *p = sold_list;
            while (p != NULL) {
                if (p->row == row - 1 && p->col == col) {
                    printf("You have booked this seat.\n");
                    return;
                }
                p = p->next;
            }
            printf("This seat is available.\n");
        } else {
            printf("Invalid role.\n");
        }
    }
    
    // 保存数据到文件
    void save_data() {
        FILE *fp = fopen("data.txt", "w");
        fprintf(fp, "%d\n", sold_seats);
        struct Node *p = sold_list;
        while (p != NULL) {
            fprintf(fp, "%d %d\n", p->row, p->col);
            p = p->next;
        }
        fclose(fp);
    }
    
    // 从文件中读取数据
    void load_data() {
        FILE *fp = fopen("data.txt", "r");
        if (fp == NULL) {
            return;
        }
        fscanf(fp, "%d", &sold_seats);
        for (int i = 0; i < sold_seats; i++) {
            int row, col;
            fscanf(fp, "%d %d", &row, &col);
            add_sold_seat(row, col);
            seats[row][col] = 0;
        }
        fclose(fp);
    }
    
    int main() {
        init_seats();
        load_data();
    
        int choice;
        do {
            printf("Please choose operation:\n");
            printf("1. Print seats\n");
            printf("2. Login\n");
            printf("3. Quit\n");
            scanf("%d", &choice);
            switch (choice) {
                case 1: {
                    print_seats();
                    break;
                }
                case 2: {
                    login();
                    break;
                }
                case 3: {
                    break;
                }
                default: {
                    printf("Invalid choice.\n");
                    break;
                }
            }
        } while (choice != 3);
    
        save_data();
    
        return 0;
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R
  • ¥15 在线请求openmv与pixhawk 实现实时目标跟踪的具体通讯方法
  • ¥15 八路抢答器设计出现故障
  • ¥15 opencv 无法读取视频