Foros del Web » Programación para mayores de 30 ;) » C/C++ »

donde tengo el error??

Estas en el tema de donde tengo el error?? en el foro de C/C++ en Foros del Web. hola de nuevos a todos, estoy realizando un programa que me muestre mediante un fichro los trabajadores que hay en la empresa y su saldo, ...
  #1 (permalink)  
Antiguo 21/08/2008, 11:52
 
Fecha de Ingreso: agosto-2008
Mensajes: 28
Antigüedad: 15 años, 7 meses
Puntos: 0
Pregunta donde tengo el error??

hola de nuevos a todos, estoy realizando un programa que me muestre mediante un fichro los trabajadores que hay en la empresa y su saldo, pero cuando compilo y elijo la opcion de mostrar listado me sale solo el nombre de uno de ellos, ¿porque puede ser? aqui dejo mi programa para que le echeis un vistazo muchas gracias.

#include <iostream>
using namespace std;
#include <stdlib.h>
#include <string>
#include <fstream>

struct Valor
{
string nombre;
float sueldo;
};

struct Nodo;

typedef Nodo *Pnodo;

struct Nodo
{
Valor info;
Pnodo sig;
};

typedef Pnodo Lista;


void leer_lista (Lista &);
void Lista_empleados (Lista );
void buscar_SueldoEmpleado(Lista );
void Introducir_empleado (Lista & );
void guardar_informacionempleados (Lista );


void leer_lista (Lista &l)
{
ifstream entrada;
Pnodo nuevo, anterior;
string nombre;
float sueldo;

entrada.open ("trabajadores.txt");

if(!entrada)
cout << "Error al abrir el fichero" << endl;

entrada >> nombre;
entrada >> sueldo;

while (!entrada.eof())
{
entrada >> nombre;
entrada >> sueldo;
}

nuevo=new (Nodo);
(*nuevo).info.nombre=nombre;
(*nuevo).info.sueldo=sueldo;

if (l==NULL)
l=nuevo;

else
{
(*anterior).sig=nuevo;
anterior=nuevo;
}

(*nuevo).sig=NULL;



entrada.close();

return;
}

void Lista_empleados (Lista l)
{

while (l != NULL)
{
cout << "Nombre: " << (*l).info.nombre << endl;
cout << "Sueldo: " << (*l).info.sueldo << endl;
l=(*l).sig;
}


return;

}


void buscar_SueldoEmpleado(Lista l)
{
string nombre;
bool encontrado;
encontrado = false;
Pnodo ant;

cout << "Introduce el nombre del empleado que quieres buscar : "<< endl;
cin >> nombre;

while ((l != NULL )&& (!encontrado))
{
if ((*l).info.nombre == nombre)
{
encontrado = true;
}
else
{
ant =l;
l=(*l).sig;
}
}

if (encontrado == true)
{
cout << "El trabajador se encuentra en la lista" << endl;
cout << "su sueldo es de " << (*l).info.sueldo << " €" << endl;
}

else
cout << "El trabajador no se encuentra en la lista" << endl;


return;

}

void Introducir_empleado (Lista & l)
{
string nombre;
float sueldo;
Pnodo anterior, nuevo;
char c;

do
{

cout << "Introduce el nombre del nuevo empleado: ";
cin >> nombre;
cout << "Introduce su sueldo: ";
cin >> sueldo;

nuevo = new(Nodo);
(*nuevo).info.nombre = nombre;
(*nuevo).info.sueldo = sueldo;


if (l==NULL)
l = nuevo;

else
(*anterior).sig=nuevo;
anterior=nuevo;

(*nuevo).sig=NULL;

cout << "Has acabado? (s/S)" << endl;
cin >> c;

}while ((c != 's') && (c != 'S'));



return;
}

void guardar_informacionempleados (Lista l)
{

ofstream salida;

salida.open ("informacionempleados.txt");

if(!salida)
cout << "error al abrir el fichero" << endl;

while (l != NULL)
{
salida << (*l).info.nombre << endl;
salida << (*l).info.sueldo << endl;
l=(*l).sig;
}

salida.close();

return;
}

int main (void)
{
int x;
Lista l;
l=NULL;

leer_lista(l);
do
{
cout << "Introduce la opcion que deseas realizar: " << endl;
cout << "1-Realizar un listado de los empleados" << endl;
cout << "2-Buscar el sueldo de un empleado " << endl;
cout << "3-Añadir un nuevo empleado" << endl;
cout << "4-Guardar la informacion de los empleados " << endl;
cout << "5-Salir" << endl;

cin >> x;


switch (x)
{
case 1:
Lista_empleados (l);
break;


case 2:
buscar_SueldoEmpleado(l);
break;

case 3:
Introducir_empleado (l);
break;

case 4:
guardar_informacionempleados (l);
break;
default :;
}

}while (x!=5);

system ("pause");
return 0;
}
  #2 (permalink)  
Antiguo 21/08/2008, 18:41
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: donde tengo el error??

Son unos detalles al abrir el archivo, en la función leer_lista:

Código:
	// Las siguientes dos lineas no van, causan un error al leer
	//entrada >> nombre;
	//entrada >> sueldo;

	while (!entrada.eof()) {
		entrada >> nombre;
		entrada >> sueldo;
		if(entrada.eof()) break; // Agregué esto, evita que se lea el último empleado dos veces.

		nuevo=new (Nodo);
		(*nuevo).info.nombre=nombre;
		(*nuevo).info.sueldo=sueldo;

		if (l==NULL) {
			l=nuevo;
			anterior=nuevo; // Faltaba esto, porque sino cuando se ingrese el siguiente empleado fallará la instrucción (*anterior).sig=nuevo; porque anterior no va ha estar inicializado.
		} else {
			(*anterior).sig=nuevo;
			anterior=nuevo;
		}

		(*nuevo).sig=NULL;
        
	} // Hasta aquí es donde debe llegar el while 
Saludos.
  #3 (permalink)  
Antiguo 22/08/2008, 08:31
 
Fecha de Ingreso: agosto-2008
Mensajes: 28
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: donde tengo el error??

ok no me di cuenta de ese detalle, pero una cosita ahora el programa lo que me hace es lo siguiente me enseña la lista de empleados que hay, pero si yo pongo añadir empleado y añado por ejemplo Eva y de sueldo 100 y luego pongo la opcion ver listado... este nuevo empleado, es decir, Eva no me sale ¿porque puede ser?

Grax
  #4 (permalink)  
Antiguo 22/08/2008, 18:35
 
Fecha de Ingreso: junio-2008
Mensajes: 63
Antigüedad: 15 años, 8 meses
Puntos: 2
Respuesta: donde tengo el error??

En la función Introducir_empleado estás usando la variable "anterior" sin inicializarla, solo tienes que obtener el último de los empleados en la lista y asignarselo a "anterior" así:

Código:
	...
	...
	Pnodo anterior, nuevo;
	char c;

	for(anterior=l; anterior; anterior=anterior->sig)
		if(!anterior->sig) break;

	do {
		cout << "Introduce el nombre del nuevo empleado: ";
	...
	...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:22.