following is my code.. I have implemented Process class and taking in input in an array of Process objects. Then, in my Priority_Scheduling Class, I am calling a sorting function for Priority sort that sorts the array according to the value of priority of all the Process objects...
Interestingly, I am getting garbage value for obj[3] but for all other indexes (1 - 4), it gives a valid value. Due to this garbage value, priority sort performs an abnormal sorting and code doesn't work. Can anyone help identify the error, please?
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
class Process;
class Priority_Scheduling;
struct node
{
int data;
node* next;
};
struct Process_Type // To store average times for all the processes.
{
string process_name;
float avg_turnaround_time;
float avg_waiting_time;
};
class Queue
{
node* front;
node* rear;
public:
Queue();
bool isEmpty();
void dequeue();
void enqueue(int &);
int peek();
};
class Process
{
int id;
static int count; // Count will maintain the record of total processes created.
int burst_time;
int stored_burst_time; // To keep the original value of burst time intact.
int arrival_time;
int completion_time;
int turnaround_time;
int waiting_time;
int priority;
bool has_finished; // To check whether process has finished execution or not
public:
friend class Priority_Scheduling;
Process() :id(count) { completion_time = turnaround_time = waiting_time = 0; count++; has_finished = false; priority = 0; }
// Every process will have a unique Process ID as assigned by count...
void input();
// Set and Get Functions.
int get_t() { return turnaround_time; }
int get_w() { return waiting_time; }
int getid() { return id; }
int get_bt() { return burst_time; }
int get_ct() { return completion_time; }
int get_at() { return arrival_time; }
int get_sbt() { return stored_burst_time; }
void set_bt(int &a) { burst_time = a; }
void set_at(int &a) { arrival_time = a; }
void set_ct(int &a) { completion_time = a; }
void set_t(int &a) { turnaround_time = a; }
void set_w(int &a) { waiting_time = a; }
bool get_finished() { return has_finished; }
void set_finished(bool a) { has_finished = a; }
int get_priority() { return priority; }
void Display();
void Display_Before();
Process(const Process &);
};
class Priority_Scheduling
{
int total_time;
public:
void sort();
bool check();
void priority_sort();
void Calculate(Queue &);
void algorithm();
};
int Process::count = 0;
int time_slice, num;
Process_Type p_type[4];
Process *obj = NULL;
Queue Ready_Queue[4];
void input();
int main()
{
input();
Priority_Scheduling sjf;
cout << endl << endl << setw(15) << "Process ID" << setw(15) << "Arrival Time" << setw(15) << "Burst Time" << setw(15) << "Priority" << endl
<< "------------------------------------------------------------------" << endl;
for (int i = 0; i < num; i++)
obj[i].Display_Before();
sjf.algorithm();
// Round Robin Algorithm is used as a driver algorithm for the implementation of question.
// Printing Before Calculation
// Printing After Calculation
cout << endl << endl << setw(15) << "Process ID" << setw(15) << "Arrival Time" << setw(15) << "Burst Time" << setw(15) << "Turnaround" << setw(15) << "Waiting Time" << endl
<< "------------------------------------------------------------------" << endl;
for (int i = 1; i < num; ++i)
{
for (int j = 0; j < num - i; ++j)
if (obj[j].getid() > obj[j + 1].getid())
swap(obj[j], obj[j + 1]);
}
for (int i = 0; i < num; i++)
obj[i].Display();
cout << endl << endl;
cout << endl;
system("pause");
return 0;
}
void input()
{
do
{
cout << "Enter Number of Processes: ";
cin >> num;
} while (num < 1);
obj = new Process[num];
for (int i = 0; i < num; i++)
obj[i].input();
}
void Process::Display()
{
cout << setw(15) << id << setw(15) << arrival_time << setw(15) << stored_burst_time << setw(15) << turnaround_time << setw(15) << waiting_time;
cout << endl;
}
void Process::Display_Before()
{
cout << setw(15) << id << setw(15) << arrival_time << setw(15) << stored_burst_time << setw(15) << priority << endl;
}
void Process::input()
{
cout << "Process: " << id << endl
<< "Enter Arrival Time: "; cin >> arrival_time;
cout << "Enter Burst Time: "; cin >> burst_time;
stored_burst_time = burst_time;
cout << "Enter Priority: "; cin >> priority;
}
// --------------------Priority CLASS ------------------------------------
void Priority_Scheduling::sort()
{
int j;
for (int i = 1; i < num; ++i)
{
for (j = 0; j < num - i; ++j)
if (obj[j].get_at() > obj[j + 1].get_at())
swap(obj[j], obj[j + 1]);
}
}
void Priority_Scheduling::priority_sort()
{
cout << "Enter" << endl; // Checking if the program has entered or not.
int j;
for (int i = 1; i < num; ++i)
{
for (j = 0; j < num - 1; ++j)
{
cout << "j: " << j << " obj[j].p: " << obj[j].priority << endl
<< "j+1: " << j << " obj[j+1].p: " << obj[j + 1].priority << endl; // Printing out values of j and j+1
if (obj[j].priority > obj[j + 1].priority)
swap(obj[j], obj[j + 1]);
}
}
}
bool Priority_Scheduling::check()
{
for (int i = 0; i < num; i++)
if (obj[i].get_finished() == false)
return false;
return true;
}
void Priority_Scheduling::algorithm()
{
for (int i = 0; i < num; i++)
cout << obj[i].getid() << " "; // PRINTING OUT IDS OF ALL PROCESSES AS TEST
total_time = 0;
cout << endl;
sort();
priority_sort();
for (int i = 0; i < num; i++)
cout << obj[i].priority << " "; // Printing out values of Priority of all processes after sorting. This gives garbage values
while (!check())
{
for (int i = 0; i < num; i++)
{
if (obj[i].get_at() <= total_time) // Initially, only those processes are inserted whose arrival time is zero.
if (obj[i].get_finished() == false)
Ready_Queue[2].enqueue(i); // Inserting Process IDs into the Queue for Priority_Scheduling
}
if (!(Ready_Queue[2].isEmpty()))
Calculate(Ready_Queue[2]);
}
for (int i = 0; i < num; i++)
{
p_type[2].avg_turnaround_time += obj[i].get_t();
p_type[2].avg_waiting_time += obj[i].get_w();
}
p_type[2].avg_turnaround_time = p_type[2].avg_turnaround_time / num;
p_type[2].avg_waiting_time = p_type[2].avg_waiting_time / num;
cout << "Average Turnaround Time: " << p_type[2].avg_turnaround_time << endl
<< "Average Waiting Time: " << p_type[2].avg_waiting_time << endl;
}
void Priority_Scheduling::Calculate(Queue &Ready_Queue)
{
int temp = Ready_Queue.peek();
Ready_Queue.dequeue();
int b = total_time + obj[temp].get_sbt();
obj[temp].set_ct(b);
total_time += obj[temp].get_sbt();
b = obj[temp].get_ct() - obj[temp].get_at();
obj[temp].set_t(b);
b = obj[temp].get_t() - obj[temp].get_sbt();
obj[temp].set_w(b);
obj[temp].set_finished(true);
while (!(Ready_Queue.isEmpty()))
Ready_Queue.dequeue();
}
// ------------------- QUEUE CLASS IMPLEMENTATION ---------------------------
Queue::Queue() { front = NULL; rear = NULL; }
bool Queue::isEmpty()
{
if (!front)
return true;
return false;
}
int Queue::peek() { return front->data; }
void Queue::enqueue(int &d)
{
node* temp = new node;
temp->data = d;
temp->next = NULL;
if (isEmpty())
{
front = temp;
rear = temp;
return;
}
rear->next = temp;
rear = temp;
}
void Queue::dequeue()
{
if (isEmpty())
{
cout << "Nothing to delete";
return;
}
node* temp = front;
front = front->next;
free(temp);
}
Process::Process(const Process &Process_obj)
{
this->arrival_time = Process_obj.arrival_time;
this->burst_time = Process_obj.burst_time;
this->completion_time = Process_obj.completion_time;
this->id = Process_obj.id;
this->stored_burst_time = Process_obj.stored_burst_time;
this->turnaround_time = Process_obj.turnaround_time;
this->waiting_time = Process_obj.waiting_time;
this->has_finished = Process_obj.has_finished;
}
Following is a sample inputs I gave to my code.. and this is what I got,
Enter Number of Processes: 5
Process: 0
Enter Arrival Time: 0
Enter Burst Time: 3
Enter Priority: 3
Process: 1
Enter Arrival Time: 1
Enter Burst Time: 6
Enter Priority: 4
Process: 2
Enter Arrival Time: 3
Enter Burst Time: 1
Enter Priority: 9
Process: 3
Enter Arrival Time: 2
Enter Burst Time: 2
Enter Priority: 7
Process: 4
Enter Arrival Time: 4
Enter Burst Time: 4
Enter Priority: 8
Process ID Arrival Time Burst Time Priority
------------------------------------------------------------------
0 0 3 3
1 1 6 4
2 3 1 9
3 2 2 7
4 4 4 8
0 1 2 3 4 // Process IDs.
Enter // indication than program has entered sorting function
j: 0 obj[j].p: 3 // For obj[0], prioriy value is good
j+1: 0 obj[j+1].p: 4 // for index 1, it's also good
j: 1 obj[j].p: 4 // for index = 1, again good
j+1: 1 obj[j+1].p: 7 // for index = 2, again good
j: 2 obj[j].p: 7 // for index = 2, again good
j+1: 2 obj[j+1].p: -858993460 // NOW HERE IS THE PROBLEM, for INDEX = 3
j: 3 obj[j].p: -858993460
j+1: 3 obj[j+1].p: 8 // Interestingyly, value is good for INDEX = 4 also.
j: 0 obj[j].p: 3
j+1: 0 obj[j+1].p: 4
j: 1 obj[j].p: 4
j+1: 1 obj[j+1].p: -858993460
j: 2 obj[j].p: -858993460
j+1: 2 obj[j+1].p: -858993460
j: 3 obj[j].p: -858993460
j+1: 3 obj[j+1].p: 8
j: 0 obj[j].p: 3
j+1: 0 obj[j+1].p: -858993460
j: 1 obj[j].p: -858993460
j+1: 1 obj[j+1].p: -858993460
j: 2 obj[j].p: -858993460
j+1: 2 obj[j+1].p: -858993460
j: 3 obj[j].p: -858993460 // as a result, all values get garbaged
I have added small notes as where the actual problem is occuring in the output. Please help if you can, thank you.