#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
// Structure to represent a process
struct Process {
int pid;
int burst_time;
int remaining_time;
int arrival_time;
int completion_time;
int turnaround_time;
int waiting_time;
};
// Function to find the process with the shortest remaining time
int findShortestJob(const vector<Process>& processes, int current_time) {
int shortest_job = -1;
int min_remaining_time = -1;
for (int i = 0; i < processes.size(); ++i) {
if (processes[i].arrival_time <= current_time && processes[i].remaining_time > 0) {
if (shortest_job == -1 || processes[i].remaining_time < min_remaining_time)
{
shortest_job = i;
min_remaining_time = processes[i].remaining_time;
}
else if (processes[i].remaining_time == min_remaining_time)
{
if (processes[i].arrival_time < processes[shortest_job].arrival_time)
{
shortest_job = i;
}
}
}
}
return shortest_job;
}
int main() {
int n;
// Get the number of processes
cout << "Enter the number of processes: ";
cin >> n;
vector<Process> processes(n);
// Get the burst time and arrival time for each process
for (int i = 0; i < n; ++i) {
processes[i].pid = i + 1;
cout << "Enter burst time for process " << i + 1 << ": ";
cin >> processes[i].burst_time;
processes[i].remaining_time = processes[i].burst_time;
cout << "Enter arrival time for process " << i + 1 << ": ";
cin >> processes[i].arrival_time;
}
int current_time = 0;
int completed_processes = 0;
vector<int> gantt_chart;
while (completed_processes < n) {
int shortest_job = findShortestJob(processes, current_time);
if (shortest_job == -1) {
current_time++;
gantt_chart.push_back(0); // Indicate idle
} else {
processes[shortest_job].remaining_time--;
current_time++;
gantt_chart.push_back(processes[shortest_job].pid);
if (processes[shortest_job].remaining_time == 0) {
completed_processes++;
processes[shortest_job].completion_time = current_time;
processes[shortest_job].turnaround_time = processes[shortest_job].completion_time - processes[shortest_job].arrival_time;
processes[shortest_job].waiting_time = processes[shortest_job].turnaround_time - processes[shortest_job].burst_time;
}
}
}
// Print the Gantt chart
cout << "\nGantt Chart:\n";
for (int i = 0; i < gantt_chart.size(); ++i) {
if (i == 0 || gantt_chart[i] != gantt_chart[i-1]){
cout << "[" << i << "]--P" << gantt_chart[i] << "--";
}
if (i == gantt_chart.size() -1){
cout << "[" << i+1 << "]";
}
}
cout << endl;
// Print the process details
cout << "\nProcess\tBurst Time\tArrival Time\tCompletion Time\tTurnaround Time\tWaiting Time\n";
for (int i = 0; i < n; ++i) {
cout << processes[i].pid << "\t" << processes[i].burst_time << "\t\t" << processes[i].arrival_time << "\t\t"
<< processes[i].completion_time << "\t\t" << processes[i].turnaround_time << "\t\t" << processes[i].waiting_time << endl;
}
// Calculate and print average turnaround time and waiting time
double avg_turnaround_time = 0;
double avg_waiting_time = 0;
for (int i = 0; i < n; ++i) {
avg_turnaround_time += processes[i].turnaround_time;
avg_waiting_time += processes[i].waiting_time;
}
avg_turnaround_time /= n;
avg_waiting_time /= n;
cout << "\nAverage Turnaround Time: " << avg_turnaround_time << endl;
cout << "Average Waiting Time: " << avg_waiting_time << endl;
return 0;
}