AYUDA Problema con dos listas ordenadas C++

Iniciado por Kougami, 21 Abril 2017, 16:56 PM

0 Miembros y 1 Visitante están viendo este tema.

Kougami

Buenas, tengo un problema, teniendo dos listas ordenadas, correspondientes al siguietne codigo:
Código (cpp) [Seleccionar]

const int MAX_M = 20;

const int MAX_V = 100;

typedef struct {
int codigo;
string nombre;
}tMueble;

typedef tMueble losMuebles[MAX_M];

typedef struct {
losMuebles muebles;
int tamLM;
}tListaM;

typedef struct {
int anyo;
int mes;
int dia;
}tFecha;

typedef struct {
int codigo;
tFecha fecha;
int unidades;
}tVenta;

typedef tVenta lasVentas[MAX_V];

typedef struct {
lasVentas ventas;
int tamLV;
}tListaV;


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

MAFUS

Vaya, veo que complicas mucho el sistema de datos. Es mala práctica ocultar punteros y arrays detrás de typedefs

Kougami

Bueno, es lo que me piden hacer, y en mi caso, o sigo el formato que me dicen o suspenso jajajajajaj

MAFUS


Kougami

Mira, este es todo el codigo que llevo escrito:

Código (cpp) [Seleccionar]

#include <iostream>
#include <fstream>
#include <string>
#include <cmath>
#include <iomanip>
using namespace std;

/**CONSTANTES Y TYPEDEFS**/

const int MAX_M = 20;

const int MAX_V = 100;

typedef struct {
int codigo;
string nombre;
}tMueble;

typedef tMueble losMuebles[MAX_M];

typedef struct {
losMuebles muebles;
int tamLM;
}tListaM;

typedef struct {
int anyo;
int mes;
int dia;
}tFecha;

typedef struct {
int codigo;
tFecha fecha;
int unidades;
}tVenta;

typedef tVenta lasVentas[MAX_V];

typedef struct {
lasVentas ventas;
int tamLV;
}tListaV;

/**DESARROLLO DE LAS FUNCIONES**/

void inicializarListaM(tListaM& listaM) {
listaM.tamLM = 0;
}

void inicializarListaV(tListaV& listaV) {
listaV.tamLV = 0;
}

void anyadirMueble(tListaM& listaM, const tMueble& elMueble) {
listaM.muebles[listaM.tamLM] = elMueble;
listaM.tamLM++;
}

void anyadirVenta(tListaV& listaV, const tVenta& laVenta) {
listaV.ventas[listaV.tamLV] = laVenta;
listaV.tamLV++;
}


void leerFecha(ifstream& fichV, tFecha& laFecha) {
char sepa;
fichV >> laFecha.anyo;
fichV.get(sepa);
fichV >> laFecha.mes;
fichV.get(sepa);
fichV>> laFecha.dia;
}

void leerMueble(ifstream& fichM, tMueble& elMueble) {
string nombre;
char aux;
fichM >> elMueble.codigo;
fichM.get(aux);
getline(fichM, elMueble.nombre);
}

void leerVenta(ifstream& fichV, tVenta& laVenta) {
char aux;
fichV >> laVenta.codigo;
leerFecha(fichV, laVenta.fecha);
fichV >> laVenta.unidades;
}

void leerMuebles(ifstream& fichM, tListaM& listaM) {
tMueble elMueble;
leerMueble(fichM, elMueble);
while (elMueble.codigo != -1) {
anyadirMueble(listaM, elMueble);
leerMueble(fichM, elMueble);
}
fichM.close();
}

void leerVentas(ifstream& fichV, tListaV& listaV) {
tVenta laVenta;
leerVenta(fichV, laVenta);
while (laVenta.codigo != -1) {
anyadirVenta(listaV, laVenta);
leerVenta(fichV, laVenta);
}
fichV.close();
}

void mostrarMuebles(const tListaM& listaM) {
for (int i = 0; i < listaM.tamLM; i++) {
cout << listaM.muebles[i].codigo  <<" "<< listaM.muebles[i].nombre << endl;
}
}

void mostrarFecha(const tListaV& listaV) {
int i;
i = 0;
cout << listaV.ventas[i].fecha.anyo << "/"<< listaV.ventas[i].fecha.mes << "/" << listaV.ventas[i].fecha.dia;
}

void mostrarVentas(const tListaV& listaV) {
for (int i = 0; i < listaV.tamLV; i++) {
mostrarFecha(listaV);
cout << setw(5) << listaV.ventas[i].codigo << setw(5) << listaV.ventas[i].unidades << endl;
}
}

void mezcla(tListaM& listaM, tListaV& listaV) {
int posM;
int posV;
posM = 0;
posV = 0;
while (posV < listaV.tamLV) {
if (listaM.muebles[posM].codigo != listaV.ventas[posV].codigo) {
cout << "ERROR" << endl;
posM++;
}
else {
cout << listaM.muebles[posM].nombre << " " << listaV.ventas[posV].unidades << " unidades" << endl;
posV++;
}
}
}

int main(int argc, char** args) {
setlocale(LC_ALL, "spanish");
ifstream fichM;
fichM.open("muebles.txt");
ifstream fichV;
fichV.open("ventas.txt");
tListaV listaV;
tListaM listaM;
inicializarListaM(listaM);
leerMuebles(fichM, listaM);
inicializarListaV(listaV);
leerVentas(fichV, listaV);
mostrarMuebles(listaM);
mostrarVentas(listaV);
mezcla(listaM, listaV);
system("pause");
return 0;
}

MAFUS

#5
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
Citar17/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 (c++) [Seleccionar]
void leerVenta(ifstream& fichV, tVenta& laVenta) {
char aux;
fichV >> laVenta.codigo;
leerFecha(fichV, laVenta.fecha);
fichV >> laVenta.unidades;
}

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.

Kougami

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)

MAFUS

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.