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.