![]() Directorio WAP para móvil, Tablet, iPhone o Smartphone Centro de Noticias de la Universidad de Oriente |
|
|
||
lunes julio 11, 2016 Planteo del problema: Este práctico tiene por objetivo mostrar la importancia de las colas en las Ciencias de la Computación y más precisamente en las simulaciones. Las simulaciones permiten analizar situaciones de la realidad sin la necesidad de ejecutarlas realmente. Tiene el beneficio que su costo es muy inferior a hacer pruebas en la realidad.Desarrollar un programa para la simulación de un cajero automático. Se cuenta con la siguiente información: - Llegan clientes a la puerta del cajero cada 2 ó 3 minutos. - Cada cliente tarda entre 2 y 4 minutos para ser atendido.Obtener la siguiente información: 1 - Cantidad de clientes que se atienden en 10 horas. 2 - Cantidad de clientes que hay en cola después de 10 horas. 3 - Hora de llegada del primer cliente que no es atendido luego de 10 horas (es decir la persona que está primera en la cola cuando se cumplen 10 horas)Programa:#include <iostream> #include<cstdlib> #include<ctime> using namespace std; class Cola { private: class Nodo { public: int info; Nodo *sig; }; Nodo *raiz; Nodo *fondo; public: Cola(); ~Cola(); void insertar(int x); int extraer(); bool vacia(); int cantidad(); }; Cola::Cola() { raiz = NULL; fondo = NULL; } Cola::~Cola() { Nodo *reco = raiz; Nodo *bor; while (reco != NULL) { bor = reco; reco = reco->sig; delete bor; } } void Cola::insertar(int x) { Nodo *nuevo; nuevo = new Nodo(); nuevo->info = x; nuevo->sig = NULL; if (vacia()) { raiz = nuevo; fondo = nuevo; } else { fondo->sig = nuevo; fondo = nuevo; } } int Cola::extraer() { if (!vacia()) { int informacion = raiz->info; Nodo *bor = raiz; if (raiz == fondo) { raiz = NULL; fondo = NULL; } else { raiz = raiz->sig; } delete bor; return informacion; } else return -1; } bool Cola::vacia() { if (raiz == NULL) return true; else return false; } int Cola::cantidad() { Nodo *reco = raiz; int cant = 0; while (reco != NULL) { cant++; reco = reco->sig; } return cant; } class CajeroAutomatico { public: void simulacion(); }; void CajeroAutomatico::simulacion() { srand(time(NULL)); int estado = 0; int llegada = rand() % 2 + 2; int salida = -1; int cantAtendidas = 0; Cola *cola = new Cola(); for (int minuto = 0; minuto < 600; minuto++) { if (llegada == minuto) { if (estado == 0) { estado = 1; salida = minuto + 2 + rand() % 3; } else { cola->insertar(minuto); } llegada = minuto + 2 + rand() % 2; } if (salida == minuto) { estado = 0; cantAtendidas++; if (!cola->vacia()) { cola->extraer(); estado = 1; salida = minuto + 2 + rand() % 3; } } } cout <<"Atendidos:" <<cantAtendidas <<""; cout <<"En cola:" <<cola->cantidad() <<""; cout <<"Minuto llegada:" <<cola->extraer(); } void main() { CajeroAutomatico *cajero1 = new CajeroAutomatico(); cajero1->simulacion(); delete cajero1; cin.get(); } Este proyecto lo puede descargar en un zip desde este enlace : ColaSimulacion1.zipLa clase Cola colabora con la clase CajeroAutomatico. En la clase Cola debemos definir como mínimo los métodos de insertar, extraer, vacía y cantidad. El método donde implementamos la lógica es el de simulacion, veamos las distintas partes de dicho método: srand(time(NULL)); int estado = 0; int llegada = rand() % 2 + 2; int salida = -1; int cantAtendidas = 0; Cola *cola = new Cola(); Iniciamos la semilla de valores aleatorios llamando a srand. La variable estado almacena un cero si el cajero está libre y un uno cuando está ocupado. La variable llegada almacena en que minuto llegará el próximo cliente (debemos generar un valor entre 2 y 3)La variable salida almacenará en que minuto terminará el cliente de ser atendido (como al principio el cajero está vacío inicializamos esta variable con -1) Llevamos un contador para saber la cantidad de personas atendidas (cantAtendidas) Luego definimos y creamos un objeto de la clase Cola para poder almacenar las personas que llegan al cajero y se lo encuentran ocupado. Disponemos un for que se repita 600 veces (600 minutos o lo que es lo mismo 10 horas) for (int minuto = 0; minuto < 600; minuto++) Dentro del for hay dos if fundamentales que verifican que sucede cuando llega una persona o cuando una persona se retira: if (llegada == minuto) { ............ } if (salida == minuto) { ............ } Cuando llega una persona al cajero primero verificamos si el cajero está desocupado: if (llegada == minuto) { if (estado==0) { Si está desocupado lo ocupamos cambiando el valor de la variable estado y generando en que minuto esta persona dejará el cajero (un valor aleatorio entre 2 y 4 minutos): estado = 1; salida = minuto + 2 + rand() % 3; Si el cajero está ocupado procedemos a cargar dicha persona en la cola (insertamos el minuto que llega): else { cola->insertar(minuto); } Luego generamos el próximo minuto que llegará otra persona: llegada = minuto + 2 + rand() % 2; El otro if importante es ver que sucede cuando sale la persona del cajero: if (salida == minuto) {Si sale una persona del cajero cambiamos el valor de la variable estado, incrementamos en uno el contador cantAtendidos y si la cola no está vacía extraemos una persona, cambiamos a uno la variable estado y generamos en que minuto dejará esta persona el cajero: estado = 0; cantAtendidas++; if (!cola->vacia()) { cola->extraer(); estado = 1; salida = minuto + 2 + rand() % 3; } Fuera del for mostramos los tres resultados: cout <<"Atendidos:" <<cantAtendidas <<""; cout <<"En cola:" <<cola->cantidad() <<""; cout <<"Minuto llegada:" <<cola->extraer();
#include <iostream> #include<cstdlib> #include<ctime> using namespace std; class Cola { private: class Nodo { public: int info; Nodo *sig; }; Nodo *raiz; Nodo *fondo; public: Cola(); ~Cola(); void insertar(int x); int extraer(); bool vacia(); int cantidad(); }; Cola::Cola() { raiz = NULL; fondo = NULL; } Cola::~Cola() { Nodo *reco = raiz; Nodo *bor; while (reco != NULL) { bor = reco; reco = reco->sig; delete bor; } } void Cola::insertar(int x) { Nodo *nuevo; nuevo = new Nodo(); nuevo->info = x; nuevo->sig = NULL; if (vacia()) { raiz = nuevo; fondo = nuevo; } else { fondo->sig = nuevo; fondo = nuevo; } } int Cola::extraer() { if (!vacia()) { int informacion = raiz->info; Nodo *bor = raiz; if (raiz == fondo) { raiz = NULL; fondo = NULL; } else { raiz = raiz->sig; } delete bor; return informacion; } else return -1; } bool Cola::vacia() { if (raiz == NULL) return true; else return false; } int Cola::cantidad() { Nodo *reco = raiz; int cant = 0; while (reco != NULL) { cant++; reco = reco->sig; } return cant; } class Supermercado { public: void simulacion(); }; void Supermercado::simulacion() { int estado1 = 0, estado2 = 0, estado3 = 0; int marchan = 0; int llegada = 2 + rand() % 2; int salida1 = -1, salida2 = -1, salida3 = -1; int cantAte1 = 0, cantAte2 = 0, cantAte3 = 0; int tiempoEnCola = 0; int cantidadEnCola = 0; Cola *cola1 = new Cola(); Cola *cola2 = new Cola(); Cola *cola3 = new Cola(); srand(time(NULL)); for (int minuto = 0; minuto < 600; minuto++) { if (llegada == minuto) { if (estado1 == 0) { estado1 = 1; salida1 = minuto + 7 + rand() % 5; } else { if (estado2 == 0) { estado2 = 1; salida2 = minuto + 7 + rand() % 5; } else { if (estado3 == 0) { estado3 = 1; salida3 = minuto + 7 + rand() % 5; } else { if (cola1->cantidad() == 6 && cola2->cantidad() == 6 && cola3->cantidad() == 6) { marchan++; } else { if (cola1->cantidad() <= cola2->cantidad() && cola1->cantidad() <= cola3->cantidad()) { cola1->insertar(minuto); } else { if (cola2->cantidad() <= cola3->cantidad()) { cola2->insertar(minuto); } else { cola3->insertar(minuto); } } } } } } llegada = minuto + 2 + rand() % 2; } if (salida1 == minuto) { cantAte1++; estado1 = 0; if (!cola1->vacia()) { estado1 = 1; int m = cola1->extraer(); salida1 = minuto + 7 + rand() % 5; tiempoEnCola = tiempoEnCola + (minuto - m); cantidadEnCola++; } } if (salida2 == minuto) { cantAte2++; estado2 = 0; if (!cola2->vacia()) { estado2 = 1; int m = cola2->extraer(); salida2 = minuto + 7 + rand() % 5; tiempoEnCola = tiempoEnCola + (minuto - m); cantidadEnCola++; } } if (salida3 == minuto) { cantAte3++; estado3 = 0; if (!cola3->vacia()) { estado3 = 1; int m = cola3->extraer(); salida3 = minuto + 7 + rand() % 5; tiempoEnCola = tiempoEnCola + (minuto - m); cantidadEnCola++; } } } cout <<"Clientes atendidos por caja: caja1=" <<cantAte1 <<" caja2=" <<cantAte2 <<" caja3=" <<cantAte3 <<""; cout <<"Se marchan sin hacer compras:" <<marchan <<""; if (cantidadEnCola>0) { int tiempoPromedio = tiempoEnCola / cantidadEnCola; cout <<"Tiempo promedio en cola:" <<tiempoPromedio <<""; } } void main() { Supermercado *super1; super1 = new Supermercado(); super1->simulacion(); delete super1; cin.get(); } |
||
— @INFOUDO.OFICIAL
Comenta o lee lo que otros opinan |
||
COMPÁRTELO:Indica que te gusta y comparte |
||
![]() ![]() ![]() ![]() ![]() |
||
También te puede interesar: NOCIONES BÁSICAS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS. |
||
« Estructuras dinámicas en C++: Listas tipo Cola | Estructuras dinámicas en C++: Listas genéricas » |
||
![]() |
||
Buscador:
|
||
Síguenos en las redes sociales![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Mis cuentas socialesOtras | LinktreeMóvil: (0426 683 6955 - 0412 8226575) - E-mail: [email protected] - [email protected] - WhatsApp: +58 (0426) 683.69.55 / +58 (0412) 822.65.75 ![]() |
||
|
||
|