29 - Registros: parámetros de tipo registro

Hemos visto anteriormente que un procedimiento o función puede recibir tipos de datos simples como Integer, Char, Double, String etc. estructuras de datos tipo vector, matriz y también pueden ser de tipo registro.

Recordar que es muy importante definir si el parámetro es por valor (solo se consulta el parámetro) o referencia (se modifica el parámetro)

Problema 1

Se tiene la siguiente declaración de registro:

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

Definir dos variables de tipo TProducto.
Plantear un procedimiento que cargue una variable de tipo TProducto y otro que lo imprima.

Proyecto115

program Proyecto115;

{$APPTYPE CONSOLE}

type
  TProducto = record
    Codigo: Integer;
    Descripcion: String;
    Precio: Double;
  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);
end;

procedure Imprimir(Producto: TProducto);
begin
  WriteLn('************************************');
  WriteLn('Codigo:', Producto.Codigo);
  WriteLn('Descripcion:', Producto.Descripcion);
  WriteLn('Precio:', Producto.Precio:0:2);
  WriteLn('************************************');
end;


var
  Producto1: TProducto;
  Producto2: TProducto;
begin
  Cargar(Producto1);
  Cargar(Producto2);
  Imprimir(Producto1);
  Imprimir(Producto2);
  ReadLn;
end.

Como se necesitan almacenar los datos de dos productos debemos definir previo al bloque principal del programa dos variables de tipo TProducto:

var
  Producto1: TProducto;
  Producto2: TProducto;
begin
  Cargar(Producto1);
  Cargar(Producto2);
  Imprimir(Producto1);
  Imprimir(Producto2);
  ReadLn;
end.

Se plantea un solo procedimiento que permite cargar por teclado variables de tipo TProducto, luego desde el bloque principal lo llamamos dos veces pasando en forma sucesiva las variables a cargar. En la carga el parámetro debe ser por referencia (var Producto: TProducto):

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

La impresión del registro se hace en el procedimiento "Imprimir" que recibe por valor un parámetro de tipo TProducto:

procedure Imprimir(Producto: TProducto);
begin
  WriteLn('************************************');
  WriteLn('Codigo:', Producto.Codigo);
  WriteLn('Descripcion:', Producto.Descripcion);
  WriteLn('Precio:', Producto.Precio:0:2);
  WriteLn('************************************');
end;

Problema propuesto

  • Se tiene la siguiente declaración de registro:
      TPais = record
        Nombre: String;
        Cantidad: Integer;
      end;
    
    Definir dos variables de tipo TPais en el bloque principal.
    Confeccionar un procedimiento que permita cargar una variable de tipo TPais por teclado y otro procedimiento que reciba dos parámetros de tipo TPais y muestre el nombre del pais con más habitantes.
Solución
program Proyecto116;

{$APPTYPE CONSOLE}

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

procedure Cargar(Var Pais: TPais);
begin
   Write('Ingrese el nombre del pais:');
  ReadLn(Pais.Nombre);
  Write('Ingrese la cantidad de habitantes:');
  ReadLn(Pais.Cantidad);
end;

procedure MasHabitantes(Pais1, Pais2: TPais);
begin
  if Pais1.Cantidad > Pais2.Cantidad then
  begin
    WriteLn(Pais1.Nombre, ' tiene más habitantes');
  end
  else
  begin
    WriteLn(Pais2.Nombre, ' tiene más habitantes');
  end;
end;


var
  Pais1: TPais;
  Pais2: TPais;
begin
  Cargar(Pais1);
  Cargar(Pais2);
  MasHabitantes(Pais1, Pais2);
  ReadLn;
end.