#include #include #include using namespace std; // -------------------------------------------------- template class Node { friend ostream &operator<<(ostream&, const *(Node)); public: T data; Node* next; Node(T d, Node* n); }; // -------------------------------------------------- template Node::Node(T d, Node* n) { data = d; next = n; } // -------------------------------------------------- // -------------------------------------------------- template class Queue { friend ostream &operator<<(ostream&, const Queue&); public: void Enqueue(T d); T Dequeue(void); bool IsEmpty(void); bool IsFull(void); ~Queue(); Queue(); private: Node* head; Node* tail; }; // -------------------------------------------------- template void Queue::Enqueue(T d) { Node* temp; temp = new Node(d, NULL); if (tail == NULL) { head = temp; tail = temp; } else { tail->next = temp; tail = temp; } } // -------------------------------------------------- template T Queue::Dequeue(void) { T rv; Node* temp; temp = head; rv = head->data; if (head == tail) tail = NULL; head = head->next; delete temp; return rv; } // -------------------------------------------------- template bool Queue::IsEmpty(void) { return (head == NULL); } // -------------------------------------------------- template bool Queue::IsFull(void) { return false; } // -------------------------------------------------- template Queue::~Queue() { while(!IsEmpty()) { Dequeue(); } } // -------------------------------------------------- template Queue::Queue() { head = NULL; tail = NULL; } // -------------------------------------------------- // -------------------------------------------------- class Job { friend ostream &operator<<(ostream&, const Job&); public: int Run(int interval); int time_required; int id; Job(int tr=0); ~Job(); private: static int id_count; }; // -------------------------------------------------- int Job::id_count = 0; // -------------------------------------------------- Job::Job(int tr) { time_required = tr; id = id_count; id_count++; cout << "Job " << id << " created" << endl; } // -------------------------------------------------- Job::~Job() { cout << "Job " << id << " completed" << endl; } // -------------------------------------------------- int Job::Run(int interval) { if (interval > time_required) { cout << "Job " << id << " runs for " << time_required << endl; time_required = 0; interval -= time_required; return interval; } cout << "Job " << id << " runs for " << interval << endl; time_required -= interval; return interval; } // -------------------------------------------------- // -------------------------------------------------- template ostream &operator<<(ostream& output, const Node *n) { if (n != NULL) output << "[" << n->data << "]-> "; else output << "||"; return output; } // -------------------------------------------------- template ostream &operator<<(ostream& output, const Queue &q) { Node* t; t = q.head; while (t != NULL) { output << t; t = t->next; } output << "||" << endl; return output; } // -------------------------------------------------- ostream &operator<<(ostream& output, const Job *j) { // output << "id: " << j->id << " needs: " << j->time_required; output << j->id; return output; } // -------------------------------------------------- void Sim(Queue &q, int JOB_NEED_MAX, int JOB_ENTER_MAX, int JOB_MAX) { int time = 0; int job_count = 0; Job* new_job = NULL; Job* current_job = NULL; int time_required; int wait_time; int enter_time; while (true) { wait_time = rand() % JOB_ENTER_MAX + 1; enter_time = time + wait_time; while (time < enter_time) { cout << "Q = " << q; if (current_job == NULL) { if (!q.IsEmpty()) { current_job = q.Dequeue(); } } if (current_job == NULL) { time += wait_time; cout << "Nothing happens for " << wait_time << endl; } else { if ((job_count == JOB_MAX) || (current_job->time_required <= wait_time)) { current_job->Run(current_job->time_required); time += current_job->time_required; if (current_job->time_required == 0) { delete current_job; current_job = NULL; } } else { current_job->Run(wait_time); time += wait_time; } } } if (job_count < JOB_MAX) { time_required = rand() % JOB_NEED_MAX + 1; new_job = new Job(time_required); q.Enqueue(new_job); job_count++; } if ((job_count == JOB_MAX) && q.IsEmpty() && (current_job == NULL)) break; } } // -------------------------------------------------- void main (void) { int JOB_MAX; int JOB_NEED_MAX; int JOB_ENTER_MAX; Queue q; srand((unsigned)time(NULL)); cout << "How many jobs to run? "; cin >> JOB_MAX; cout << "What is the max interval between generating a new job? "; cin >> JOB_ENTER_MAX; cout << "What is the max time needed by any one job? "; cin >> JOB_NEED_MAX; cout << endl; cout << "BEGINNING SIMULATION" << endl; cout << "====================" << endl; cout << endl; Sim(q, JOB_NEED_MAX, JOB_ENTER_MAX, JOB_MAX); cout << endl; cout << "====================" << endl; cout << "SIMULATION COMPLETED" << endl; cout << endl; system("pause"); }