so
Leo
Posted on April 15, 2024
#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;
}
💖 💪 🙅 🚩
Leo
Posted on April 15, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.