Elementos de Programación / Prof. Carlos Iván Chesñevar / 1er

Anuncio
Elementos de Programación / Prof. Carlos Iván Chesñevar / 1er. Cuat. 2000 / UNS
Pag 1
UN EJEMPLO DE USO DE PUNTEROS
Una empresa desea mantener una tabla con datos de sus empleados. Para cada empleado se desea registrar su nombre,
su edad y su domicilio. Cada empleado tiene asociado un número de legajo. A medida que se van incorporando
empleados a la empresa, cada uno recibe un nuevo número de legajo. Eventualmente, el empleado puede ser dado de
baja (en cuyo caso, su número de legajo nunca vuelve a ser utilizado nuevamente).
Estructura de datos utilizada: un arreglo con punteros a registros, cada uno de los cuales contiene los datos de una
persona. Gráficamente:
Tabla T
Datos
Persona 1
...
Datos
Persona 3
Los registros que contendrán datos de
personas irán siendo creados dinámicamente
a medida que sean necesarios. Si hay un
máximo de TopeLegajo legajos, el arreglo
ocupará en principio un espacio necesario
para TopeLegajo punteros.
PROGRAM ManejoPersonas;
CONST
TopeCadena = 20;
TopeLegajo = 1000;
TYPE
TCadena
= string[TopeCadena];
TNombre
= TCadena;
TEdad
= 0..120;
TRangoLegajo = 1..TopeLegajo;
TPersona
= RECORD
Nombre
:TNombre;
Edad
:TEdad;
Domicilio:TCadena;
END;
TPunteroPersona = ^TPersona;
TDatos = ARRAY [TRangoLegajo] of TPunteroPersona;
TTabla = RECORD
Datos: TDatos;
UltimoLegajoIngresado: 0..TopeLegajo;
END;
TOpcion = (AltaPersona, BajaPersona, ListarLegajos, Salir);
VAR
T:TTabla;
Opcion:TOpcion;
{****************************************************************}
Procedure InicializarTabla(VAR T:TTabla);
{ inicializa la tabla con punteros "nil", y considera que el
UltimoLegajoIngresado en 0 }
Var i:TRangoLegajo;
Begin
For i:=1 to TopeLegajo
do
T.Datos[i] := nil;
T.UltimoLegajoIngresado := 0;
Elementos de Programación / Prof. Carlos Iván Chesñevar / 1er. Cuat. 2000 / UNS
End; { InicializarTabla }
Pag 2
{****************************************************************}
Procedure MostrarPersona(P:TPersona);
Begin
With P do
begin
writeln('Nombre:....',Nombre);
writeln('Edad :....',Edad);
writeln('Domicilio:.',Domicilio);
end;
End; {MostrarPersona}
{****************************************************************}
Procedure MostrarTabla(VAR T:TTabla);
{Muestra en pantalla los datos de todas las personas que
estan en la tabla T. Indica tambien la cantidad de personas en T}
Var i, CantPersonas : 0..TopeLegajo;
Begin
CantPersonas := 0;
For i:=1 to T.UltimoLegajoIngresado
do
If T.Datos[i] <> Nil
then
Begin
CantPersonas := CantPersonas + 1;
writeln('Datos Persona Legajo ',i);
MostrarPersona(T.Datos[i]^);
writeln('----------------------');
End; {for}
writeln('Total de personas en tabla: ',CantPersonas);
End; {MostrarTabla}
{****************************************************************}
Procedure InsertarPersona(VAR T:TTabla);
{Inserta una nueva persona en la tabla T. A la nueva persona
ingresada se le da un nuevo nro. de legajo, distinto a todos
los que existieron anteriormente...}
Begin
If T.UltimoLegajoIngresado = TopeLegajo
then writeln('Tabla llena! NO hay mas espacio')
else
begin
T.UltimoLegajoIngresado := T.UltimoLegajoIngresado + 1;
{ el nro. de legajo a asignar sera el siguiente al
ultimo legajo creado}
new( T.Datos[ T.UltimoLegajoIngresado ] );
{se crea un registro para guardar los datos de una
nueva persona}
With T.Datos[ T.UltimoLegajoIngresado ]^
do
Begin
write('Ingrese nombre:');
readln(Nombre);
writeln('Ingrese edad:');
readln(Edad);
writeln('Ingrese domicilio:');
Elementos de Programación / Prof. Carlos Iván Chesñevar / 1er. Cuat. 2000 / UNS
readln(Domicilio);
End;
end;
End; {InsertarPersona}
Pag 3
{****************************************************************}
Procedure EliminarPersona(VAR T:TTabla);
Var EsNroLegajoValido: boolean; NroLegajo: 0..TopeLegajo;
Begin
Repeat
EsNroLegajoValido := true;
Repeat
writeln('Ingrese el nro. de legajo a dar de baja (0=terminar):');
readln(NroLegajo);
Until (NroLegajo>=0) and (NroLegajo<=TopeLegajo);
If NroLegajo > 0
then
If NroLegajo > T.UltimoLegajoIngresado
then {...nro de legajo inexistente...}
Begin
writeln('Error: numero de legajo inexistente...');
writeln('El ultimo legajo actualmente es ',
T.UltimoLegajoIngresado);
EsNroLegajoValido:=false;
End
else {el NroLegajo no excede T.UltimoLegajoIngresado}
If T.Datos[NroLegajo] = nil
then {...ya fue dado de baja anteriormente!!...}
Begin
writeln('Error: ese legajo ya fue dado de baja...');
writeln('Intente nuevamente...');
End
else {...se puede proceder a dar de baja!...}
Begin
dispose(T.Datos[NroLegajo]);
T.Datos[NroLegajo]:=nil;
writeln('La persona con legajo ',NroLegajo);
writeln('ha sido dada de baja exitosamente.');
End
Until (EsNroLegajoValido) or (NroLegajo = 0);
End; {EliminarPersona}
{****************************************************************}
Procedure Menu(Var Opcion:TOpcion);
{ Presenta en pantalla un menu de opciones, y permite al
usuario elegir entre ellas, devolviendo la opcion elegida en Opcion}
Var NroOpcion: 1..4;
Begin
writeln('*** Manejo de Personas ***');
writeln;
writeln('1. Dar alta a una nueva persona');
writeln('2. Dar de baja una persona');
writeln('3. Listar legajos existentes');
writeln('4. Salir');
repeat
write('Su opcion es:');
readln(NroOpcion);
until NroOpcion in [1..4];
Elementos de Programación / Prof. Carlos Iván Chesñevar / 1er. Cuat. 2000 / UNS
Pag 4
Case NroOpcion Of
1: Opcion:= AltaPersona;
2: Opcion:= BajaPersona;
3: Opcion:= ListarLegajos;
4: Opcion:= Salir;
End; {case}
End; {Menu}
Begin
InicializarTabla(T); {se inicializa T en vacio}
Repeat
Menu(Opcion); {se muestra el menu en pantalla}
Case Opcion of {...segun la opcion elegida, puede hacerse:}
AltaPersona: InsertarPersona(T);
BajaPersona: EliminarPersona(T);
ListarLegajos: MostrarTabla(T);
end; {case}
Until (Opcion = Salir);
End.
Descargar