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.