[ Foro de Pascal ]
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.
Pero... ¿cuál es la duda?
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.
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.)