#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; }