#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Proceso {
string id;
int tiempo;
int prioridad;
Proceso* siguiente;
};
Proceso* primero = NULL;
Proceso* ultimo = NULL;
void agregarProceso() {
int n;
cout<<"cuantos datos desea ingresar: ";
cin>>n;
for(int i=0;i<n;i++){
Proceso* nuevo = new Proceso();
cout << "Ingrese el id del proceso: ";
cin >> nuevo->id;
cout << "Ingrese el tiempo del proceso: ";
cin >> nuevo->tiempo;
cout << "Ingrese la prioridad del proceso: ";
cin >> nuevo->prioridad;
nuevo->siguiente = NULL;
if (primero == NULL) {
primero = nuevo;
ultimo = nuevo;
} else {
ultimo->siguiente = nuevo;
ultimo = nuevo;
}
cout << "Proceso agregado correctamente." << endl;
}
}
void imprimirProcesos() {
if (primero == NULL) {
cout << "No hay procesos en la lista." << endl;
return;
}
cout << "Procesos:" << endl;
Proceso* actual = primero;
cout << "Id " << " tiempo de ejecucion " << "prioridad " << endl;
while (actual != NULL) {
cout<<" "<< actual->id<<" "<<actual->tiempo<<" "<<actual->prioridad<<endl ;
actual = actual->siguiente;
}
}
void calcularFIFO() {
if (primero == NULL) {
cout << "No hay procesos en la lista." << endl;
}
else {
Proceso* actual = primero;
float tiempoRetorno = 0;
float tiempoRetornoTotal = 0;
int numProcesos = 0;
cout << "Id " << " tiempo de ejecucion: " << " Tiempo de retorno: " << endl;
while (actual != NULL) {
tiempoRetorno += actual->tiempo;
tiempoRetornoTotal += tiempoRetorno; // declaramos/asignamos
cout<<" "<< actual->id<<" "<<actual->tiempo<<" "<<
tiempoRetorno<<endl ;
actual = actual->siguiente;
numProcesos++;
}
float timpoProm=tiempoRetornoTotal/numProcesos;
cout << "El tiempo de retorno promedio es: " << timpoProm << endl;
}
}
void calcularSJF() {
if (primero == NULL) {
cout << "No hay procesos en la lista." << endl;
}
//se ordena por su tiempo de ejecuci n
Proceso* actual = primero; //obj de tipo proceso
while (actual != NULL){ // aun no se ha llegadi al final
Proceso* siguiente = actual->siguiente;
while (siguiente != NULL) {
if (siguiente->tiempo < actual->tiempo) { //se compara el tiemp de ejec
// Intercambiar los procesos
string idAux = actual->id;
int tiempoAux = actual->tiempo;
int prioridadAux = actual->prioridad;
actual->id = siguiente->id;
actual->tiempo = siguiente->tiempo; //intercambia valores actual/siguiente
actual->prioridad = siguiente->prioridad; //tiempo de mas corto se coloque antes
siguiente->id = idAux;
siguiente->tiempo = tiempoAux;
siguiente->prioridad = prioridadAux; //tempor
}
siguiente = siguiente->siguiente;
}
actual = actual->siguiente;
}
//tiempos de retorno
float tiempoRetorno = 0;
float tiempoRetornoTotal =0;
actual = primero;
int numProcesos = 0;
cout << "Id " << " tiempo de ejecucion " << "prioridad " << "Tiempo de retorno " << endl;
while (actual != NULL) {
tiempoRetorno += actual->tiempo;
tiempoRetornoTotal += tiempoRetorno;
numProcesos++;
cout<<" "<< actual->id<<" "<<actual->tiempo<<" "<<actual->prioridad<<" "<< tiempoRetorno<<endl ;
actual = actual->siguiente;
}
float promedioRetorno = (float) tiempoRetornoTotal/ numProcesos;
cout << "Promedio de tiempos de retorno: " << promedioRetorno << endl;
}
void roundRobin(int quantum){
// Realizar un seguimiento del proceso y el tiempo actuales
Proceso* actual = primero;
int actual_time = 0;
// Realizar un seguimiento del tiempo total y el n mero de procesos completados
int total_time = 0;
int completed_processes = 0;
//Siga iterando hasta que el indicador se establezca en false
bool ejecutar = true;
while (ejecutar) {
// Ejecutar proceso para quantum o hasta su finalizaci n
if (actual -> tiempo > quantum) {
actual_time += quantum;
actual -> tiempo -= quantum;
// Mover el proceso actual al final de la cola si no ha finalizado
if (ultimo == actual) {
ultimo = primero;
} else {
ultimo -> siguiente = actual;
ultimo = actual;
}
actual = actual -> siguiente;
} else {
// El proceso se ha completado
actual_time += actual -> tiempo;
cout << "Proceso " << actual -> id << " terminado. Tiempo de retorno: "
<< actual_time << endl;
// Quitar proceso de la cola
Proceso* temp = actual;
actual = actual -> siguiente;
if (primero == temp) {
primero = actual;
}
// Actualizar el tiempo total y el n mero de procesos completados
total_time += actual_time;
completed_processes++;
// borrar proceso
delete temp;
// Compruebe si todav a hay procesos en la cola
if (actual == NULL && primero != NULL) {
actual = primero;
}
}
// Compruebe si se han ejecutado todos los procesos
if (actual == NULL && primero == NULL) {
ejecutar = false;
}
}
//Calcular e imprimir el tiempo de respuesta promedio
float promedio_tiempo_retorno = total_time / (float)completed_processes;
cout << "El promedio del tiempo de retorno es: " << promedio_tiempo_retorno
<< endl;
}
bool compararPorPrioridad(Proceso a, Proceso b) {
return a.prioridad > b.prioridad;}
void calcularPrioridad(float quantum) {
// inicializaci n de variables
int tiempoTotal = 0;
int cantidadProcesos = 0;
int tiempoRetornoTotal = 0;
int tiempoEsperaTotal = 0;
// contar el tiempo total y la cantidad de procesos
Proceso* actual = primero;
while (actual != NULL) {
cantidadProcesos++;
tiempoTotal += actual->tiempo;
actual = actual->siguiente;
}
// crear un array de procesos y ordenarlos por prioridad
Proceso* procesos = new Proceso[cantidadProcesos];
actual = primero;
for (int i = 0; i < cantidadProcesos; i++) {
procesos[i] = *actual;
actual = actual->siguiente;
}
sort(procesos, procesos + cantidadProcesos, compararPorPrioridad);
// inicializar arrays de tiempo, tiempo de retorno y tiempo de espera
int tiempo[cantidadProcesos];
int tiempoRetorno[cantidadProcesos];
int tiempoEspera[cantidadProcesos];
for (int i = 0; i < cantidadProcesos; i++) {
tiempo[i] = procesos [i].tiempo;
// primero = primero->siguiente;
}
// simular la ejecuci n de los procesos
int tiempoTranscurrido = 0;
while (true) {
bool todosTerminados = true;
for (int i = 0; i < cantidadProcesos; i++) {
if (tiempo[i] > 0) {
todosTerminados = false;
if (tiempo[i] <= quantum) {
tiempoTranscurrido += tiempo[i];
tiempoRetorno[i] = tiempoTranscurrido;
tiempo[i] = 0;
} else {
tiempoTranscurrido += quantum;
tiempo[i] -= quantum;
}
}
}
if (todosTerminados) {
break;
}
}
// calcular el tiempo de espera de cada proceso y el tiempo total de retorno y espera
for (int i = 0; i < cantidadProcesos; i++) {
int tEspera = tiempoRetorno[i] - procesos[i].tiempo;
tiempoEspera[i] = (tEspera < 0) ? 0 : tEspera;
tiempoRetornoTotal += tiempoRetorno[i];
tiempoEsperaTotal += tiempoEspera[i];
cout << "Proceso " << procesos[i].id << " Tiempo de espera: " <<
tiempoEspera[i] << " Tiempo de retorno: " << tiempoRetorno[i] << endl;
}
// calcular el tiempo promedio de retorno y espera y mostrarlo por pantalla
double tiempoPromedioRetorno = (double) tiempoRetornoTotal /
cantidadProcesos;
double tiempoPromedioEspera = (double) tiempoEsperaTotal /
cantidadProcesos;
cout << "Tiempo promedio de retorno: " << tiempoPromedioRetorno << endl;
cout << "Tiempo promedio de espera: " << tiempoPromedioEspera << endl;
cout << endl << "Procesos ordenados por prioridad:" << endl;
for (int i = 0; i < cantidadProcesos; i++) {
cout << "Proceso " << i+1 << ": " << "ID=" << procesos[i].id << " Tiempo="
<< procesos[i].tiempo << " Prioridad=" << procesos[i].prioridad << endl;
}
}
int main(){
int opcion;
do {
cout << "MENU" << endl;
cout << "1. Entrada de datos" << endl;
cout << "2. Calcular FIFO" << endl;
cout << "3. Calcular SJF" << endl;
cout << "4. Calcular prioridad" << endl;
cout << "5. Calcular Round-Robin" << endl;
cout << "6. Salir" << endl;
cout << "Ingrese su opcion: ";
cin >> opcion;
system("cls");
switch (opcion) {
case 1:
agregarProceso();
imprimirProcesos();
break;
case 2:
calcularFIFO();
break;
case 3:
calcularSJF();
break;
case 5:
float quantum;
cout<<"Ingrese el tiempo quantum: ";
cin>>quantum;
roundRobin(quantum);
break;
case 4:
cout<<"INGRESE QUANTUM: "<<endl;
cin>>quantum;
calcularPrioridad(quantum);
break;
case 6:
cout << "Saliendo del programa." << endl;
break;
default:
cout << "Opcion invalida." << endl;
break;
}
} while (opcion != 6);
return 0;
}
🛠️ Bring your solution into Docusign. Reach over 1.6M customers.
Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (0)