Vous êtes sur la page 1sur 12

Practica 1 Estructura de Datos Grado en Ingeniera de Computadores

Jon Durao Moreno 15/11/2012

Funcionamiento
Para hacer la simulacin del banco la primera estructura utilizada es un vector en el que almacenamos las personas creadas en main. Este vector se pasa como parmetro al mtodo simular de banco. En el simularemos el funcionamiento de un banco. Para esta simulacin creamos colas (cuentan con mtodos aadir, eliminar y estavacia) y las almacenamos en un nuevo vector. En la simulacin se controla el orden de llegada de todas las personas que creamos as como el tiempo que son atendidas(solo atenderemos al primero de cada cola). Para realizar esta simulacin utilizamos un contador(bucle for) y en cada cambio de este contador comprobaremos si coincide o no con el tiempo de llegada de las personas creadas ,que pasamos en el vector creado anteriormente, en caso de coincidir se llama al mtodo llegada de banco y en caso contrario se continua con la ejecucin. Ademas de controlar las llegadas controlaremos las salidas. Para controlar estas salidas tomamos los tiempos de atencin que necesitan y en caso de ser el primer cliente que pasa por la caja tomaremos su tiempo de llegada. Para el control sumamos al tiempo que tardo en salir el cliente anterior al tiempo que necesita para terminar de ser atendido el actual y en caso de ser el primero el tiempo de entrada, ya que solo influye en este caso. (Con los siguientes clientes la variable control contiene todo el tiempo usado en por la cola excepto el que necesita el cliente nuevo) En caso de que coincidan los dos valores eliminaremos el cliente correspondiente y actualizaremos el valor del tiempo medio pasado por los clientes en el banco, sumando al tiempo total el resultado de la resta del instante en el que termina el cliente con su instante de llegada. En cuanto a la creacin de las estructuras usadas tenemos 3: personas, colas y banco. Las personas son creadas desde el mtodo main, uniendolas despues a un vector. La creacin de las personas necesita cuatro parmetros pasados que son la id cliente, los instantes de llegada y el tiempo que necesita y la tarea que realizaran. El banco no necesita parmetros y es creado en el mtodo main antes de crear las personas. En la creacin del banco inicializamos las variables utilizadas mas tarde. Tiempototal, clientestotales y la cajacorta son inicializados a 0. Ademas aqu crearemos las colas necesarias(en este caso 4). Estas colas se crean mediante un bucle que va de 0 hasta el mximo de colas. Ademas de esto en este bucle se inicializan a 0 los vectores control y contador. Las colas se crean con los campos cabeza y ultimo. La cola en su estado inicial debe estar vaci por lo que en la creacin se igualan estos campos a NULL. Contaremos ademas con un contador de elementos. Ademas de esto todos las personas que llegan a las colas se aadirn en los nodoscolas a la cola correspondiente. Este nodocola cuenta con las variables cliente y siguiente. El cliente sera el cliente que llega mientras que siguiente apuntara al siguiente nodocola de la cola, a no ser que sea el ultimo.

Cdigo
Main.cpp
#include <iostream> #include <string> #include <conio.h> #include "banco.h" #include "cola.h" //#include "excepcion.h" #include "persona.h" int main() { persona people[9]; banco b1; // LISTADO DE PERSONAS persona p1(1,"PAGOS",0,20); people[0] = p1; persona p3(3,"PAGOS",0,15); people[2] = p3; persona p2(2,"ACTUALIZAR",5,19); people[1] = p2; persona p4(4,"INGRESOS",7,23); people[3] = p4; persona p7(7,"PAGOS",9,16); people[6] = p7; persona p9(9,"INGRESOS",11,23); people[8] = p9; persona p8(8,"RECIBOS",14,31); people[7] = p8; persona p6(6,"ACTUALIZAR",18,14); people[5] = p6; persona p5(5,"TRANSFERENCIA",21,20); people[4] = p5; b1.simular(people); cout << "Fin del programa" << endl; _getch(); return 0; };

Persona.h
#ifndef PERSONA_H_ #define PERSONA_H_ #include <iostream> #include <string> #include <conio.h> using namespace std; class persona { private: char idcaja; int idcliente; string tarea; int horaevento; int duracion; int tiempoatendido;

// caja en la que se coloca // cdigo identificador de cliente // descripcin de la tarea // hora prevista de inicio // duracin del servicio // tiempo que lleva siendo atendido

public: persona(); persona(int cli,string tar, int hora, int dur); void escribir(); void poneridcaja(char caja); int horallegada(); int tarda(); int cogercliente(); void poneratendido(); }; #endif

Persona.cpp
#include #include #include #include #include #include "persona.h" <string> <conio.h> <iostream> "banco.h" "cola.h"

persona::persona(){ idcaja = '*'; idcliente = 0; tarea = 'a'; horaevento = 0; duracion = 0; tiempoatendido = 0; } persona::persona(int cli,string tar, int hora, int dur){ idcliente = cli; tarea = tar; horaevento = hora; duracion = dur; } void persona::escribir(){ //Este metodo muestra informacion sobre una persona cout << "El cliente " << idcliente << " en la caja " << idcaja << " llego en " << horaevento << " y le falta " << duracion << endl; return; } void persona::poneridcaja(char caja){ //Este metodo actualiza el valor de la caja por la que pasa la persona idcaja = caja; } int persona::cogercliente(){ el id de la persona return idcliente; } //Este metodo devuelve

int persona::horallegada(){ devuelve la hora a la que el cliente llega al banco return horaevento; }

//Este metodo

int persona::tarda(){ //Este metodo devuelve el tiempo que tardara en ser atendida la persona return duracion; }

Banco.h
#ifndef BANCO_H_ #define BANCO_H_ #include #include #include #include <iostream> <string> "cola.h" "persona.h"

using namespace std; const int maxcajas = 4; // Total de cajas en el banco const int horacierre = 360; // Hora de cierre del banco class banco { private: cola caja[maxcajas]; // Cajas disponibles para atender int control[maxcajas]; int contador[maxcajas]; int cajacorta; int totalclientes; // Clientes que han entrado en el banco int tiempototal; // Tiempo total que pasan los clientes en el banco public: banco(); // Constructor void lanzar(); // Lanzaremos las cajas necesarias void escribir(); // Escribe la situacin actual del banco void llegada(persona p); // Gestiona la llegada de una persona void simular(persona p[]); }; #endif

Banco.cpp
#include #include #include #include #include #include "persona.h" <string> <conio.h> <iostream> "banco.h" "cola.h"

banco::banco(){ totalclientes = 0; //Inicializamos el banco con sus variables de control a 0 tiempototal = 0; cajacorta = 0; for (int id=0;id<maxcajas;id++){ //Para cada caja inicializamos los tres arrays a 0 caja[id] = cola(); control[id] = 0; contador[id] = 0; cout << "Caja " << id << " abierta." << endl; //Mostramos por pantalla que cola ha sido abierta } } void banco::escribir(){ cout << "Actualmente hay " << totalclientes << " y se ha consumido un tiempo igual a " << tiempototal << endl; } void banco::llegada(persona p){ //Controlamos la llegada de una persona al banco, buscando la caja mas vacia int aux = 100000; for(int id=0; id<maxcajas; id++){ //Para cada cola comprobamos si es la que menos clientes tiene if(caja[id].cuantos() < aux){ aux = caja[id].cuantos(); //En caso de que sea la cola mas vacia actualizamos la variable aux con el metodo cuantos de cola cajacorta = id; //La variable cajacorta almacenara la caja mas corta } } totalclientes ++; //Actualizamos el numero de clientes que pasan por el banco p.poneridcaja(cajacorta); //Actualizamos la variable idcaja de persona con cajacorta caja[cajacorta].anadir(p); //Aadimos p a la cola mas corta que hayamos encontrado }

void banco::simular(persona p[]){ //Este metodo simula el funcionamiento del banco hasta la hora de cierre int total = 0, media = 0; for(int t=0; t < horacierre; t++){ //Se ejecutara la simulacion hasta que t alcance horacierre for(int i=0; i<9; i++){ //Controlamos la llegada de clientes en el t actual. Recorremos todas las personas posibles if(p[i].horallegada() == t){ //Si horallegada de la persona es igual al tiempo actual la persona llega al banco int auxc = 0; llegada(p[i]); //llamamos al metodo llegada pasandole como parametro la persona correspondiente auxc = p[i].cogercliente(); //Tomamos la id de cliente para mostrarla por pantalla cout << "Persona " << auxc << " anadida en la caja " << cajacorta << " en el instante " << t << endl; } } for(int i=0; i<maxcajas; i++){ //Controlamos en todas las cajas si alguien se va del banco if(!caja[i].esvacia()){ //Solo empezara si hay alguien en la caja int tardaini = 0, clienteat = 0, hatendido = 0, hllega = 0, hllegamedia = 0; tardaini = caja[i].primero().tarda(); //Tomamos el tiempo que tardara la persona que esta siendo atendia if(contador[i] == 0){ //Si es la primera persona en pasar por la cola tomamos su t de entrada hllega = caja[i].primero().horallegada(); } hatendido = control [i] + tardaini + hllega; //Calculamos cuando terminara la persona (control[i] es el t de salida del anterior cliente) if(hatendido == t){ //Si coincide con t entramos al bucle de eliminacion hllegamedia = caja[i].primero().horallegada(); //Toma mos el t de llegada del cliente que va a ser eliminado total = total + (t - hllegamedia); //Lo sumamos al total (restando el t de llegada al t actual) contador[i] = contador[i] + 1; //Sumamos 1 al contador de clientes de la caja control[i] = t; //Actualizamos control clienteat = caja[i].primero().cogercliente(); //Toma mos el id del cliente a eliminar caja[i].eliminar(); //LLamamos al metodo eliminar pasandole la persona correspondiente hllega = 0; cout << "Persona " << clienteat << " eliminada en la caja " << i << " en el

instante " << t <<

endl;

al }

if(caja[i].esvacia()){ //Mostramos por pantalla cuando una caja se queda vacia cout << "La caja " << i << " se vacia terminar el cliente " << clienteat << endl; } } } } media = total/totalclientes; //Calculamos la media de tiempo pasado por los clientes en el banco cout << "Los clientes han pasado " << media << " ciclos de media en banco." << endl; cout << "Los ciclos totales que pasan los clientes son " << total << << endl;

el "." }

Cola.h
#ifndef COLA_H_ #define COLA_H_ #include <iostream> #include <string> #include "persona.h" using namespace std; class cola { class nodocola { public: persona cliente; nodocola* sig; nodocola(persona p); // Constructor del nodo }; private: nodocola* cabeza; nodocola* ultimo; int elementos; public: cola(); void anadir(persona p); bool esvacia(); persona primero(); void eliminar(); int cuantos(); }; #endif /* COLAS_H_ */

// // // // // //

Constructor de la cola Aadir una solicitud a la cola Comprobar si la cola est vaca Obtener el primer elemento de la cola Quitar el primer elemento de la cola Obtener la cantidad de elementos

Cola.cpp
#include #include #include #include #include #include "persona.h" <string> <conio.h> <iostream> "banco.h" "cola.h"

cola::nodocola::nodocola(persona p){ cliente = p; //Inicializamos nodocola con la persona pasada como cliente sig = NULL; //El siguente nodo es NULL ya que este nodo se aade al final de la cola } cola::cola(){ cabeza = NULL;//Inicializamos la cola con el primer y ultimo ultimo = NULL;//elementos igualados a NULL. Por esto el numero elementos = 0;//de elementos se inicializa a 0. } void cola::anadir(persona p){ nodocola* aux = new nodocola(p); //Creamos un nodocola con la persona a aadir aux->cliente = p; //Asignamos al campo cliente de nodocola la persona aux->sig = NULL; //y a sig NULL ya que sera el ultimo de la cola if(esvacia()){ cabeza = aux; //Si la cola esta vacia el primer elemento de esta sera }else{ //la persona aadida ultimo->sig = aux; //Si el campo sig de la ultima persona apuntara a la recien creada } ultimo = aux; //El ultimo de la cola sera la que acabamos de aadir elementos ++; //Aumentamos en 1 el numero de elementos }

void cola::eliminar(){ nodocola* aux; //Reservamos memoria para el nodocola if(esvacia()){ //Si la cola esta vacia tratamos el error cout << "Error con la eliminacion." << endl; }else{ aux = cabeza; //En caso de tener algo en la cola en el nodocola aux guardamos el primero de la cola cabeza = cabeza->sig; //Tras esto al primero le asignamos el segundo de la cola (lo actualizamos) if(cabeza == NULL){ //Si el primero es NULL significa que la cola esta vacia por lo que ultimo = NULL; //el ultimo tambien sera NULL } aux->sig = NULL; //El campo siguiente de aux se pone a NULL por seguridad y por ultimo elementos --; //se reducen en 1 los elementos y se libera la memoria delete aux; } } persona cola::primero(){ //Esta cola devuelve la persona que esta a la cabeza de la cola if(esvacia()){ //Si esta vacia se trata el error cout << "No hay datos en la cola" << endl; }else{ //En el caso contrario devuelve el valor cliente de la cabeza de la cola return cabeza -> cliente; } } int cola::cuantos(){ //Devuelve el numero de elementos que hay en la cola return elementos; } bool cola::esvacia(){ //Esta cola devuelve un bool que nos indica si la cola esta vacia if(cabeza == NULL){ //Si cabeza es NULL significa que la cola esta vacia return true; }else{ //En caso contrario devolvera false al contener datos return false; } }

Vous aimerez peut-être aussi