fperson.reservation
user_6919294
c_cpp
a year ago
10 kB
9
Indexable
/* CODE BY FPERSON
A comprehensive conference room reservation management system.
Main functionalities:
- Managing multiple conference rooms
- Checking for time conflicts
- Adding new reservations
- Displaying schedule for each room
System includes the following constraints and features:
- Reservations available between 8-20 hours
- Automatic sorting of reservations by time
- Conflict checking before adding new reservations
- Clear schedule display
------------------------------------------------------------
Added new functionalities:
Reservation removal:
- removeReservation method allows removing a reservation based on client name, date, and start time
- System confirms deletion or notifies if reservation not found
Finding available time slots:
- findAvailableSlots method finds all available time slots for a given day
- Shows available times for each room separately
- Takes into account working hours (8-20)
Notification system:
- checkUpcomingReservations method checks for upcoming reservations
- Sends notification one hour before reservation starts
- Notification time can be easily modified
Additional improvements:
- Date handling in reservations
- Better reservation sorting (first by date, then by time)
- Extended schedule display with dates
- More detailed user messages
*/
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iomanip>
#include <ctime>
#include <chrono>
using namespace std;
// Structure storing reservation information
struct Reservation {
string clientName;
int startTime;
int endTime;
string purpose;
time_t date; // Reservation date
};
// Structure representing an available time slot
struct TimeSlot {
int startTime;
int endTime;
};
// Class representing a conference room
class ConferenceRoom {
private:
string name;
int capacity;
vector<Reservation> reservations;
// Helper method for date to string conversion
string dateToString(time_t date) const {
char buffer[26];
strftime(buffer, 26, "%Y-%m-%d", localtime(&date));
return string(buffer);
}
public:
ConferenceRoom(string n, int c) : name(n), capacity(c) {}
// Checks for conflicts with existing reservations
bool hasConflict(int start, int end, time_t date) const {
for (const auto& res : reservations) {
if (res.date == date) {
if ((start >= res.startTime && start < res.endTime) ||
(end > res.startTime && end <= res.endTime) ||
(start <= res.startTime && end >= res.endTime)) {
return true;
}
}
}
return false;
}
// Adds a new reservation
bool addReservation(const string& client, int start, int end,
const string& purpose, time_t date) {
if (start >= end || start < 8 || end > 20) {
cout << "Error: Invalid reservation hours (available 8-20)" << endl;
return false;
}
if (hasConflict(start, end, date)) {
cout << "Error: Conflict with existing reservation" << endl;
return false;
}
Reservation newReservation{client, start, end, purpose, date};
reservations.push_back(newReservation);
sort(reservations.begin(), reservations.end(),
[](const Reservation& a, const Reservation& b) {
return (a.date < b.date) ||
(a.date == b.date && a.startTime < b.startTime);
});
return true;
}
// Removes a reservation
bool removeReservation(const string& client, time_t date, int startTime) {
auto it = find_if(reservations.begin(), reservations.end(),
[&](const Reservation& res) {
return res.clientName == client &&
res.date == date &&
res.startTime == startTime;
});
if (it != reservations.end()) {
reservations.erase(it);
cout << "Reservation has been removed" << endl;
return true;
}
cout << "Reservation not found" << endl;
return false;
}
// Finds available time slots for a given day
vector<TimeSlot> findAvailableSlots(time_t date) const {
vector<TimeSlot> availableSlots;
vector<int> busyTimes;
// Add all occupied hours
for (const auto& res : reservations) {
if (res.date == date) {
for (int i = res.startTime; i < res.endTime; i++) {
busyTimes.push_back(i);
}
}
}
// Find available slots
int currentTime = 8;
while (currentTime < 20) {
if (find(busyTimes.begin(), busyTimes.end(), currentTime) == busyTimes.end()) {
int startSlot = currentTime;
while (currentTime < 20 &&
find(busyTimes.begin(), busyTimes.end(), currentTime) == busyTimes.end()) {
currentTime++;
}
availableSlots.push_back({startSlot, currentTime});
} else {
currentTime++;
}
}
return availableSlots;
}
// Checks for upcoming reservations and sends notifications
void checkUpcomingReservations() const {
time_t now = time(nullptr);
for (const auto& res : reservations) {
// Check today's reservations
if (res.date == now) {
time_t currentHour = localtime(&now)->tm_hour;
if (res.startTime - currentHour <= 1 && res.startTime - currentHour > 0) {
cout << "NOTIFICATION: Upcoming reservation for " << res.clientName
<< " in room " << name << " at " << res.startTime << ":00" << endl;
}
}
}
}
// Displays reservation schedule
void displaySchedule() const {
cout << "\nSchedule for room: " << name << " (Capacity: " << capacity << " people)" << endl;
cout << string(70, '-') << endl;
cout << setw(15) << "Date" << setw(15) << "Hours" << setw(15)
<< "Client" << setw(25) << "Purpose" << endl;
cout << string(70, '-') << endl;
for (const auto& res : reservations) {
cout << setw(15) << dateToString(res.date)
<< setw(5) << res.startTime << "-" << setw(8) << res.endTime
<< setw(15) << res.clientName << setw(25) << res.purpose << endl;
}
cout << string(70, '-') << endl;
}
string getName() const { return name; }
};
// Class managing all rooms
class ReservationSystem {
private:
vector<ConferenceRoom> rooms;
public:
// Adds a new room to the system
void addRoom(const string& name, int capacity) {
rooms.emplace_back(name, capacity);
}
// Adds a reservation to selected room
bool addReservation(const string& roomName, const string& client,
int start, int end, const string& purpose, time_t date) {
for (auto& room : rooms) {
if (room.getName() == roomName) {
return room.addReservation(client, start, end, purpose, date);
}
}
cout << "Error: Room " << roomName << " not found" << endl;
return false;
}
// Removes a reservation from selected room
bool removeReservation(const string& roomName, const string& client,
time_t date, int startTime) {
for (auto& room : rooms) {
if (room.getName() == roomName) {
return room.removeReservation(client, date, startTime);
}
}
cout << "Error: Room " << roomName << " not found" << endl;
return false;
}
// Finds available slots in all rooms
void findAvailableSlots(time_t date) const {
cout << "\nAvailable slots for "
<< put_time(localtime(&date), "%Y-%m-%d") << ":" << endl;
for (const auto& room : rooms) {
cout << "\nRoom " << room.getName() << ":" << endl;
auto slots = room.findAvailableSlots(date);
if (slots.empty()) {
cout << "No available slots" << endl;
} else {
for (const auto& slot : slots) {
cout << slot.startTime << ":00 - " << slot.endTime << ":00" << endl;
}
}
}
}
// Checks all upcoming reservations
void checkAllUpcomingReservations() const {
for (const auto& room : rooms) {
room.checkUpcomingReservations();
}
}
// Displays schedule for all rooms
void displayAllSchedules() const {
for (const auto& room : rooms) {
room.displaySchedule();
cout << endl;
}
}
};
int main() {
ReservationSystem system;
// Add example rooms
system.addRoom("Room A", 10);
system.addRoom("Room B", 20);
system.addRoom("Room C", 30);
// Set example dates
time_t now = time(nullptr);
time_t tomorrow = now + 24*60*60;
// Example reservations
system.addReservation("Room A", "John Smith", 9, 11, "Team meeting", now);
system.addReservation("Room A", "Anna Wilson", 14, 16, "Training", now);
system.addReservation("Room B", "Peter Brown", 10, 12, "Presentation", now);
// Display schedule
system.displayAllSchedules();
// Find available slots for today
system.findAvailableSlots(now);
// Remove a reservation
system.removeReservation("Room A", "John Smith", now, 9);
// Check upcoming reservations
system.checkAllUpcomingReservations();
return 0;
}Editor is loading...
Leave a Comment