Otra posibilidad con los tipos de dato registro es que podemos definir campos no solo de tipo de dato simple (Integer, Double, Char, String etc.) sino que podemos definir campos de tipo registro, vector, matriz etc.
Veremos un ejemplo con el concepto de registros anidados.
Se tienen las siguientes declaraciones de registros:
TFecha = record
Dia: Integer;
Mes: Integer;
Año: Integer;
end;
TProducto = record
Codigo: Integer;
Descripcion: String;
Precio: Double;
FechaVencimiento: TFecha;
end;
Definir una variable de tipo TProducto.
Implementar los procedimientos para la carga e impresión de la variable definida.
program Proyecto117;
{$APPTYPE CONSOLE}
type
TFecha = record
Dia: Integer;
Mes: Integer;
Año: Integer;
end;
TProducto = record
Codigo: Integer;
Descripcion: String;
Precio: Double;
FechaVencimiento: TFecha;
end;
procedure Cargar(var Producto: TProducto);
begin
Write('Ingrese el código del producto:');
ReadLn(Producto.Codigo);
Write('Ingrese el nombre del producto:');
ReadLn(Producto.Descripcion);
Write('Ingrese el precio:');
ReadLn(Producto.Precio);
Write('Dia de vencimiento:');
ReadLn(Producto.FechaVencimiento.Dia);
Write('Mes de vencimiento:');
ReadLn(Producto.FechaVencimiento.Mes);
Write('Año de vencimiento:');
ReadLn(Producto.FechaVencimiento.Año);
end;
procedure Imprimir(Producto: TProducto);
begin
WriteLn('************************************');
WriteLn('Codigo:', Producto.Codigo);
WriteLn('Descripcion:', Producto.Descripcion);
WriteLn('Precio:', Producto.Precio:0:2);
WriteLn('Fecha de vencimiento:', Producto.FechaVencimiento.Dia, '/',
Producto.FechaVencimiento.Mes, '/', Producto.FechaVencimiento.Año);
WriteLn('************************************');
end;
var
Producto1: TProducto;
begin
Cargar(Producto1);
Imprimir(Producto1);
ReadLn;
end.
Esta permitido definir un campo de un registro de tipo registro como sucede con el campo FechaVencimiento que es de tipo TFecha:
TProducto = record
Codigo: Integer;
Descripcion: String;
Precio: Double;
FechaVencimiento: TFecha;
end;
Cuando procedemos a cargar el campo FechaVencimiento debemos hacerlo también campo a campo:
Write('Dia de vencimiento:');
ReadLn(Producto.FechaVencimiento.Dia);
Write('Mes de vencimiento:');
ReadLn(Producto.FechaVencimiento.Mes);
Write('Año de vencimiento:');
ReadLn(Producto.FechaVencimiento.Año);
Como vemos accedemos a los campos de FechaVencimiento mediante el operador punto: Producto.FechaVencimiento.Dia
Para imprimir los campos de FechaVencimiento también utilizamos el operador punto:
WriteLn('Fecha de vencimiento:', Producto.FechaVencimiento.Dia, '/',
Producto.FechaVencimiento.Mes, '/', Producto.FechaVencimiento.Año);
Se tienen las siguientes declaraciones:
TSueldos = array[1..3] of Double;
TEmpleado = record
Nombre: String;
Sueldos: TSueldos;
end;
En el campo Sueldos se almacenan los últimos 3 sueldos cobrados por el empleado.
Definir una variable de tipo TEmpleado
Implementar los procedimientos para la carga y otro que muestre cuanto cobró en total en los últimos tres meses.
program Proyecto118;
{$APPTYPE CONSOLE}
type
TSueldos = array[1..3] of Double;
TEmpleado = record
Nombre: String;
Sueldos: TSueldos;
end;
procedure Cargar(var Empleado: TEmpleado);
var
f: Integer;
begin
Write('Ingrese el nombre del empleado:');
ReadLn(Empleado.Nombre);
for f:=1 to 3 do
begin
Write('Ingrese el ', f, ' sueldo:');
ReadLn(Empleado.Sueldos[f]);
end;
end;
procedure SueldoTotal(Empleado: TEmpleado);
var
suma: Double;
f: Integer;
begin
suma := 0;
for f:=1 to 3 do
begin
suma := suma + Empleado.Sueldos[f];
end;
WriteLn('El total de sueldos de los últimos tres meses de ', Empleado.Nombre, ' es de ', suma:0:2);
end;
var
Empleado: TEmpleado;
begin
Cargar(Empleado);
SueldoTotal(Empleado);
ReadLn;
end.
En este ejemplo podemos identificar que un campo del registro TEmpleado es un vector (campo Sueldo es de tipo TSueldo que es un vector de tres elementos de tipo Double):
TSueldos = array[1..3] of Double;
TEmpleado = record
Nombre: String;
Sueldos: TSueldos;
end;
Para el procedimiento de cargar procedemos a ingresar por teclado los tres sueldos dentro de una estructura repetitiva:
procedure Cargar(var Empleado: TEmpleado);
var
f: Integer;
begin
Write('Ingrese el nombre del empleado:');
ReadLn(Empleado.Nombre);
for f:=1 to 3 do
begin
Write('Ingrese el ', f, ' sueldo:');
ReadLn(Empleado.Sueldos[f]);
end;
end;
El otro procedimiento de nuestro programa debe sumar los 3 elementos del vector contenido en uno de los campos del registro:
procedure SueldoTotal(Empleado: TEmpleado);
var
suma: Double;
f: Integer;
begin
suma := 0;
for f:=1 to 3 do
begin
suma := suma + Empleado.Sueldos[f];
end;
WriteLn('El total de sueldos de los últimos tres meses de ', Empleado.Nombre, ' es de ', suma:0:2);
end;
TPunto = record
X: Integer;
Y: Integer;
end;
TTriangulo = record
Punto1: TPunto;
Punto2: TPunto;
Punto3: TPunto;
end;
Definir en el bloque principal del programa un registro de tipo TTriangulo.
program Proyecto119;
{$APPTYPE CONSOLE}
type
TPunto = record
X: Integer;
Y: Integer;
end;
TTriangulo = record
Punto1: TPunto;
Punto2: TPunto;
Punto3: TPunto;
end;
procedure Cargar(var Triangulo: TTriangulo);
begin
Triangulo.punto1.x := 10;
Triangulo.punto1.y := 10;
Triangulo.punto2.x := 20;
Triangulo.punto2.y := 20;
Triangulo.punto3.x := 0;
Triangulo.punto3.y := 20;
end;
procedure Imprimir(Triangulo: TTriangulo);
begin
WriteLn('Coordeandas de los vertices de un triangulo.');
WriteLn('Punto1 coordenada(', Triangulo.Punto1.X, ',', Triangulo.Punto1.Y, ')');
WriteLn('Punto1 coordenada(', Triangulo.Punto2.X, ',', Triangulo.Punto2.Y, ')');
WriteLn('Punto1 coordenada(', Triangulo.Punto3.X, ',', Triangulo.Punto3.Y, ')');
end;
var
Triangulo1: TTriangulo;
begin
Cargar(Triangulo1);
Imprimir(Triangulo1);
ReadLn;
end.