大一c语言,头又秃了

这是一个学校羽毛球场的预约系统。该羽毛球场共有8片场地,基本预约单元为一个小时。周一到周五下午3点到9点(除去周一、三、五下午5点到8点为教工羽协活动时间不可)可预约,周六日上午9点到下午9点均可预约。时间可直接从电脑获取。不要所有场地都是空的,随机安排一些场地已经被预约了。

遇到的问题是下图,无法显示今天的场地信息,可预约时间也没有按要求显示,猜测可能是void generate_court_availability() 和print_court_availability()出了问题

另外希望能加上过了时间就不能预订之前的场地的功能

img

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

typedef struct User {
    char id[20];
    char name[20];
    char phone[20];
} User;

typedef struct Reservation {
    char id[20];
    char phone[20];
    int day;
    int hour;
    int court;
} Reservation;

int get_weekday() {
    time_t t = time(NULL);
    struct tm tm = *localtime(&t);
    return (tm.tm_wday + 6) % 7;
}

void generate_court_availability(int courts[][3][8][4]) {
    srand(time(NULL));
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 8; j++) {
            for (int k = 0; k < 4; k++) {
                courts[get_weekday()][i][j][k] = rand() % 2;
                courts[(get_weekday() + 1) % 7][i][j][k] = rand() % 2;
                courts[(get_weekday() + 2) % 7][i][j][k] = rand() % 2;
            }
        }
    }
}

int is_valid_hour(int day, int hour) {
    if (day == 1 || day == 3 || day == 5) {
        if (hour >= 15 && hour < 17 || hour >= 20 && hour < 21) {
            return 1;
        }
    } else if (day >= 1 && day <= 5) {
        if (hour >= 15 && hour < 21) {
            return 1;
        }
    } else if (day == 6 || day == 7) {
        if (hour >= 9 && hour < 21) {
            return 1;
        }
    }
    return 0;
}

void print_court_availability(int courts[][3][8][4], int day) {
    printf("场地信息(今天/明天/后天):\n");
    for (int i = 0; i < 8; i++) {
        printf("场地%d: ", i + 1);
        for (int j = 0; j < 4; j++) {
            if (is_valid_hour(day, j + 15)) {
                printf("%d时-%d时: %s | ", j + 15, j + 16, courts[day][get_weekday()][i][j] ? "已约" : "未约");
            }
        }
        printf("\n");
    }
}


void save_reservation(Reservation *res) {
    FILE *file = fopen("reservations.txt", "a");
    if (file == NULL) {
        printf("无法打开文件\n");
        return;
    }
    fprintf(file, "%s,%s,%d,%d,%d\n", res->id, res->phone, res->day, res->hour, res->court);
    fclose(file);
}

void login(User *user) {
    printf("请输入工号/学号:");
    scanf("%s", user->id);
    printf("请输入姓名:");
    scanf("%s", user->name);
    printf("请输入联系电话:");
    scanf("%s", user->phone);
}

void reserve_court(User *user, int courts[][3][8][4], int day) {
    int court, hour;
    print_court_availability(courts, day);

    printf("请输入要预约的场地(1-8):");
    scanf("%d", &court);
    printf("请输入要预约的小时(例如:15-16, 输入15):");
    scanf("%d", &hour);

    if (day >= 0 && day <= 2 && court >= 1 && court <= 8 && is_valid_hour(get_weekday() + day, hour)) {
        if (courts[day][get_weekday() + day][court - 1][hour - (day == 6 || day == 7 ? 9 : 15)] == 0) {
            courts[day][get_weekday() + day][court - 1][hour - (day == 6 || day == 7 ? 9 : 15)] = 1;
            Reservation res;
            strcpy(res.id, user->id);
            strcpy(res.phone, user->phone);
            res.day = day;
            res.hour = hour;
            res.court = court;
            save_reservation(&res);
            printf("预约成功!\n");
        } else {
            printf("场地已被预约,请重新选择。\n");
        }
    } else {
        printf("输入无效,请重新输入。\n");
    }
}

void cancel_reservation(User *user, int courts[][3][8][4], int day) {
    int court, hour;
    printf("请输入要取消预约的场地(1-8):");
    scanf("%d", &court);
    printf("请输入要取消预约的小时(例如:15-16, 输入15):");
    scanf("%d", &hour);

    if (day >= 0 && day <= 2 && court >= 1 && court <= 8 && is_valid_hour(get_weekday() + day, hour)) {
        if (courts[day][get_weekday() + day][court - 1][hour - (day == 6 || day == 7 ? 9 : 15)] == 1) {
            courts[day][get_weekday() + day][court - 1][hour - (day == 6 || day == 7 ? 9 : 15)] = 0;
            printf("取消预约成功!\n");
        } else {
            printf("场地未被预约,无需取消。\n");
        }
    } else {
        printf("输入无效,请重新输入。\n");
    }
}

int main() {
    User user;
    int courts[3][7][8][4];
    generate_court_availability(courts);

    printf("欢迎使用羽毛球场预约系统!\n");
    login(&user);

    int choice, day;
    while (1) {
        printf("\n请选择操作:\n");
        printf("1. 预约场地\n");
        printf("2. 查询信息\n");
        printf("3. 取消预约\n");
        printf("4. 退出\n");
        printf("请输入选项(1-4):");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                printf("请选择预约日期(0:今天,1:明天,2:后天):");
                scanf("%d", &day);
                reserve_court(&user, courts, day);
                break;
            case 2:
                printf("请选择查询日期(0:今天,1:明天,2:后天):");
                scanf("%d", &day);
                print_court_availability(courts, day);
                break;
            case 3:
                printf("请选择取消预约的日期(0:今天,1:明天,2:后天):");
                scanf("%d", &day);
                cancel_reservation(&user, courts, day);
                break;
            case 4:
                printf("感谢使用,再见!\n");
                exit(0);
            default:
                printf("输入无效,请重新输入。\n");
                break;
        }
    }

    return 0;
}

从你给的图看,你的程序需要做成手机app的,这个用C语言基本上也做不了啊。怎么说,你也得用Java或者Swift之类的做,而且要有一个后台。
否则所有人在一个电脑上完成预约么

意思是控制台输出也行是吗

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7544255
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 这里需要对堆有一定的了解,堆就是一个比较特殊的完全二叉树,在最大堆里,每个节点的值都大于其左右两个孩子节点的值。这就是最大堆。反之就是最小堆。拿最大堆举例子,每次堆顶的元素值,不就是当前数列的最大吗?这不就成选择排序里的简单排序了吗?找完之后,将他和完全二叉树里最后一个结点的值进行交换,然后做一个自顶向下的自我调整,将他再次调整成一个完全二叉堆。第二次取最大的树,这时我们需要将上一次找到的结点屏蔽掉,不然会陷入一个死循环。无数次找完之后,再按层序的思想将二叉树里的数据遍历到一个数组当中,这时的数组为一个有序的数组。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 算法思想


以下是一个使用C语言设计的学校羽毛球场预约系统的示例代码。该代码实现了登录账号、录入预约人员信息、预约场地、查询信息和信息修改等功能,并将相关信息保存在文件中。

c
Copy Code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define MAX_CAPACITY 4
#define MAX_BOOKINGS 2

typedef struct {
    char id[20];
    char name[50];
    char phone[15];
} User;

typedef struct {
    int courtNumber;
    time_t startTime;
    time_t endTime;
    User user;
} Booking;

void displayMenu() {
    printf("======== 羽毛球场预约系统 ========");
    printf("\n1. 登录账号");
    printf("\n2. 预约场地");
    printf("\n3. 查询信息");
    printf("\n4. 信息修改");
    printf("\n5. 退出\n");
}

void login(User* currentUser) {
    printf("\n请输入工号/学号: ");
    scanf("%s", currentUser->id);
    printf("请输入姓名: ");
    scanf("%s", currentUser->name);
    printf("请输入联系电话: ");
    scanf("%s", currentUser->phone);
    printf("登录成功!\n");
}

void makeBooking(Booking bookings[], int* numBookings, User currentUser) {
    if (*numBookings >= MAX_BOOKINGS) {
        printf("\n您已达到最大预约次数限制,无法继续预约。\n");
        return;
    }

    printf("\n========= 可预约场地 =========\n");
    for (int i = 0; i < 8; i++) {
        printf("场地%d:%s\n", i + 1, bookings[i].user.id[0] ? "已预约" : "未预约");
    }

    int courtNumber;
    printf("\n请选择要预约的场地: ");
    scanf("%d", &courtNumber);
    
    if (courtNumber < 1 || courtNumber > 8) {
        printf("\n无效的场地号码!\n");
        return;
    }
    
    Booking* booking = &bookings[courtNumber - 1];
    
    if (booking->user.id[0]) {
        printf("\n该场地已被预约,请选择其他场地。\n");
        return;
    }
    
    time_t currentTime = time(NULL);
    struct tm* currentTm = localtime(&currentTime);
    struct tm bookingTime = *currentTm;
    
    // 检查时间是否可预约
    if ((currentTm->tm_wday >= 1 && currentTm->tm_wday <= 5 && currentTm->tm_hour < 15)
        || (currentTm->tm_wday >= 1 && currentTm->tm_wday <= 5 && currentTm->tm_hour >= 20)
        || (currentTm->tm_wday == 1 && currentTm->tm_hour >= 17 && currentTm->tm_hour <= 19)
        || (currentTm->tm_wday == 3 && currentTm->tm_hour >= 17 && currentTm->tm_hour <= 19)
        || (currentTm->tm_wday == 5 && currentTm->tm_hour >= 17 && currentTm->tm_hour <= 19)
        || (currentTm->tm_wday >= 6 && currentTm->tm_wday <= 7 && currentTm->tm_hour < 9)
        || (currentTm->tm_wday >= 6 && currentTm->tm_wday <= 7 && currentTm->tm_hour >= 21)) {
        printf("\n当前时间不可预约场地,请选择其他时间。\n");
        return;
    }
    
    bookingTime.tm_year = currentTm->tm_year;
    bookingTime.tm_mon = currentTm->tm_mon;
    bookingTime.tm_mday = currentTm->tm_mday;
    bookingTime.tm_hour = currentTm->tm_hour + 1;
    bookingTime.tm_min = 0;
    bookingTime.tm_sec = 0;
    
    booking->courtNumber = courtNumber;
    booking->startTime = mktime(&bookingTime);
    booking->endTime = booking->startTime + 3600;
    strcpy(booking->user.id, currentUser.id);
    strcpy(booking->user.name, currentUser.name);
    strcpy(booking->user.phone, currentUser.phone);
    
    printf("\n预约成功!您的预约信息如下:\n");
    printf("场地号: %d\n", booking->courtNumber);
    printf("起始时间: %s", asctime(localtime(&booking->startTime)));
    printf("结束时间: %s", asctime(localtime(&booking->endTime)));
}

void displayBookings(Booking bookings[], int numBookings) {
    printf("\n========= 当前预约信息 =========\n");
    for (int i = 0; i < 8; i++) {
        if (bookings[i].user.id[0]) {
            printf("场地%d:%s\n", i + 1, bookings[i].user.name);
        }
    }
}

void displayAvailableCourt(Booking bookings[]) {
    printf("\n========= 可预约场地 =========\n");
    for (int i = 0; i < 8; i++) {
        if (!bookings[i].user.id[0]) {
            printf("场地%d\n", i + 1);
        }
    }
}

void searchBooking(Booking bookings[], int numBookings, User currentUser) {
    char searchKey[20];
    printf("\n请输入要查询的手机号或学号/工号: ");
    scanf("%s", searchKey);
    
    printf("\n========= 查询结果 =========\n");
    for (int i = 0; i < 8; i++) {
        Booking booking = bookings[i];
        if (strcmp(booking.user.phone, searchKey) == 0
            || strcmp(booking.user.id, searchKey) == 0) {
            printf("场地号: %d\n", booking.courtNumber);
            printf("起始时间: %s", asctime(localtime(&booking.startTime)));
            printf("结束时间: %s", asctime(localtime(&booking.endTime)));
            return;
        }
    }
    
    printf("未找到相关预约信息。\n");
}

void cancelBooking(Booking bookings[], int* numBookings, User currentUser) {
    printf("\n========= 可取消预约的场地 =========\n");
    for (int i = 0; i < 8; i++) {
        Booking booking = bookings[i];
        if (strcmp(booking.user.id, currentUser.id) == 0) {
            printf("场地%d\n", booking.courtNumber);
        }
    }
    
    int courtNumber;
    printf("\n请选择要取消的场地: ");
    scanf("%d", &courtNumber);
    
    if (courtNumber < 1 || courtNumber > 8) {
        printf("\n无效的场地号码!\n");
        return;
    }
    
    Booking* booking = &bookings[courtNumber - 1];
    
    if (strcmp(booking->user.id, currentUser.id) != 0) {
        printf("\n您没有预约该场地,无法取消预约。\n");
        return;
    }
    
    booking->courtNumber = 0;
    booking->startTime = 0;
    booking->endTime = 0;
    strcpy(booking->user.id, "");
    strcpy(booking->user.name, "");
    strcpy(booking->user.phone, "");
    
    printf("\n预约已成功取消。\n");
}

void saveBookings(Booking bookings[]) {
    FILE* file = fopen("bookings.txt", "w");
    for (int i = 0; i < 8; i++) {
        fprintf(file, "%d,%ld,%ld,%s,%s,%s\n", bookings[i].courtNumber, bookings[i].startTime,
                bookings[i].endTime, bookings[i].user.id, bookings[i].user.name, bookings[i].user.phone);
    }
    fclose(file);
}

void loadBookings(Booking bookings[]) {
    FILE* file = fopen("bookings.txt", "r");
    if (file == NULL) {
        return;
    }
    
    char line[100];
    int index = 0;
    while (fgets(line, sizeof(line), file)) {
        sscanf(line, "%d,%ld,%ld,%[^,],%[^,],%s", &bookings[index].courtNumber, &bookings[index].startTime,
               &bookings[index].endTime, bookings[index].user.id, bookings[index].user.name, bookings[index].user.phone);
        index++;
    }
    fclose(file);
}

int main() {
    Booking bookings[8];
    int numBookings = 0;
    User currentUser;
    
    loadBookings(bookings);

    int choice;
    do {
        displayMenu();
        printf("\n请选择操作: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                login(&currentUser);
                break;
            case 2:
                makeBooking(bookings, &numBookings, currentUser);
                break;
            case 3:
                displayAvailableCourt(bookings);
                displayBookings(bookings, numBookings);
                break;
            case 4:
                searchBooking(bookings, numBookings, currentUser);
                cancelBooking(bookings, &numBookings, currentUser);
                break;
            case 5:
                saveBookings(bookings);
                printf("\n谢谢使用,再见!\n");
                break;
            default:
                printf("\n无效的选择,请重新输入。\n");
        }
    } while (choice != 5);

    return 0;
}
该代码使用结构体和数组来存储预约信息,并在预约时检查场地的可用性和时间限制。将预约信息保存在文件中,下次运行程序时可以加载之前的预约信息。通过使用菜单选择,用户可以登录账号、录入预约人员信息、预约场地、查询信息和取消预约等操作。

请注意,这只是一个简单的示例代码,可能还需要根据实际需求进行一些修改和完善。例如,可以添加错误处理、输入验证和其他功能来提高系统的稳定性和用户体验。

下面是一个简单的用C语言设计的学校羽毛球场预约系统的实现示例:

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

#define MAX_BOOKINGS 8
#define HOURS_PER_DAY 12

typedef struct {
    char id[20];
    char name[50];
    char phone[20];
} Person;

typedef struct {
    bool is_booked;
    Person* booking;
} Court;

Court courts[MAX_BOOKINGS];
char court_names[MAX_BOOKINGS][10] = {"Court1", "Court2", "Court3", "Court4",
                                      "Court5", "Court6", "Court7", "Court8"};

// Function to check if a court is available at the given hour
bool isCourtAvailable(int courtIndex, int hour) {
    if (hour >= 0 && hour < HOURS_PER_DAY) {
        return !courts[courtIndex].is_booked; // Check if court is already booked
    }
    return false;
}

// Function to reserve a court for a person
void reserveCourt(Person* person, int courtIndex) {
    if (courts[courtIndex].is_booked) {
        printf("Court %s is already booked. Please choose another court.\n", court_names[courtIndex]);
    } else {
        courts[courtIndex].is_booked = true;
        courts[courtIndex].booking = person;
        printf("Court %s has been reserved successfully.\n", court_names[courtIndex]);
    }
}

// Function to cancel a court reservation
void cancelReservation(int courtIndex) {
    courts[courtIndex].is_booked = false;
    courts[courtIndex].booking = NULL;
    printf("Reservation for Court %s has been cancelled.\n", court_names[courtIndex]);
}

// Function to display court information for a given day
void displayCourtAvailability(int day) {
    printf("Court availability for Day %d:\n", day);
    for (int i = 0; i < MAX_BOOKINGS; i++) {
        bool isBooked = courts[i].is_booked;
        Person* booking = courts[i].booking;

        if (isBooked && booking != NULL) {
            printf("%s: Booked by %s (%s)\n", court_names[i], booking->name, booking->id);
        } else {
            printf("%s: Available\n", court_names[i]);
        }
    }
}

// Function to save court bookings to a file
void saveCourtsToFile() {
    FILE *file = fopen("court_bookings.txt", "w");
    if (file == NULL) {
        printf("Failed to open file.\n");
        return;
    }

    for (int i = 0; i < MAX_BOOKINGS; i++) {
        bool isBooked = courts[i].is_booked;
        Person* booking = courts[i].booking;

        if (isBooked && booking != NULL) {
            fprintf(file, "%s:%s:%s\n", court_names[i], booking->name, booking->phone);
        }
    }

    fclose(file);
}

int main() {
    // Initialize courts as available
    for (int i = 0; i < MAX_BOOKINGS; i++) {
        courts[i].is_booked = false;
        courts[i].booking = NULL;
    }

    int choice, hour, courtIndex;
    Person loggedInUser;
    bool isLoggedIn = false;

    do {
        printf("\n------- School Badminton Court Reservation System -------\n");
        printf("1. Login\n");
        printf("2. Reserve Court\n");
        printf("3. Cancel Reservation\n");
        printf("4. Display Court Availability\n");
        printf("5. Save Courts to File\n");
        printf("6. Exit\n");
        printf("Enter your choice: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                if (isLoggedIn) {
                    printf("You are already logged in.\n");
                } else {
                    printf("Enter your ID: ");
                    scanf("%s", loggedInUser.id);
                    printf("Enter your name: ");
                    scanf("%s", loggedInUser.name);
                    printf("Enter your phone number: ");
                    scanf("%s", loggedInUser.phone);

                    isLoggedIn = true;
                    printf("Logged in successfully.\n");
                }
                break;

            case 2:
                if (!isLoggedIn) {
                    printf("Please login first.\n");
                } else {
                    printf("Enter the hour (0-11) for reservation: ");
                    scanf("%d", &hour);

                    if (isCourtAvailable(courtIndex, hour)) {
                        printf("Available courts:\n");
                        // Display available courts
                        for (int i = 0; i < MAX_BOOKINGS; i++) {
                            if (isCourtAvailable(i, hour)) {
                                printf("%d. %s\n", i + 1, court_names[i]);
                            }
                        }

                        printf("Enter the court number for reservation: ");
                        scanf("%d", &courtIndex);
                        courtIndex--;

                        if (isCourtAvailable(courtIndex, hour)) {
                            reserveCourt(&loggedInUser, courtIndex);
                        } else {
                            printf("Selected court is not available. Please choose another court.\n");
                        }
                    } else {
                        printf("Selected hour is not valid or court is already booked.\n");
                    }
                }
                break;

            case 3:
                if (!isLoggedIn) {
                    printf("Please login first.\n");
                } else {
                    printf("Enter the court number for cancellation: ");
                    scanf("%d", &courtIndex);
                    courtIndex--;

                    if (courts[courtIndex].is_booked && courts[courtIndex].booking == &loggedInUser) {
                        cancelReservation(courtIndex);
                    } else {
                        printf("You don't have any reservation for this court.\n");
                    }
                }
                break;

            case 4:
                printf("Enter the day (1-3) to display court availability: ");
                scanf("%d", &hour);
                displayCourtAvailability(hour);
                break;

            case 5:
                saveCourtsToFile();
                printf("Courts saved to file successfully.\n");
                break;
        }
    } while (choice != 6);

    return 0;
}

该示例仅简单实现演示了基本功能,例如登录、预约、取消预约、显示场地信息和保存场地预约信息到文件。对于细节、错误处理或其他功能的实现,你可能需要根据实际要求进行调整和改进。

部分效果如图, 如有帮助给个采纳加关注,下个问题不迷路谢谢:

img

代码如下:

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

#define MAX_CAPACITY 4
#define MAX_COURTS 8
#define MAX_BOOKINGS 100

struct Booking {
    char id[20];
    char name[50];
    char phone[20];
    int court;
    time_t startTime;
};

struct Booking bookings[MAX_BOOKINGS];
int numBookings = 0;

void clearInputBuffer() {
    int c;
    while ((c = getchar()) != '\n' && c != EOF) {}
}

void printMenu() {
    printf("\n========== 学校羽毛球场预约系统 ==========\n");
    printf("1. 登录账号\n");
    printf("2. 预约场地\n");
    printf("3. 查询信息\n");
    printf("4. 取消预约\n");
    printf("5. 退出\n");
    printf("=======================================\n");
    printf("请选择操作(输入数字):");
}

void login() {
    char id[20], name[50], phone[20];
    
    printf("\n请输入您的账号信息:\n");
    printf("账号ID:");
    scanf("%s", id);
    clearInputBuffer();
    printf("姓名:");
    fgets(name, sizeof(name), stdin);
    name[strcspn(name, "\n")] = '\0';
    printf("联系电话:");
    scanf("%s", phone);
    clearInputBuffer();
    
    // 在此处进行账号验证逻辑,如用户名密码验证等
    
    printf("\n登录成功!\n");
}

void makeBooking() {
    int court, hour;
    time_t now = time(NULL);
    struct tm *currentTime = localtime(&now);
    int available = 1;
    
    if (currentTime->tm_wday >= 1 && currentTime->tm_wday <= 5) {
        if ((currentTime->tm_wday == 1 || currentTime->tm_wday == 3 || currentTime->tm_wday == 5)
            && currentTime->tm_hour >= 17 && currentTime->tm_hour < 20) {
            printf("\n抱歉,现在是教工羽协活动时间,不可预约。\n");
            return;
        }
        
        printf("\n请输入预约时间(小时):");
        scanf("%d", &hour);
        clearInputBuffer();
        
        if (hour < 15 || hour > 21) {
            printf("\n抱歉,该时间段不可预约。\n");
            return;
        }
        
        printf("\n========== 场地列表 ==========\n");
        printf("场地编号  场地状态\n");
        for (int i = 1; i <= MAX_COURTS; i++) {
            available = 1;
            for (int j = 0; j < numBookings; j++) {
                if (bookings[j].court == i && difftime(now, bookings[j].startTime) < 3600) {
                    available = 0;
                    break;
                }
            }
            printf("%d        %s\n", i, available ? "空闲" : "已被预约");
        }
        printf("==============================\n");
        
        printf("\n请输入预约场地编号:");
        scanf("%d", &court);
        clearInputBuffer();
        
        if (court < 1 || court > MAX_COURTS || !available) {
            printf("\n抱歉,该场地已被预约或不存在。\n");
            return;
        }
        
        struct Booking newBooking;
        strcpy(newBooking.id, "123"); // 这里假设预约人员的ID是固定的
        strcpy(newBooking.name, "张三"); // 这里假设预约人员的姓名是固定的
        strcpy(newBooking.phone, "123456789"); // 这里假设预约人员的联系电话是固定的
        newBooking.court = court;
        newBooking.startTime = now;
        
        bookings[numBookings++] = newBooking;
        
        printf("\n预约成功!\n");
    } else {
        printf("\n抱歉,周末才可预约。\n");
    }
}

void queryInfo() {
    time_t now = time(NULL);
    
    printf("\n========== 场地信息查询 ==========\n");
    printf("1. 今天\n");
    printf("2. 明天\n");
    printf("3. 后天\n");
    printf("4. 取消\n");
    printf("=================================\n");
    printf("请选择查询日期(输入数字):");
    
    int choice;
    scanf("%d", &choice);
    clearInputBuffer();
    
    if (choice >= 1 && choice <= 3) {
        printf("\n========== 场地列表 ==========\n");
        printf("场地编号  场地状态\n");
        for (int i = 1; i <= MAX_COURTS; i++) {
            int available = 1;
            for (int j = 0; j < numBookings; j++) {
                int diffDays = difftime(now, bookings[j].startTime) / (24 * 3600);
                if (bookings[j].court == i && diffDays >= choice && diffDays < choice + 1) {
                    available = 0;
                    break;
                }
            }
            printf("%d        %s\n", i, available ? "空闲" : "已被预约");
        }
        printf("==============================\n");
    } else if (choice == 4) {
        return;
    } else {
        printf("\n错误的选择,请重新输入。\n");
        queryInfo();
    }
}

void cancelBooking() {
    char phone[20], id[20];
    
    printf("\n请输入您的账号信息:\n");
    printf("账号ID:");
    scanf("%s", id);
    clearInputBuffer();
    printf("联系电话:");
    scanf("%s", phone);
    clearInputBuffer();
    
    int found = 0;
    for (int i = 0; i < numBookings; i++) {
        if (strcmp(bookings[i].id, id) == 0 && strcmp(bookings[i].phone, phone) == 0) {
            found = 1;
            
            // 在此处执行取消预约的逻辑
            
            printf("\n取消预约成功!\n");
            break;
        }
    }
    
    if (!found) {
        printf("\n未找到该预约记录,请确认您的账号信息。\n");
    }
}

int main() {
    int choice;
    
    do {
        printMenu();
        scanf("%d", &choice);
        clearInputBuffer();
        
        switch (choice) {
            case 1:
                login();
                break;
            case 2:
                makeBooking();
                break;
            case 3:
                queryInfo();
                break;
            case 4:
                cancelBooking();
                break;
            case 5:
                printf("\n感谢使用!再见!\n");
                break;
            default:
                printf("\n错误的选择,请重新输入。\n");
                break;
        }
    } while (choice != 5);
    
    return 0;
}