#include <iostream>
using namespace std;
struct Process {
int id;
int burst_time;
int priority;
int arrival_time;
int completion_time;
int waiting_time;
int turnaround_time;
bool executed;
};
void sortByArrivalTime(Process processes[], int n) {
for (int i = 0; i < n - 1; ++i) {
for (int j = i + 1; j < n; ++j) {
if (processes[i].arrival_time > processes[j].arrival_time) {
swap(processes[i], processes[j]);
}
}
}
}
int findNextProcess(Process processes[], int n, int current_time) {
int min_priority = 1e9, index = -1;
for (int i = 0; i < n; ++i) {
if (!processes[i].executed && processes[i].arrival_time <= current_time) {
if (processes[i].priority < min_priority) {
min_priority = processes[i].priority;
index = i;
}
}
}
return index;
}
void calculateTimes(Process processes[], int n) {
int current_time = 0, completed = 0;
while (completed < n) {
int index = findNextProcess(processes, n, current_time);
if (index == -1) {
current_time++;
continue;
}
processes[index].executed = true;
processes[index].completion_time = current_time + processes[index].burst_time;
processes[index].turnaround_time = processes[index].completion_time - processes[index].arrival_time;
processes[index].waiting_time = processes[index].turnaround_time - processes[index].burst_time;
current_time = processes[index].completion_time;
completed++;
}
}
void displayResults(Process processes[], int n) {
cout << "ID\tBurst Time\tArrival Time\tPriority\tWaiting Time\tTurnaround Time\tCompletion Time\n";
for (int i = 0; i < n; ++i) {
cout << processes[i].id << "\t" << processes[i].burst_time << "\t\t" << processes[i].arrival_time
<< "\t\t" << processes[i].priority << "\t\t" << processes[i].waiting_time << "\t\t"
<< processes[i].turnaround_time << "\t\t" << processes[i].completion_time << endl;
}
}
int main() {
int n;
cout << "Enter number of processes: ";
cin >> n;
Process processes[n];
for (int i = 0; i < n; ++i) {
cout << "Enter Burst Time, Priority, Arrival Time for Process " << i + 1 << ": ";
processes[i].id = i + 1;
cin >> processes[i].burst_time >> processes[i].priority >> processes[i].arrival_time;
processes[i].executed = false;
}
sortByArrivalTime(processes, n);
calculateTimes(processes, n);
displayResults(processes, n);
return 0;
}