Advertisement
davidcastrosalinas

20201120 Clase Ejemplos de Heap, Colas, Stack, Polimorfismo, Clases Compuestas, administrar Vectores de clases

Nov 20th, 2020 (edited)
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.21 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. /**####CLASE STACK  ****/
  6. #include <stack>
  7. template <class Tipo>
  8. class Stack : private stack<Tipo> {
  9. public:
  10.     void push(Tipo _valor) {
  11.         stack<Tipo>::push(_valor);
  12.     }
  13.  
  14.     Tipo pop() {
  15.         Tipo temp = stack<Tipo>::top();
  16.         stack<Tipo>::pop();
  17.         return temp;
  18.     }
  19.  
  20.     bool empty () {
  21.         return stack<Tipo>::empty();
  22.     }
  23. };
  24.  
  25. /**
  26. * Crearemos la clase Cola a partir de la librería QUEUE de C++
  27. */
  28. #include <queue>
  29. template <class Tipo>
  30. class Cola : private queue<Tipo> {
  31. public:
  32.     Tipo extraer(){
  33.         Tipo valor = this->front();
  34.         this->pop();
  35.         return valor;
  36.     }
  37.  
  38.     void agregar(Tipo valor){
  39.         this->push(valor);
  40.     }
  41.  
  42.     bool vacia(){
  43.         return this->empty();
  44.     }
  45. };
  46.  
  47. /************************************************************/
  48. #ifndef HEAPTEMPLATE_H
  49. #define HEAPTEMPLATE_H
  50.  
  51. #include <queue>
  52. template <class T> class Heap {
  53. public:
  54.     Heap() {};
  55.     virtual ~Heap() {};
  56.  
  57.     void agregar(T dato, int prioridad) {
  58.         ParPrioridadDato par;
  59.         par.first = prioridad;
  60.         par.second= dato;
  61.         h2.push(par);
  62.     };
  63.  
  64.     T extraer(){
  65.         ParPrioridadDato par = h2.top();
  66.         h2.pop();
  67.         return par.second;
  68.     }
  69.  
  70.     bool vacia() {
  71.         return h2.empty();
  72.     }
  73.  
  74. private:
  75.     typedef std::pair<int, T> ParPrioridadDato; // Prioridad, orden
  76.  
  77.     class ComparePrioridad {
  78.         public:
  79.             bool operator() (ParPrioridadDato a, ParPrioridadDato b) {
  80.                 return a.first > b.first;
  81.             }
  82.     };
  83.     std::priority_queue<ParPrioridadDato, std::vector<ParPrioridadDato>, ComparePrioridad> h2;
  84. };
  85.  
  86.  
  87. #endif // HEAPTEMPLATE_H
  88.  
  89.  
  90.  
  91.  
  92.  
  93. /***********************************************************************************************/
  94.  
  95. /**
  96. Caso: Tienda de calcetines “La esquina del calcetín”
  97. Mi suega tiene una tienda de calcetines de marca, pero no solo tiene calcetines (textura),
  98. sino que también tiene boxer(tamaño: s m l xl), pañuelos (motivo), poleras(color), pijamas(largo).
  99. ** se conoce su precio, fecha de ingreso AAAAMMDD y su descripción.
  100. Los productos vienen en cajas y se puede sacar primero el último que ingresaron a la caja.
  101. Se necesita organizar los calcetines por fecha de ingreso, para que los más antiguos sean
  102. los primeros en ofrecerse a los clientes.
  103. >>mostrar y dejar en una estructura en que el primero en llegar es el primero en salir
  104. Llega un cliente difícil y pide ver el calcetín más caro y el más económico.
  105. >>retornar esos calcetines al cliente y mostrar la información.
  106.  
  107. La tienda tiene una bodega estrecha y larga, por lo que los productos se deberán ir
  108. ingresando en este orden: calcetines, poleras boxer.
  109. >>la bodega puede almacenar todo tipo de productos.
  110. Finalmente necesito conocer el total de dinero que tengo al sumar todos los productos
  111. almacenados en la bodega.
  112. **/
  113.  
  114. class Ropa{
  115. public:
  116.     Ropa(){
  117.         precio = 0;
  118.         fecha = 0;
  119.         descripcion = "";
  120.     };
  121.  
  122.     Ropa(int p,int f, string d):precio(p), fecha(f), descripcion(d) {
  123.     };
  124.  
  125.     void setFecha(int valor){
  126.         this->fecha = valor;
  127.     }
  128.  
  129.     void setPrecio(int valor){
  130.         this->precio = valor;
  131.     }
  132.  
  133.     void setDescripcion(string valor){
  134.         this->descripcion = valor;
  135.     }
  136.  
  137.     int getFecha(){
  138.         return fecha;
  139.     }
  140.  
  141.     int getPrecio(){
  142.         return precio;
  143.     }
  144.  
  145.     string getDescripcion(){
  146.         return this->descripcion;
  147.     }
  148.  
  149.     virtual void ver() {
  150.         cout <<"nada"<<endl;
  151.     }
  152.  
  153.     //funcion implementada sólo en el hijo tipo boxer
  154.     virtual string getTamanho(){
  155.         return "";
  156.     };
  157.  
  158. protected:
  159.     int precio;
  160.     int fecha;
  161.     string descripcion;
  162. };
  163.  
  164. class Calcetin: public Ropa{
  165. public:
  166.     Calcetin(){
  167.         textura = "";
  168.     };
  169.  
  170.     Calcetin(int p, int f, string d, string text): Ropa(p,f,d), textura(text) {
  171.     };
  172.  
  173.     void verCalcetin(){
  174.         cout<<textura << "$" << precio << "-" <<fecha<<"-"<<descripcion<<endl;
  175.     }
  176.  
  177.     string toString(){
  178.         return descripcion + " - " + to_string(precio); //concatenar
  179.     }
  180.     void ver(){
  181.         cout <<"calcetin " <<fecha <<" $"<<precio <<" D:"<<descripcion <<endl;
  182.     }
  183.  
  184. private:
  185.     string textura;
  186. };
  187.  
  188. class Polera: public Ropa{
  189. public:
  190.     Polera(){
  191.        tamanho = "";
  192.     };
  193.  
  194.     Polera(int p, int f, string d, string tam): Ropa(p,f,d), tamanho(tam) {
  195.     };
  196.  
  197.     void ver(){
  198.         cout <<"Polera " <<fecha <<" $"<<precio <<" D:"<<descripcion <<endl;
  199.     }
  200.  
  201. private:
  202.     string tamanho;
  203. };
  204.  
  205. class Boxer: public Ropa{
  206. public:
  207.     Boxer(){
  208.         tamanho = "";
  209.     };
  210.  
  211.     Boxer(int p, int f, string d, string tam): Ropa(p,f,d), tamanho(tam) {
  212.     };
  213.  
  214.     void ver(){
  215.         cout <<"Boxer " <<fecha <<" $"<<precio <<endl;
  216.     }
  217.  
  218.     void setTamanho(string valor){
  219.         this->tamanho = valor;
  220.     }
  221.     string getTamanho(){
  222.         return tamanho;
  223.     }
  224.     void largo(){
  225.         cout <<"calculando largo boxer: "<<tamanho<<endl;
  226.     }
  227.  
  228. private:
  229.     string tamanho;
  230. };
  231.  
  232. class Persona {
  233. public:
  234.     Persona(){
  235.         nombre = "";
  236.     }
  237.     Persona(string n){
  238.         nombre = n;
  239.     }
  240.     void setPersona(string n){
  241.         nombre = n;
  242.     }
  243.     string getPersona(){
  244.         return nombre;
  245.     }
  246. private:
  247.     string nombre;
  248. };
  249.  
  250. class Compra {
  251. public:
  252.     Compra(){
  253.         indiceCalcetines = 0;
  254.     };
  255.     void setAgregarCompra(int posicion, Polera ropaAAgregar){
  256.         if(posicion < MAX_POLERAS && posicion > 0)
  257.             carrito[posicion] = ropaAAgregar;
  258.         else
  259.             cout <<"[error] fuera de indice"<<endl;
  260.     }
  261.     Polera getCompra(int posicion) {
  262.         if(posicion < MAX_POLERAS && posicion > 0)
  263.             return carrito[posicion];
  264.         else {
  265.             cout <<"[error] fuera de indice"<<endl;
  266.             return Polera();
  267.         }
  268.     }
  269.  
  270.     void setPersona(string n){
  271.         persona.setPersona(n);
  272.     }
  273.     string getPersona(){
  274.         return persona.getPersona();
  275.     }
  276.  
  277.     void agregarBoxer(Boxer b){
  278.         carritoBoxer.push(b);
  279.     }
  280.  
  281.     Boxer quitarBoxer(){
  282.         if(!carritoBoxer.empty())
  283.             return carritoBoxer.pop();
  284.         else {
  285.             cout << "[error] fuera de indice"<<endl;
  286.             return Boxer();
  287.         }
  288.     }
  289.  
  290.  
  291.     void setAgregarCalcetin(Calcetin nuevoCalcetin){
  292.         if(indiceCalcetines < MAX_CALCETINES && indiceCalcetines >= 0)
  293.             carritoCalcetines[indiceCalcetines++] = nuevoCalcetin;
  294.         else
  295.             cout <<"error";
  296.     }
  297.  
  298.     Calcetin quitarCalcetin() {
  299.         if(indiceCalcetines >= 0) {
  300.             return carritoCalcetines[indiceCalcetines--];
  301.             if(indiceCalcetines < 0)
  302.                 indiceCalcetines = 0;
  303.         }
  304.         else {
  305.             cout <<"fuera de index calcetin";
  306.             return Calcetin();
  307.         }
  308.     }
  309.  
  310. private:
  311.     Persona persona; //composición de clase
  312.  
  313.     static const int MAX_POLERAS = 10;
  314.     Polera carrito[MAX_POLERAS]; //composición de clase utilizando un vector
  315.     Stack<Boxer> carritoBoxer;
  316.  
  317.     static const int MAX_CALCETINES = 100;
  318.     int indiceCalcetines;
  319.     Calcetin carritoCalcetines[MAX_CALCETINES]; //composición de clase utilizando un vector
  320.  
  321. };
  322.  
  323. int main()
  324. {
  325.     //ejemplo básico de Stack
  326.     Stack<int> s;
  327.     s.push(2);
  328.     s.push(3);
  329.     while(s.empty() == false){
  330.         cout <<s.pop();
  331.     }
  332.  
  333.     //ejemplo básico de Cola
  334.     Cola<int> c;
  335.     c.agregar(2125);
  336.     c.agregar(22);
  337.     c.agregar(3323);
  338.     c.agregar(425);
  339.     cout <<endl<<"mostrando cola"<<endl;
  340.     while(!c.vacia()){
  341.         cout << c.extraer()<<endl;
  342.     }
  343.  
  344.     //ejemplo básico de Heap
  345.     cout <<endl<<"mostrando Heap"<<endl;
  346.     Heap<string> h;
  347.     h.agregar("Jorge"   , 5);
  348.     h.agregar("Jeffrey" , 3);
  349.     h.agregar("Pablo"   , 1);
  350.     h.agregar("Cristobal" , 2);
  351.     h.agregar("Samuel" , 2);
  352.     h.agregar("Tomas" , 3);
  353.     while(!h.vacia()){
  354.         cout << h.extraer()<<endl;
  355.     }
  356.  
  357.  
  358.     Stack<Calcetin> cajaCalcetines; //creamos el stack
  359.     Calcetin calcetin1(1000,20201118,"negro con rayas blancas", "suave");
  360.     cajaCalcetines.push(calcetin1);
  361.  
  362.     Calcetin calcetin2(2000,20201117,"amarillo con puntos","suave");
  363.     cajaCalcetines.push(calcetin2);
  364.  
  365.     cout <<calcetin2.getFecha();
  366.     cout <<calcetin2.getPrecio();
  367.     cout <<calcetin2.toString();
  368.     calcetin2.verCalcetin();
  369.  
  370.     cajaCalcetines.push( Calcetin( 2150, 20190103, "Colegio", "Rugoso") );
  371.     cajaCalcetines.push( Calcetin( 2650, 19860113, "Empresa", "Rugoso") );
  372.  
  373.     Cola<Polera> cajaPoleras;
  374.     cajaPoleras.agregar( Polera (1000, 20201010, "Polera de Mr Robot", "xl"));
  375.     cajaPoleras.agregar( Polera (2200, 20201001, "Polera de Pacman", "l"));
  376.  
  377.     Heap<Boxer> cajaBoxer;
  378.     cajaBoxer.agregar( Boxer(2500, 20190101, "Boxer negro", "s") ,1);
  379.     cajaBoxer.agregar( Boxer(2500, 20190101, "Boxer blanco", "l") ,1);
  380.  
  381.     //como realizamos un vector de Boxer
  382.     Boxer vB[10];
  383.     vB[0] = Boxer(2500, 20190101, "Boxer negro", "s");
  384.     vB[1] = Boxer(2500, 20190101, "Boxer negro", "s");
  385.     vB[3] = Boxer(2500, 20190101, "Boxer negro", "s");
  386.  
  387.  
  388.     Heap<Calcetin> ordenador;
  389.  
  390.     cout <<endl<<"Mostrando Stack"<<endl;
  391.  
  392.     while(cajaCalcetines.empty() == false){
  393.         Calcetin auxCalcetin = cajaCalcetines.pop();
  394.         auxCalcetin.verCalcetin();
  395.         cout <<auxCalcetin.toString();
  396.  
  397.         ordenador.agregar( auxCalcetin, auxCalcetin.getPrecio() );
  398.     }
  399.  
  400.     cout <<endl<<" Heap por fecha"<<endl;
  401.  
  402.     while(!ordenador.vacia()){
  403.         Calcetin auxCalcetin = ordenador.extraer();
  404.         auxCalcetin.verCalcetin();
  405.         cajaCalcetines.push(auxCalcetin);
  406.     }
  407.  
  408.     //un stack de ropa en que utilizaremos polimorfismo
  409.     Stack<Ropa *> bodega;
  410.  
  411.     //agregamos calcetines
  412.     bodega.push( new Calcetin( 2150, 20190103, "Colegio", "Rugoso"));
  413.  
  414.     while(!cajaCalcetines.empty()) {
  415.         Calcetin aux = cajaCalcetines.pop();
  416.         bodega.push( new Calcetin(aux) );
  417.     }
  418.  
  419.     //agregamos poleras
  420.     while(!cajaPoleras.vacia()) {
  421.         Polera polera = cajaPoleras.extraer();
  422.         bodega.push( new Polera(polera) ) ;
  423.     }
  424.  
  425.     //agregamos boxer
  426.     while(!cajaBoxer.vacia()) {
  427.         bodega.push( new Boxer(cajaBoxer.extraer()));
  428.     }
  429.  
  430.     Cola<Boxer> nuevaCaja;
  431.  
  432.     cout <<endl<<"mostrando bodega"<<endl;
  433.     while(!bodega.empty()) {
  434.         Ropa *ropa = bodega.pop();
  435.         ropa->ver();
  436.         cout <<"Tipo: ["<<typeid(*ropa).name()<<"]"<<endl;
  437.         string tipo = typeid(*ropa).name();
  438.  
  439.         if(tipo == "5Boxer"){
  440.             cout <<"este es un Boxer tamanho: "<<ropa->getTamanho()<<endl;
  441.             //para traspasar el objeto polimorfico nuevamente a su origen
  442.             //debemos utilizar los getters y setters.
  443.             //En este caso se el método getTamanho sólo esta implementado en la clase Boxer
  444.             Boxer boxerNuevo;
  445.             boxerNuevo.setDescripcion(ropa->getDescripcion());
  446.             boxerNuevo.setFecha(ropa->getFecha());
  447.             boxerNuevo.setPrecio(ropa->getPrecio());
  448.             boxerNuevo.setTamanho(ropa->getTamanho());
  449.             nuevaCaja.agregar(boxerNuevo);
  450.         }
  451.     }
  452.  
  453.     /***********TERCERA PARTE DE LA CLASE Pregunta sobre implementación de composición de clases ****/
  454.  
  455.     cout <<endl<<"implementación de composición de clases"<<endl;
  456.     Polera ropa1;
  457.     Polera ropa2;
  458.  
  459.     Compra compraDelMes;
  460.     compraDelMes.setPersona("Juan Perez");
  461.  
  462.     compraDelMes.setAgregarCompra(1, ropa1);
  463.     compraDelMes.setAgregarCompra(2, ropa2);
  464.  
  465.     Polera ropaComprada = compraDelMes.getCompra(1);
  466.     Polera ropaComprada2 = compraDelMes.getCompra(2);
  467.     Polera ropaComprada3 = compraDelMes.getCompra(3);
  468.  
  469.     compraDelMes.getCompra(1).ver();
  470.  
  471.     compraDelMes.agregarBoxer( Boxer(2500, 20190101, "Boxer negro", "s"));
  472.     compraDelMes.quitarBoxer().ver();
  473.     compraDelMes.quitarBoxer().ver();
  474.     compraDelMes.quitarBoxer().ver();
  475.  
  476.     compraDelMes.setAgregarCalcetin(Calcetin(1000,20201118,"negro con rayas blancas", "suave"));
  477.     Calcetin calcetinVendido = compraDelMes.quitarCalcetin();
  478.     calcetinVendido.ver();
  479.  
  480.     compraDelMes.quitarCalcetin();
  481.  
  482.  
  483.     return 0;
  484. }
  485.  
  486.  
  487.  
  488.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement