#include "stdstuff.h" #include "Date.h" struct Reservation { String2002 name; Date arrivalDate, departureDate; }; void makeReservation (Reservation reservations[], int &actualReservations, const String2002 &name, const Date &arrivalDate, Date &departureDate) { int nights, i, conflicts; double cost; // make sure that dates are reasonable nights = departureDate.daysAfter(arrivalDate); if (nights < 1) { cout << "Departure date must be after arrival date.\n"; return; } // if stay too long, adjust departure date if (nights > 30) { departureDate = arrivalDate; departureDate.move(30); cout << "Maximum stay is 30 nights. Departure date changed to "; departureDate.write(cout); cout << ".\n"; nights = 30; } // check for conflicts with previous reservations conflicts = 0; for (i = 0; i < actualReservations; i++) { if ( (departureDate.compareTo(reservations[i].arrivalDate) > 0) && (arrivalDate.compareTo(reservations[i].departureDate) < 0 ) ) { cout << "There is a conflict with a previous reservation for " << reservations[i].name << ".\n"; conflicts++; } } if (conflicts != 0) return; // compute cost if ((arrivalDate.dayInWeek() % 7) + nights > 6) { // stay includes a Saturday night cost = nights * 150.56; } else { cost = nights * 204.34; } // make reservation reservations[actualReservations].name = name; reservations[actualReservations].arrivalDate = arrivalDate; reservations[actualReservations++].departureDate = departureDate; cout << "Reservation made for " << name << ".\n" << setiosflags (ios::fixed | ios::showpoint) << setprecision(2) << "The cost is $" << cost << ".\n"; } void listMatchingReservations (Reservation reservations[], int actualReservations, const String2002 &name) { int i, hits = 0; for (i = 0; i < actualReservations; i++) { if (name == "*" || reservations[i].name.find(name) != String2002::npos) { cout << "Name: " << reservations[i].name << endl << "Arrival Date: "; reservations[i].arrivalDate.write(cout); cout << " Departure Date: "; reservations[i].departureDate.write(cout); cout << endl; hits++; } } if (hits == 0) { cout << "No reservations match the search criteria.\n"; } } int main () { const int MAXRESERVATIONS = 100, NAMEBUFFERSIZE = 100; char nameBuffer[NAMEBUFFERSIZE]; Reservation reservations[MAXRESERVATIONS]; int actualReservations = 0, option; Date arrivalDate, departureDate; String2002 name; for (;;) { // get an option for (;;) { cout << "\nPlease enter option\n" << " 1 Make reservation\n" << " 2 Look for reservation\n" << " 3 Stop program\n" << "Option: "; cin >> option; cin.get(); // remove '\n' from cin if (!cin.fail()) break; cin.clear(); cin.ignore(INT_MAX, '\n'); cout << "** Invalid option rejected **\n"; } // apply option switch (option) { case 1: if (actualReservations == MAXRESERVATIONS) { cout << "Max number of reservations reached.\n"; break; } // obtain reservation data for (;;) { cout << "Please enter name: "; getline(cin, name); cout << "Please enter arrival date (d m y): "; arrivalDate.read(cin); cout << "Plese enter departure date (d m y): "; departureDate.read(cin); if (!cin.fail()) break; cin.clear(); cin.ignore(INT_MAX, '\n'); cout << "** Invalid data rejected **\n"; } makeReservation (reservations, actualReservations, name, arrivalDate, departureDate); break; case 2: cout << "Please enter all or part of name (or *): "; getline(cin, name); listMatchingReservations (reservations, actualReservations, name); break; case 3: pause(); return 0; default: cout << "Illegal option ignored.\n"; } } }