controlCpp 2023-06-22 20:22 采纳率: 28.6%
浏览 129
已结题

大一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;
}

  • 写回答

6条回答 默认 最新

  • threenewbee 2023-06-22 20:35
    关注

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

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月23日
  • 修改了问题 6月22日
  • 修改了问题 6月22日
  • 创建了问题 6月22日