// // bank teller simulation routine // // Described in Chapter 10 of // Data Structures in C++ using the STL // Published by Addison-Wesley, 1997 // Written by Tim Budd, budd@cs.orst.edu // Oregon State University // # include # include # include # include // // class Customer // a single customer waiting in the bank teller line class randomInteger { public: unsigned int operator () (unsigned int); }; unsigned int randomInteger::operator () (unsigned int max) { // rand return random integer // convert to unsigned to make positive // take remainder to put in range unsigned int rval = rand(); return rval % max; } randomInteger randomizer; class Customer { public: // constructors Customer (int at) : arrivalTime(at), processTime(2 + randomizer(6)) {} Customer () : arrivalTime(0), processTime(0) { } // operations bool done () { return --processTime < 0; } int arrival () { return arrivalTime; } operator < (Customer & c) // order by arrival time { return arrivalTime < c.arrivalTime; } operator == (Customer & c) // no two customers are alike { return false; } protected: unsigned int arrivalTime; unsigned int processTime; }; // // class Teller // a teller servicing customers in a bank teller line class Teller { public: Teller() { free = true; } bool isFree() // see if teller is free to work { if (free) return true; if (customer.done()) free = true; return free; } void addCustomer(Customer & c) // start servicing customer { customer = c; free = false; } protected: bool free; Customer customer; }; void main() { int numberOfTellers = 5; int numberOfMinutes = 60; double totalWait = 0; int numberOfCustomers = 0; vector < Teller > teller(numberOfTellers); queue < list< Customer > > line; for (int time = 0; time < numberOfMinutes; time++) { if (randomizer(10) < 9) { Customer newCustomer(time); line.push(newCustomer); } for (int i = 0; i < numberOfTellers; i++) { if (teller[i].isFree() & ! line.empty()) { Customer frontCustomer = line.front(); numberOfCustomers++; totalWait += (time - frontCustomer.arrival()); teller[i].addCustomer(frontCustomer); line.pop(); } } } cout << "average wait:" << (totalWait / numberOfCustomers) << endl; }