28 - Registros: conceptos

Un registro es una estructura de datos que permite almacenar un conjunto de elementos no necesariamente del mismo tipo.

Vimos que vectores y matrices son estructuras de datos que permiten almacenar un conjunto de datos del mismo tipo.

Un registro normalmente almacena un conjunto de datos que están relacionados entre si.

Ejemplos de registros podrían ser los datos de un alumno (nro de legajo, apellido y nombre, carrera que cursa), una historia clínica de un paciente (nro de documento, obra social que tiene, enfermedades), etc.

A un vector o matriz accedemos a sus elementos por medio de subíndices, a los elementos de un registro se los llama campos y tienen cada uno un nombre.

Por ejemplo si definimos el registro "producto" sus campos pueden ser el "codigo","descripcion" y "precio".

Como los vectores y matrices los registros deben declararse y luego definir variables de dicho tipo.

Veamos la sintaxis para declarar un registro en Delphi/Pascal en la zona de la type:

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

Hemos declarado un registro llamado "TProducto" con tres campos uno de tipo Integer llamado Codigo, otro de tipo String llamado Descripcion y finalmente el campo Precio de tipo Double.

Como vemos los tres campos están relacionados y hacen referencia a las características que puede tener todo producto que vende una empresa.

Pero si solo declaramos el registro no nos sirve de nada, debemos definir una o más variables de dicho tipo a semejanza como hemos trabajado con vectores y matrices.

Problema 1

Declarar un registro que permita almacenar el codigo, descripcion y precio de un producto. Luego definir dos variables de dicho tipo, cargarlas e imprimir el nombre del producto que tiene mayor precio.

Proyecto113

program Proyecto113;

{$APPTYPE CONSOLE}

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

var
  Producto1: TProducto;
  Producto2: TProducto;

begin
  WriteLn('Datos del primeer producto');
  Write('Ingrese el código del producto:');
  ReadLn(Producto1.Codigo);
  Write('Ingrese el nombre del producto:');
  ReadLn(Producto1.Descripcion);
  Write('Ingrese el precio:');
  ReadLn(Producto1.Precio);
  WriteLn('Datos del segundo producto');
  Write('Ingrese el código del producto:');
  ReadLn(Producto2.Codigo);
  Write('Ingrese el nombre del producto:');
  ReadLn(Producto2.Descripcion);
  Write('Ingrese el precio:');
  ReadLn(Producto2.Precio);
  if Producto1.Precio > Producto2.Precio then
  begin
    WriteLn('El producto ', Producto1.Descripcion, ' tiene un precio mayor');
  end
  else
  begin
    WriteLn('El producto ', Producto2.Descripcion, ' tiene un precio mayor');
  end;
  ReadLn;
end.

La declaración del registro se hace en la zona de la type:

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

Para definir variables de tipo TProducto lo hacemos en la zona de la var:

var
  Producto1: TProducto;
  Producto2: TProducto;

Estamos definiendo dos variables llamadas Producto1 y Producto2 de tipo TProducto.

Cada una de las variables Producto1 y Producto2 reserva espacio para almacenar tres campos cada una:

Record en Delphi/Pascal

Para cargar la variable Producto1 debemos hacerlo campo a campo:

  Write('Ingrese el código del producto:');
  ReadLn(Producto1.Codigo);
  Write('Ingrese el nombre del producto:');
  ReadLn(Producto1.Descripcion);
  Write('Ingrese el precio:');
  ReadLn(Producto1.Precio);

El procedimiento ReadLn no permite cargar todo un registro de una vez.

Es decir primero indicamos el nombre de la variable "Producto1" y seguidamente el campo que estamos cargando "Codigo"

La carga del segundo registro llamado "Producto2" es idéntico a la carga del primer registro:

  Write('Ingrese el código del producto:');
  ReadLn(Producto2.Codigo);
  Write('Ingrese el nombre del producto:');
  ReadLn(Producto2.Descripcion);
  Write('Ingrese el precio:');
  ReadLn(Producto2.Precio);

Para verificar cual de los dos productos tiene un precio mayor debemos acceder al campo precio de cada uno de los dos productos:

  if Producto1.Precio > Producto2.Precio then

Lo mismo cuando procedemos a imprimir por pantalla debemos indicar que campo debemos mostrar y no podemos pasar el registro completo:

    WriteLn('El producto ', Producto1.Descripcion, ' tiene un precio mayor');

Problema propuesto

  • Se tiene la siguiente declaración de registro:
      TPais = record
        Nombre: String;
        Cantidad: Integer;
      end;
    
    Definir tres variables de tipo TPais y almacenar los nombres de los países y la cantidad de habitantes de dichos países.
    Mostrar seguidamente el nombre del país con mayor cantidad de habitantes (considerar que los tres países tienen cantidades distintas)
Solución
program Proyecto114;

{$APPTYPE CONSOLE}

type
  TPais = record
    Nombre: String;
    Cantidad: Integer;
  end;

var
  Pais1: TPais;
  Pais2: TPais;
  Pais3: TPais;

begin
  WriteLn('Datos del primer pais');
  Write('Ingrese el nombre del pais:');
  ReadLn(Pais1.Nombre);
  Write('Ingrese la cantidad de habitantes:');
  ReadLn(Pais1.Cantidad);
  WriteLn('Datos del segundo pais');
  Write('Ingrese el nombre del pais:');
  ReadLn(Pais2.Nombre);
  Write('Ingrese la cantidad de habitantes:');
  ReadLn(Pais2.Cantidad);
  WriteLn('Datos del tercer pais');
  Write('Ingrese el nombre del pais:');
  ReadLn(Pais3.Nombre);
  Write('Ingrese la cantidad de habitantes:');
  ReadLn(Pais3.Cantidad);
  if (Pais1.Cantidad > Pais2.Cantidad) and (Pais1.Cantidad > Pais3.Cantidad) then
  begin
    WriteLn(Pais1.Nombre,' es el país con mayor cantidad de habitantes');
  end
  else
  begin
    if Pais2.Cantidad > Pais3.Cantidad then
    begin
      WriteLn(Pais2.Nombre,' es el país con mayor cantidad de habitantes');
    end
    else
    begin
      WriteLn(Pais3.Nombre,' es el país con mayor cantidad de habitantes');
    end;
  end;
  ReadLn;
end.