31 - Registros: vectores con componente de tipo registro

Hemos trabajado bastante con la estructura de datos tipo vector y matriz definiendo elementos de tipo Integer, Double, String etc. Ahora veremos que podemos definir vectores cuyos elementos sean de tipo registro.

La combinación de las distintas estructuras de datos nos permiten representar conceptos más complejos para la resolución de problemas.

Problema 1

Se tiene la siguiente declaración de registro:

  TProducto = record
    Codigo: Integer;
    Descripcion: String;
    Precio: Double;
  end;
Declarar un vector de 4 elementos de tipo TProducto.
Implementar los siguientes procedimientos:

  • Carga del vector.
  • Impresión del vector.
  • Mostrar el nombre del articulo con precio mayor.

Proyecto120

program Proyecto120;

{$APPTYPE CONSOLE}

type
  TProducto = record
    Codigo: Integer;
    Descripcion: String;
    Precio: Double;
  end;

  TProductos = array[1..4] of TProducto;

procedure Cargar(var Productos: TProductos);
var
  f: Integer;
begin
  for f:=1 to 4 do
  begin
    Write('Ingrese código del producto:');
    ReadLn(Productos[f].Codigo);
    Write('Ingrese la descripción:');
    ReadLn(Productos[f].Descripcion);
    Write('Ingrese el precio:');
    ReadLn(Productos[f].Precio);
  end;
end;

procedure Listar(Productos: TProductos);
var
  f: Integer;
begin
  WriteLn('Listado completo de productos');
  for f:=1 to 4 do
  begin
    WriteLn('Código:', Productos[f].Codigo);
    WriteLn('Descripción:', Productos[f].Descripcion);
    WriteLn('Precio:', Productos[f].Precio:0:2);
    WriteLn('----------------------------------------');
  end;
end;

procedure ProductoPrecioMayor(Productos: TProductos);
var
  f: Integer;
  pre: Double;
  nombre: String;
begin
  pre := Productos[1].Precio;
  nombre := Productos[1].Descripcion;
  for f:=2 to 4 do
  begin
    if productos[f].Precio > pre then
    begin
      pre := Productos[f].Precio;
      nombre := Productos[f].Descripcion;
    end;
  end;
  WriteLn('El prducto ', nombre, ' tiene un precio mayor y es de ', pre:0:2);
end;


var
  Productos: TProductos;
begin
  Cargar(Productos);
  Listar(Productos);
  ProductoPrecioMayor(Productos);
  ReadLn;
end.

En el bloque principal definimos un vector de tipo TProductos, llamamos a los distintos procedimientos:

var
  Productos: TProductos;
begin
  Cargar(Productos);
  Listar(Productos);
  ProductoPrecioMayor(Productos);
  ReadLn;
end.

En el procedimiento de "Cargar" se recibe por referencia el vector ya que se va a modificar su contenido. Para cargar debemos indicar el nombre del vector, el subíndice que queremos acceder y finalmente a que campo del registro de dicha componente:

procedure Cargar(var Productos: TProductos);
var
  f: Integer;
begin
  for f:=1 to 4 do
  begin
    Write('Ingrese código del producto:');
    ReadLn(Productos[f].Codigo);
    Write('Ingrese la descripción:');
    ReadLn(Productos[f].Descripcion);
    Write('Ingrese el precio:');
    ReadLn(Productos[f].Precio);
  end;
end;

Como podemos comprobar en los otros dos procedimientos cada vez que accedemos a una componente del vector debemos indicar a que campo del registro queremos cargar, imprimir o consultar su valor.

Problema propuesto

  • Se tiene la siguiente declaración de registro:
      TLibro = record
        Codigo: Integer;
        Titulo: String;
        Autor: String;
      end;
    
    Declarar y definir un vector de cuatro elementos de tipo TLibro.
    Codificar los siguientes procedimientos:
    1-Carga del vector.
    2-Listado completo.
    3-Ingresar por teclado un nombre de autor y luego mostrar todos los títulos de libros que ha escrito o un mensaje si no tiene.
Solución
program Proyecto121;

{$APPTYPE CONSOLE}

type
  TLibro = record
    Codigo: Integer;
    Titulo: String;
    Autor: String;
  end;

  TLibros = array[1..4] of TLibro;

procedure Cargar(var Libros: TLibros);
var
  f: Integer;
begin
  for f:=1 to 4 do
  begin
    Write('Ingrese el código del libro:');
    ReadLn(Libros[f].Codigo);
    Write('Ingrese el título:');
    ReadLn(Libros[f].Titulo);
    Write('Ingrese el autor:');
    ReadLn(Libros[f].Autor);
  end;
end;

procedure Listar(Libros: TLibros);
var
  f: Integer;
begin
  WriteLn('--------------------------------');
  for f:=1 to 4 do
  begin
    WriteLn('Código:', Libros[f].Codigo);
    WriteLn('Título:', Libros[f].Titulo);
    WriteLn('Autor:', Libros[f].Autor);
  end;
  WriteLn('--------------------------------');
end;

procedure ConsultaAutor(Libros: TLibros);
var
  f: Integer;
  autor: String;
  existe: Integer;
begin
  existe := 0;
  Write('Ingrese el autor a consultar:');
  ReadLn(autor);
  for f:=1 to 4 do
  begin
    if autor = Libros[f].Autor then
    begin
      existe := 1;
      WriteLn('Título:', Libros[f].Titulo);
    end;
  end;
  if existe = 0 then
  begin
    WriteLn('No existen libros para el autor ingresado');
  end;
end;


var
  Libros: TLibros;
begin
  Cargar(Libros);
  Listar(Libros);
  ConsultaAutor(Libros);
  ReadLn;
end.