Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Introducción
La finalidad de este tipo de datos es agrupar bajo un mismo nombre distintas características o
propiedades del objeto con el que estemos trabajando.
Un registro es un tipo de datos estructurado formado por un conjunto de una o más variables
agrupadas bajo un mismo nombre común, para hacer más eficiente e intuitivo el manejo de estas
variables.
A cada una de estas variables que forma parte del registro se le conoce como campo (o atributo),
y puede ser de cualquiera de los tipos explicados.
Si comparamos con el otro tipo estructurado que ya conocemos, las tablas, descubrimos que:
*Los elementos de una tabla son todos del mismo tipo, es un conjunto homogéneo.
*Los elementos de un registro pueden ser de distintos tipos, heterogéneos.
Podemos agrupar la información referente a una persona (que antes almacenábamos en varias
variables) en un registro, donde cada uno de los campos coincide con una de las variables
previas: nombre, edad, altura y peso. Gráficamente se podría representar:
-1-
REGISTROS AULA MENTOR
Definición
Al igual que ocurre con las tablas, podemos definir variables de tipo registro directamente en la
sección de variables, o definir un tipo de usuario registro. Para definir un registro se usa la
palabra reservada record. A continuación se definen los distintos campos del registro junto con
sus tipos. Esto es lo que podemos observar en el siguiente ejemplo:
Type
persona = record
nombre : string;
edad : integer;
peso : real;
altura : real;
end;
Var
alumno : persona;
profesor : record
nombre : string;
edad : integer;
peso : real;
altura : real;
end;
alumno1, alumno2 : persona;
El tipo de datos persona es un registro con cuatro campos y sus correspondientes tipos: nombre,
edad, peso y altura. Una vez definido el tipo de usuario persona se pueden definir variables del
tipo persona.
Para acceder a los elementos basta con utilizar el nombre de la variable, seguido de un punto y
el nombre del campo. De esta forma se puede usar ese campo como una variable más en nuestro
código:
-2-
REGISTROS AULA MENTOR
write('Peso : ');
readln(alumno.peso);
write('Altura : ');
readln(alumno.altura);
ratio = alumno.peso/alumno.altura;
alumno1 := alumno;
Y además se debe cumplir no sólo que respondan a la misma estructura, sino que el tipo
asociado en sus definiciones sea el mismo. Según esto, la sentencia:
Por otra parte, no se pueden comparar dos registros de la forma habitual, con el operador =
Será necesario comparar los campos uno a uno. Para ello se puede codificar una función como
la siguiente:
(* Compara dos registros del tipo persona campo a campo y devuelve TRUE o FALSE
*)
Function compara_persona(per1, per2 : persona): Boolean;
Begin
End;
Y usarla como se muestra a continuación:
if ( compara_persona(alumno1,alumno2) ) then
writeln('Alumno1 y alumno2 son iguales')
else
writeln('Alumno1 y alumno2 NO son iguales');
-3-
REGISTROS AULA MENTOR
Uso de Registros
Aunque es posible asignar valores a los campos de un registro uno a uno, lo más habitual
es crear un procedimiento que se encargue de la lectura de todo el registro. Observe en el
siguiente ejemplo que es necesario pasar el parámetro por referencia.
(* Presenta por pantalla toda la información de un registro del tipo persona que se le pasa
como parámetro *) *)
read_persona(alumno2);
write_persona(alumno2);
-4-
REGISTROS AULA MENTOR
Registros anidados
Es posible incluso que alguno de los campos de un registro sea a su vez otro registro: en
este caso es necesario que el registro "interior" se defina primero.
Type
Tpersona = record
(* Tipo que define las caracteristicas de una persona *)
nombre : string[TAMNOMBRE];
dni : string[TAMDNI];
edad : integer;
end;
Talumno = record
datos : Tpersona;
teoria : real;
practica : real;
end;
Var
Juan: Talumno;
Observe que el identificador de tipo se ha precedido con una 'T'. A veces se usa esta
notación para hacer más evidente que se esta usando un Tipo definido por el usuario.
Para acceder a los campos del registro anidado o interior se usa el operador ".":
write('Nombre: ');
readln(alu01.datos.nombre);
write('Edad: ');
readln(alu01.datos.edad);
write('Nota Teoria: ');
readln(alu01.teoria);
write('Nota Practica: ');
readln(alu01.practica);
Estudiemos ahora una de las aplicaciones más frecuentes de los registros: las tablas de
registros.
-5-
REGISTROS AULA MENTOR
Tablas de registros
Vamos a utilizar en este apartado las dos estructuras compuestas estudiadas: tablas y registros.
Si ya hemos visto como agrupar la información, por ejemplo, de un alumno, ¿por qué no
agrupamos a los alumnos, del tipo Talumno en una tabla para poder tratar a toda la clase de
forma homogénea?
Const
TAMCLASE = 10;
TAMNOMBRE = 30;
TAMDNI = 13;
Type
Tpersona = record (* Tipo registro que define las caracteristicas de una persona *)
nombre : string[TAMNOMBRE];
dni: string[TAMDNI];
edad: integer;
end;
(* Tipo que define las caracteristicas de un alumno: persona +notas *)
(* Es un ejemplo de registro anidado *)
Talumno = record
datos: Tpersona;
teoria: real;
practica: real;
end;
(* Tabla de registros del tipo Talumno *)
De esta forma se puede tratar cada elemento de la tablamiclase (miclase[i]) como una variable
de tipo Talumno:
write('Nombre: ');
readln(miclase[i].datos.nombre);
-6-
REGISTROS AULA MENTOR
write('Edad: ');
readln(miclase[i].datos.edad);
Claro que no debemos olvidar que lo que hacía verdaderamente potente a las tablas es la
posibilidad de tratar todos los elementos de la tabla mediante bucles.
Observe:
El paso de parámetros a la función de lectura por REFERENCIA,
y a la función de escritura por VALOR.
Al mismo tiempo observe los bucles de ambas funciones,
y cómo se utilizan las funciones read_alumno y write_alumno: Se le pasan como parámetro un
elemento de la tabla, que será del tipo alumno.
Una vez que tiene los datos de su clase querrá hacer algún tipo de cálculos con ellos. Vamos a
realizar como ejemplo una función que nos presente por pantalla la edad media de la clase.
Para ello necesitamos que la función reciba como parámetro toda la clase. ¿Por valor o por
referencia? Recuerde: si no va a modificar el parámetro se debe pasar por valor.
Debemos codificar un bucle que vaya recorriendo cada elemento de la tabla (la clase) y
sumando la edad de cada alumno. Finalizado el bucle, dividimos por el número de alumnos. El
código resultante es:
-7-
REGISTROS AULA MENTOR
(*
Tema 8: Registros
Const
TAMCLASE = 2;
TAMNOMBRE = 30;
Type
Tpersona = record (* Tipo que define las caracteristicas de una persona *)
nombre : string[TAMNOMBRE];
edad : integer;
end;
Talumno = record
datos : Tpersona;
teoria : real;
practica : real;
end;
Var
miclase : Tclase; (* Define miclase como tabla de personas *)
alu01 : Talumno;
-8-
REGISTROS AULA MENTOR
write('Edad : ');
readln(alumno.edad);
writeln;
End;
-9-
REGISTROS AULA MENTOR
End;
(* Programa principal *)
Begin
lee_clase(miclase);
escribe_clase(miclase);
edad_media(miclase);
End.
- 10 -