这是一个学校羽毛球场的预约系统。该羽毛球场共有8片场地,基本预约单元为一个小时。周一到周五下午3点到9点(除去周一、三、五下午5点到8点为教工羽协活动时间不可)可预约,周六日上午9点到下午9点均可预约。时间可直接从电脑获取。不要所有场地都是空的,随机安排一些场地已经被预约了。
遇到的问题是下图,无法显示今天的场地信息,可预约时间也没有按要求显示,猜测可能是void generate_court_availability() 和print_court_availability()出了问题
另外希望能加上过了时间就不能预订之前的场地的功能

#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;
}