Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2019
839
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.15 KB | None | 0 0
  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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement