SHARE
TWEET

Untitled

a guest Nov 22nd, 2019 185 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Matias Proietti 160.096-5
  2.  
  3. // pablosz@gmail.com
  4. #ifndef _MAIN
  5. #define _MAIN
  6.  
  7. #include <iostream>
  8. #include "biblioteca/tads/Arr.hpp"
  9. #include "biblioteca/tads/Map.hpp"
  10. #include "biblioteca/tads/List.hpp"
  11. #include "biblioteca/tads/Stack.hpp"
  12. #include "biblioteca/tads/Queue.hpp"
  13. #include "biblioteca/funciones/strings.hpp"
  14. #include "biblioteca/funciones/tokens.hpp"
  15. #include "biblioteca/funciones/files.hpp"
  16. using namespace std;
  17.  
  18. /* listNext empieza por el valor 0. Es decir listNext devuelve 0 y despues
  19.  * se mueve a 1
  20.  *
  21.  * Seek empieza por el valor 0
  22.  * fileSize retorna la cantidad de elementos de tipo T que contiene el file
  23.  */
  24.  
  25. template <typename T>
  26. T tail(Node<T>*& p, Node<T>*& q)
  27. {
  28.    // retorna (sin desencolar) el valor del ultimo elemento de la cola
  29.    return q->info;
  30. }
  31.  
  32. // Estructuras por defecto
  33. struct FechaHora
  34. {
  35. };
  36.  
  37. struct Llamada
  38. {
  39.    int nroOri;
  40.    int nroDes;
  41.    int min;
  42.    FechaHora fec;
  43. };
  44.  
  45. struct Abonado
  46. {
  47.    // ordenado x idAbo
  48.    int idAbo;
  49.    int nroCel;
  50.    int idPlan;
  51.    string nombre;
  52.    string direcc;
  53. };
  54.  
  55. struct Plan
  56. {
  57.    int idPlan;
  58.    string desc;
  59.    double valor;
  60.    int minLibres;
  61.    double minExed;
  62.    bool comunidad;
  63. };
  64.  
  65. // Estructuras propias
  66. struct Titular
  67. {
  68.    int nroOri;
  69.    int mins;
  70.    string nombre;
  71. };
  72.  
  73. struct Inconsistente
  74. {
  75.    int nroOri;
  76.    Arr<int> celulares;
  77.    Arr<FechaHora> fechas;
  78. };
  79.  
  80.  
  81. string fechaToString(FechaHora a)
  82. {
  83.    return "hardcodeado";
  84. }
  85.  
  86. int fechaHoraCmp(FechaHora a, FechaHora b)
  87. {
  88.    return 1;
  89. }
  90.  
  91. template<typename T,typename K>
  92. int cmpInt(T a, K b)
  93. {
  94.    return a.nroOri - b;
  95. }
  96.  
  97. int main()
  98. {
  99.    // Se abren los archivos y se crean las listas necesarias
  100.    FILE* fLlam = fopen("LLAMADAS.DAT", "r+b");
  101.    FILE* fAbon = fopen("ABONADOS.DAT", "r+b");
  102.    FILE* fPlan = fopen("PLANES.DAT", "r+b");
  103.    List<Titular> titulares = listCreate<Titular>();
  104.    List<Inconsistente> inconsistentes = listCreate<Inconsistente>();
  105.  
  106.    // Se inicializan las variables a utilizar (algunas se podrian reusar pero
  107.    // para ayudar a la legibilidad se dejan separadas).
  108.    // Algunas podrian no llegar a usarse segun los datos de la compania telefonica
  109.    // se inicializan todas para ayudar a la legibilidad del codigo.
  110.    FechaHora ultimaFecha;
  111.    bool pertenece = false;
  112.    bool primerRun = true;
  113.    Llamada llamada;
  114.    Abonado abonado;
  115.    Titular* aux1;
  116.    Titular* nuevo;
  117.    Inconsistente* aux2;
  118.    Inconsistente* nuevoInc;
  119.    Arr<int> nuevocelulares;
  120.    Arr<FechaHora> nuevofechas;
  121.    Titular* aux3;
  122.    Inconsistente* aux4;
  123.    int length;
  124.    int celular;
  125.    FechaHora fecha;
  126.  
  127.    for (int i=0; i<fileSize<Llamada>(fLlam);i++)
  128.    {
  129.       // Workaround para evitar un skip de llamada.
  130.       // En el primer loop lee el proximo y asigna la ultfecha
  131.       if (primerRun)
  132.       {
  133.          llamada = read<Llamada>(fLlam);
  134.          ultimaFecha = llamada.fec;
  135.          primerRun = false;
  136.       }
  137.       // Lee las llamadas y opera hasta que la fecha cambie
  138.       while ((fechaHoraCmp(ultimaFecha, llamada.fec)==0) and (i<fileSize<Llamada>(fLlam)))
  139.       {
  140.          // Buscar el numero de origen de la llamada en la lista de abonados
  141.          // para ver si pertenece a la compania
  142.          for (int j=0; j<fileSize<Abonado>(fAbon);j++)
  143.          {
  144.             abonado = read<Abonado>(fAbon);
  145.             if (abonado.nroCel == llamada.nroOri)
  146.             {
  147.                pertenece = true;
  148.                break;
  149.             }
  150.          }
  151.          seek<Abonado>(fAbon, 0);
  152.          if (pertenece)
  153.          {
  154.             pertenece = false;
  155.             // Revisar que no este en la lista de titulares
  156.             aux1 = listFind<Titular, int>(titulares, llamada.nroOri, cmpInt);
  157.             if (aux1!=NULL)
  158.             {
  159.                // Si ya esta en la lista, solo sumar minutos
  160.                aux1->mins = aux1->mins + llamada.min;
  161.             }
  162.             else
  163.             {
  164.                // Si no esta en la lista, agregar a la lista
  165.                nuevo = new Titular();
  166.                nuevo->mins = llamada.min;
  167.                nuevo->nombre = abonado.nombre;
  168.                nuevo->nroOri = llamada.nroOri;
  169.                listAdd<Titular>(titulares, *nuevo);
  170.             }
  171.          }
  172.          else
  173.          {
  174.             // Si no pertenece debo registrar los llamados y las fechas
  175.             // Revisar que no este en la lista de inconsistentes
  176.             aux2 = listFind<Inconsistente, int>(inconsistentes, llamada.nroOri, cmpInt);
  177.             if (aux2!=NULL)
  178.             {
  179.                // Si ya esta en la lista, solo agregar llamada y fecha a los arrays
  180.                arrAdd<int>(aux2->celulares, llamada.nroDes);
  181.                arrAdd<FechaHora>(aux2->fechas, llamada.fec);
  182.             }
  183.             else
  184.             {
  185.                // Si no esta en la lista, agregar a la lista
  186.                nuevocelulares = arrCreate<int>(50);
  187.                nuevofechas = arrCreate<FechaHora>(50);
  188.                arrAdd<int>(nuevocelulares, llamada.nroDes);
  189.                arrAdd<FechaHora>(nuevofechas, llamada.fec);
  190.  
  191.                nuevoInc = new Inconsistente();
  192.                nuevoInc->nroOri = llamada.nroOri;
  193.                nuevoInc->celulares = nuevocelulares;
  194.                nuevoInc->fechas = nuevofechas;
  195.  
  196.                listAdd<Inconsistente>(inconsistentes, *nuevoInc);
  197.             }
  198.          }
  199.          // Pasar a la siguiente llamada
  200.          llamada = read<Llamada>(fLlam);
  201.       }
  202.       // Si llegue aca es porque cambio la fecha.
  203.       // Hago output de la lista de titulares.
  204.       cout << "Fecha: " << fechaToString(ultimaFecha) << endl;
  205.       cout << "+-------+--------+-------+" << endl;
  206.       cout << "|Titular|Nro. Cel|Sum Min|" << endl;
  207.       cout << "+-------+--------+-------+" << endl;
  208.       while (listHasNext<Titular>(titulares))
  209.       {
  210.          aux3 = listNext<Titular>(titulares);
  211.          cout << "|" << aux3->nombre << "|" << aux3->nroOri << "|" << aux3->mins << "|" << endl;
  212.       }
  213.       cout << "+-------+--------+-------+" << endl;
  214.       cout << endl << endl;
  215.       listReset<Titular>(titulares);
  216.       // Vacio la lista para comenzar con la siguiente fecha
  217.       listFree<Titular>(titulares);
  218.    }
  219.  
  220.    // Una vez que termino, imprimo la lista de inconsistentes
  221.    cout << endl << endl << endl;
  222.    cout << "+----------+--------------------------------+" << endl;
  223.    cout << "|Numero Cel|Llamadas Realizadas             |" << endl;
  224.    cout << "+----------+--------------------------------+" << endl;
  225.    while (listHasNext<Inconsistente>(inconsistentes))
  226.    {
  227.       aux4 = listNext<Inconsistente>(inconsistentes);
  228.       cout << "|" << aux4->nroOri << "|";
  229.       length = arrLength<int>(aux4->celulares);
  230.       for (int i=0; i<length;i++)
  231.       {
  232.          celular = *arrGet<int>(aux4->celulares, i);
  233.          fecha = *arrGet<FechaHora>(aux4->fechas, i);
  234.          cout << "(" << celular << "," << fechaToString(fecha) << ")";
  235.          if (i<length-1)
  236.             cout << ", ";
  237.       }
  238.       cout << "|" << endl;
  239.    }
  240.    cout << "+----------+--------------------------------+" << endl;
  241.    cout << endl << endl;
  242.    fclose(fLlam);
  243.    fclose(fAbon);
  244.    fclose(fPlan);
  245.    return 0;
  246. }
  247.  
  248. #endif
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top