30 - Registros: con campos de tipo simple y estructuras de dato.

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.

Problema 1

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.

Proyecto117

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);

Problema 2

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.

Proyecto118

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;

Problema propuesto

  • Se tienen las siguientes declaraciones de registros:
      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.
    Codificar los siguientes procedimientos:
    1-Un procedimiento que cargue el registro por asignación.
    2-Impresión del registro.
Solución
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.