Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kougami en 21 Abril 2017, 16:56 pm



Título: AYUDA Problema con dos listas ordenadas C++
Publicado por: Kougami en 21 Abril 2017, 16:56 pm
Buenas, tengo un problema, teniendo dos listas ordenadas, correspondientes al siguietne codigo:
Código
  1. const int MAX_M = 20;
  2.  
  3. const int MAX_V = 100;
  4.  
  5. typedef struct {
  6. int codigo;
  7. string nombre;
  8. }tMueble;
  9.  
  10. typedef tMueble losMuebles[MAX_M];
  11.  
  12. typedef struct {
  13. losMuebles muebles;
  14. int tamLM;
  15. }tListaM;
  16.  
  17. typedef struct {
  18. int anyo;
  19. int mes;
  20. int dia;
  21. }tFecha;
  22.  
  23. typedef struct {
  24. int codigo;
  25. tFecha fecha;
  26. int unidades;
  27. }tVenta;
  28.  
  29. typedef tVenta lasVentas[MAX_V];
  30.  
  31. typedef struct {
  32. lasVentas ventas;
  33. int tamLV;
  34. }tListaV;
  35.  

Cada lista lee un archivo distinto:
La primera lista, tListaM, lee un archivo que contiene solamente un codigo de 4 digitos y una cadena de caracter que es el nombre.
La segunda lista, tListaV, lee un archivo que contiene una fecha en formato aa/mm/dd, un codigo de 4 digitos, que puede corresponder o no, a algun codigo de la lista anterior; y por ultimo un numero entero.

Lo lee correctamente y todo, pero ahora tengo que hacer que se muestre la lista de las ventas, pero de otro modo: tiene que mostrar primero las fechas, luego en vez del codigo de 4 digitos, tiene que buscar en la lista tListaM, si el codigo está o no, y si esta mostrar el nombre asociado a dicho codigo, y sino esta, mostrar ERROR, y luego mostrar el numero de unidades asociado al codigo.

Los archivos podrian ser:

lista1.txt
1325 Mesita de Cama
2176 Cama de Matrimonio
-1

lista2.txt
17/02/01 7737 5
17/01/22 1325 2
15/12/23 2176 6
-1

Ambos archivos tienen el -1 como centinela

Muchas gracias de antemano


Título: Re: AYUDA Problema con dos listas ordenadas C++
Publicado por: MAFUS en 21 Abril 2017, 21:27 pm
Vaya, veo que complicas mucho el sistema de datos. Es mala práctica ocultar punteros y arrays detrás de typedefs


Título: Re: AYUDA Problema con dos listas ordenadas C++
Publicado por: Kougami en 22 Abril 2017, 00:38 am
Bueno, es lo que me piden hacer, y en mi caso, o sigo el formato que me dicen o suspenso jajajajajaj


Título: Re: AYUDA Problema con dos listas ordenadas C++
Publicado por: MAFUS en 22 Abril 2017, 01:02 am
¿Y que tienes hasta ahora?


Título: Re: AYUDA Problema con dos listas ordenadas C++
Publicado por: Kougami en 22 Abril 2017, 14:31 pm
Mira, este es todo el codigo que llevo escrito:

Código
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <cmath>
  5. #include <iomanip>
  6. using namespace std;
  7.  
  8. /**CONSTANTES Y TYPEDEFS**/
  9.  
  10. const int MAX_M = 20;
  11.  
  12. const int MAX_V = 100;
  13.  
  14. typedef struct {
  15. int codigo;
  16. string nombre;
  17. }tMueble;
  18.  
  19. typedef tMueble losMuebles[MAX_M];
  20.  
  21. typedef struct {
  22. losMuebles muebles;
  23. int tamLM;
  24. }tListaM;
  25.  
  26. typedef struct {
  27. int anyo;
  28. int mes;
  29. int dia;
  30. }tFecha;
  31.  
  32. typedef struct {
  33. int codigo;
  34. tFecha fecha;
  35. int unidades;
  36. }tVenta;
  37.  
  38. typedef tVenta lasVentas[MAX_V];
  39.  
  40. typedef struct {
  41. lasVentas ventas;
  42. int tamLV;
  43. }tListaV;
  44.  
  45. /**DESARROLLO DE LAS FUNCIONES**/
  46.  
  47. void inicializarListaM(tListaM& listaM) {
  48. listaM.tamLM = 0;
  49. }
  50.  
  51. void inicializarListaV(tListaV& listaV) {
  52. listaV.tamLV = 0;
  53. }
  54.  
  55. void anyadirMueble(tListaM& listaM, const tMueble& elMueble) {
  56. listaM.muebles[listaM.tamLM] = elMueble;
  57. listaM.tamLM++;
  58. }
  59.  
  60. void anyadirVenta(tListaV& listaV, const tVenta& laVenta) {
  61. listaV.ventas[listaV.tamLV] = laVenta;
  62. listaV.tamLV++;
  63. }
  64.  
  65.  
  66. void leerFecha(ifstream& fichV, tFecha& laFecha) {
  67. char sepa;
  68. fichV >> laFecha.anyo;
  69. fichV.get(sepa);
  70. fichV >> laFecha.mes;
  71. fichV.get(sepa);
  72. fichV>> laFecha.dia;
  73. }
  74.  
  75. void leerMueble(ifstream& fichM, tMueble& elMueble) {
  76. string nombre;
  77. char aux;
  78. fichM >> elMueble.codigo;
  79. fichM.get(aux);
  80. getline(fichM, elMueble.nombre);
  81. }
  82.  
  83. void leerVenta(ifstream& fichV, tVenta& laVenta) {
  84. char aux;
  85. fichV >> laVenta.codigo;
  86. leerFecha(fichV, laVenta.fecha);
  87. fichV >> laVenta.unidades;
  88. }
  89.  
  90. void leerMuebles(ifstream& fichM, tListaM& listaM) {
  91. tMueble elMueble;
  92. leerMueble(fichM, elMueble);
  93. while (elMueble.codigo != -1) {
  94. anyadirMueble(listaM, elMueble);
  95. leerMueble(fichM, elMueble);
  96. }
  97. fichM.close();
  98. }
  99.  
  100. void leerVentas(ifstream& fichV, tListaV& listaV) {
  101. tVenta laVenta;
  102. leerVenta(fichV, laVenta);
  103. while (laVenta.codigo != -1) {
  104. anyadirVenta(listaV, laVenta);
  105. leerVenta(fichV, laVenta);
  106. }
  107. fichV.close();
  108. }
  109.  
  110. void mostrarMuebles(const tListaM& listaM) {
  111. for (int i = 0; i < listaM.tamLM; i++) {
  112. cout << listaM.muebles[i].codigo  <<" "<< listaM.muebles[i].nombre << endl;
  113. }
  114. }
  115.  
  116. void mostrarFecha(const tListaV& listaV) {
  117. int i;
  118. i = 0;
  119. cout << listaV.ventas[i].fecha.anyo << "/"<< listaV.ventas[i].fecha.mes << "/" << listaV.ventas[i].fecha.dia;
  120. }
  121.  
  122. void mostrarVentas(const tListaV& listaV) {
  123. for (int i = 0; i < listaV.tamLV; i++) {
  124. mostrarFecha(listaV);
  125. cout << setw(5) << listaV.ventas[i].codigo << setw(5) << listaV.ventas[i].unidades << endl;
  126. }
  127. }
  128.  
  129. void mezcla(tListaM& listaM, tListaV& listaV) {
  130. int posM;
  131. int posV;
  132. posM = 0;
  133. posV = 0;
  134. while (posV < listaV.tamLV) {
  135. if (listaM.muebles[posM].codigo != listaV.ventas[posV].codigo) {
  136. cout << "ERROR" << endl;
  137. posM++;
  138. }
  139. else {
  140. cout << listaM.muebles[posM].nombre << " " << listaV.ventas[posV].unidades << " unidades" << endl;
  141. posV++;
  142. }
  143. }
  144. }
  145.  
  146. int main(int argc, char** args) {
  147. setlocale(LC_ALL, "spanish");
  148. ifstream fichM;
  149. fichM.open("muebles.txt");
  150. ifstream fichV;
  151. fichV.open("ventas.txt");
  152. tListaV listaV;
  153. tListaM listaM;
  154. inicializarListaM(listaM);
  155. leerMuebles(fichM, listaM);
  156. inicializarListaV(listaV);
  157. leerVentas(fichV, listaV);
  158. mostrarMuebles(listaM);
  159. mostrarVentas(listaV);
  160. mezcla(listaM, listaV);
  161. system("pause");
  162. return 0;
  163. }
  164.  


Título: Re: AYUDA Problema con dos listas ordenadas C++
Publicado por: MAFUS en 23 Abril 2017, 01:02 am
El programa, tal y como está, a mi no me lee bien. leerMuebles me da fallo de segmento.

Haciendo el ejercicio para mí y adaptando el código al C he dado con estos errores:
Tú dices que lista2.txt tiene este formato
Citar
17/02/01 7737 5
17/01/22 1325 2
15/12/23 2176 6
pero tu código lee primero el código
Código
  1. void leerVenta(ifstream& fichV, tVenta& laVenta) {
  2. char aux;
  3. fichV >> laVenta.codigo;
  4. leerFecha(fichV, laVenta.fecha);
  5. fichV >> laVenta.unidades;
  6. }
por lo tanto el orden de los datos difiere del archivo con los de tu programa.

Sea como sea cuándo leas del archivo y al encontrarte con el marcador -1 no debes leer más allá,  sin embargo en el código de las funciones leerVenta y leerMueble aunque leas dicho marcador sigues leyendo datos del archivo aunque estos no existan.


Título: Re: AYUDA Problema con dos listas ordenadas C++
Publicado por: Kougami en 24 Abril 2017, 09:41 am
El leerVenta, unicamente lee una venta, y si, la leer en orden distinto a como aparece en el archivo, luego en el leerVentas, es el que lee todas las ventas, y para al leer -1 por la condicion de while(venta.codigo != -1)


Título: Re: AYUDA Problema con dos listas ordenadas C++
Publicado por: MAFUS en 24 Abril 2017, 15:41 pm
Pues todo ese planteamiento está mal.
El archivo debe leerse en el orden en que está configurado y no debes leer más allá de su final.