DEV Community

Leo
Leo

Posted on

1 1 1 1 1

so

#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;
}
Enter fullscreen mode Exit fullscreen mode

Image of Docusign

🛠️ 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.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs