这是一个学校羽毛球场的预约系统。该羽毛球场共有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;
}
从你给的图看,你的程序需要做成手机app的,这个用C语言基本上也做不了啊。怎么说,你也得用Java或者Swift之类的做,而且要有一个后台。
否则所有人在一个电脑上完成预约么
意思是控制台输出也行是吗
以下是一个使用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(¤tTime);
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(¤tUser);
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;
}
该示例仅简单实现演示了基本功能,例如登录、预约、取消预约、显示场地信息和保存场地预约信息到文件。对于细节、错误处理或其他功能的实现,你可能需要根据实际要求进行调整和改进。
部分效果如图, 如有帮助给个采纳加关注,下个问题不迷路谢谢:
代码如下:
#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;
}