[ Foro de Pascal ]

Error en Lista de listas

09-Oct-2013 00:42
Invitado (Emiliano)
3 Respuestas

Hola, tengo un problema con un ejercicio que dice asi:

Se tiene un archivo EMPLEADOS cuyos elementos son registros con los datos de un operario de una fabrica. Los datos son los siguientes:
-Apellido y nombre
-Categoria
-Sueldo
Codifique un programa que lea del archivo EMPLEADOS para generar una lista de categorias, donde, para cada categoria, exista otra lista con los nombres y sueldos de los empleados de la misma ordenada por apellido.

Ese seria el ejercicio, al archivo lo tengo cargado con 6 empleados, lo imprimo para verificarlo y no tengo problemas.
El problema es otro, aca dejo el codigo que use (disculpas por lo largo que es, no encuentro otra forma).


Program P4E4;
type 
	listaemp = ^listaempleados; 
	listaempleados = record
		nombre: string;
		sueldo: integer;
		sigemp: listaemp;
	end;
	
	listacat = ^listacategorias;
	listacategorias = record
		nombrecat: char;
		sigcat: listacat;
		pempleados: listaemp;
	end;
	
	registro = record
		nombre: string;
		sueldo: integer;
		categoria: char;
	end;
	archivo = file of registro;

function ExisteCategoria(Paux: listacat; categoria:char):boolean; 
var Punt: listacat;
	existe: boolean;
begin
	Punt:=Paux;
	existe:= false;
	while (Punt <> nil) and (not existe) do
	begin
		if (Punt^.nombrecat = categoria) then
			existe:= true
		else
			punt:=punt^.sigcat;
	end;	
	ExisteCategoria:=existe;
end;

function BuscarCategoria(Paux: listacat; categoria:char):listacat;
var Punt: listacat;
	existe: boolean;
begin
	Punt:=Paux;
	existe:= false;
	while (Punt <> nil) and (not existe) do
	begin	
		if (Punt^.nombrecat = categoria) then
			existe:= true
		else
			punt:= punt^.sigcat;
	end;
	BuscarCategoria:=punt;
end;

procedure AgregarEmpleado(var PCat: listacat; nombre:string; sueldo:integer);
var auxEmp:listaemp;
	nuevo: listaemp;
	begin
	auxEmp:=Pcat^.pempleados;
	if (auxEmp = nil) or (auxEmp^.nombre > nombre) then
	begin
		new(nuevo);
		nuevo^.nombre:=nombre;
		nuevo^.sueldo:=sueldo;
		nuevo^.sigEmp:=PCat^.pempleados;
		Pcat^.pempleados:=nuevo;
	end
	else
		while (auxEmp^.sigEmp <> nil) and (auxEmp^.sigEmp^.nombre < nombre) do
			auxEmp:=auxEmp^.sigEmp;
		new(nuevo);
		nuevo^.nombre:=nombre;
		nuevo^.sueldo:=sueldo;
		nuevo^.sigEmp:=auxEmp^.sigEmp;
		auxEmp^.sigEmp:=nuevo;
end;

procedure AgregarCategyEmpleado(var lista:listacat; renglon:registro);
var aux:listacat;
	nuevo:listacat; 
begin
	aux:=lista;
	if (aux=nil) then
	begin
		new(nuevo);
		nuevo^.nombrecat:=renglon.categoria;
		nuevo^.sigcat:=nil;
		nuevo^.pempleados:=nil;
		aux:=nuevo; 
		AgregarEmpleado (aux,renglon.nombre,renglon.sueldo);
	end
	else
	begin
		while (aux^.sigcat<>nil) do
			aux:=aux^.sigcat;		
		new(nuevo);
		nuevo^.nombrecat:=renglon.categoria;
		nuevo^.sigcat:=nil;
		nuevo^.pempleados:=nil;
		aux^.sigcat:=nuevo;
		AgregarEmpleado (aux^.sigcat,renglon.nombre,renglon.sueldo);
	end;
end;	

procedure CargarLista (var lista: listacat;var archEmp: archivo);
var renglon: registro; 
	Paux, PCat: listacat;
begin
	assign(archEmp,'Empleados.dat');
	reset(archEmp);
	Paux:= lista;
	while not eof (archEmp) do 
	begin
		read (archEmp, renglon); 
		if (ExisteCategoria(Paux,renglon.categoria)) then 
		begin
			PCat:=BuscarCategoria(Paux,renglon.categoria);
			AgregarEmpleado(PCat,renglon.nombre,renglon.sueldo);
		end
		else
			AgregarCategyEmpleado(lista,renglon); 
	end;
	close(archEmp);
end;

procedure mostrarlista(puntero:Listacat);
var aux:listacat;
begin
	aux:=puntero;
	while aux <> nil do
	begin
		writeln(aux^.nombrecat);
		writeln(aux^.pempleados^.nombre);
		writeln(aux^.pempleados^.sueldo);
		aux:=aux^.sigcat;
	end;
end;

var archEmp: archivo;
	Lista: listacat;
begin
	lista:=nil;
	cargarlista(Lista,archEmp);
	mostrarlista(lista);
end.


(Para el procedure AgregarEmpleado tengo dos diferentes, creo que los dos andan y el que copie es el mas conveniente).

GRACIAS.


12-Oct-2013 21:28
Nacho Cabanes (+84)

Pero... ¿cuál es la duda?


13-Oct-2013 06:11
Invitado (Emiliano)

El problema que tengo es que no anda, puedo compilar y crear el .exe, pero cuando lo pruebo me tira error y no se cual es el mismo.


13-Oct-2013 21:57
Nacho Cabanes (+84)

El mensaje de error ayudaría a saber qué está pasando. Aun así, en un programa con punteros lo habitual es que tengas un puntero con valor incorrecto.

Si usas un entorno integrado, puedes probar a usar el depurador paso a paso para ver los valores de las variables. Si no es así, siempre te queda el recurso de añadir líneas adicionales que te muestren en pantalla qué está ocurriendo con tu programa: cosas como


procedure mostrarlista(puntero:Listacat);
var aux:listacat;
begin
	WriteLn('Entrando a mostrarlista. Puntero vale: ', puntero);
	aux:=puntero;
	...


Líneas como esas te avisarían de cuando entras a cada función y de qué valor tienen los parámetros. Eso te ayudará a saber en qué momento falla tu programa y por qué.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)