26 - Procedimientos: parámetros con valores por defecto

Otra variante de procedimientos que podemos escribir en Delphi/Pascal es la especificación de un valor a cargarse en el parámetro si no se le envían datos en su llamada.

Debemos utilizar el operador = y el valor a almacenar cuando declaramos el parámetro.

Problema 1

Confeccionar un procedimiento que muestre la suma de 2, 3 o 4 enteros que le enviemos como parámetros.
El procedimiento debe funcionar independientemente que le enviemos 2, 3 o 4 datos.

Proyecto105

program Proyecto105;

{$APPTYPE CONSOLE}

procedure Sumar(x1: Integer; x2: Integer; x3: Integer = 0; x4: Integer = 0);
var
  suma: Integer;
begin
  suma := x1 + x2 + x3 + x4;
  WriteLn('La suma es:', suma);
end;


begin
  WriteLn('La suma de 10 + 2:');
  Sumar(10, 2);
  WriteLn('La suma de 7 + 2 + 60:');
  Sumar(7, 2, 60);
  WriteLn('La suma de 1 + 2 + 3 + 4:');
  Sumar(1, 2, 3, 4);
  ReadLn;
end.

El procedimiento Sumar tiene 4 parámetros, los dos últimos son opcionales, en caso que no se le envíen se almacena un cero en dicho parámetro:

procedure Sumar(x1: Integer; x2: Integer; x3: Integer = 0; x4: Integer = 0);

Ahora podemos llamar al procedimiento Sumar enviando por ejemplo solo dos datos:

  WriteLn('La suma de 10 + 2:');
  Sumar(10, 2);

Pero también podemos llamar al procedimiento Sumar enviando 3 o 4 datos:

  WriteLn('La suma de 7 + 2 + 60:');
  Sumar(7, 2, 60);
  WriteLn('La suma de 1 + 2 + 3 + 4:');
  Sumar(1, 2, 3, 4);

Importante

Hay que tener en cuenta estas reglas:

  • Los parámetros por defecto siempre deben ser los últimos que definamos en el procedimiento.
  • Los parámetros por defecto solo pueden ser por valor.
  • No se pueden especificar parámetros por defecto de tipo matriz, vector u otra estructura de datos.

Problema 2

Confeccionar un procedimiento que reciba un String y lo muestre subrayado con asteriscos por defecto.
En un segundo parámetro hacer que llegue el caracter que se muestre en el subrayado, si no llega utilizar el caracter '*'.

Proyecto106

program Proyecto106;

{$APPTYPE CONSOLE}

procedure MostrarTitulo(titulo: String; caracter: Char = '*');
var
  f: Integer;
begin
  WriteLn(titulo);
  for f:=1 to Length(titulo) do
  begin
    Write(caracter);
  end;
  WriteLn;
end;

begin
  MostrarTitulo('Sistema de Ventas');
  WriteLn;
  MostrarTitulo('Ingresos de 2017', '-');
  ReadLn;
end.

En este problema hemos introducido un nuevo tipo de dato que existe en Delphi/Pascal llamado Char. En una variable de tipo Char podemos almacenar un único caracter a diferencia de un String que podemos almacenar múltiples caracteres.

Al procedimiento MostrarTitulo llegan dos parámetros, el segundo por defecto almacena el caracter '*'.

Luego si llamamos al procedimiento con un único parámetro el texto aparece subrayado con asteríscos:

  MostrarTitulo('Sistema de Ventas');

Pero si lo llamamos enviando datos a los dos parámetros luego aparece subrayado con el caracter que le enviamos:

  MostrarTitulo('Ingresos de 2017', '-');

Para que el procedimiento muestre el título subrayado procedemos mediante un for a imprimir el parámetro "caracter" tantas veces como carcteres tenga el parámetro "titulo".

Para saber la cantidad de caracteres de un String utilizamos la función Length que nos retorna este valor.

El resultado de ejecutar este programa es:

parámetros con valores por defecto en Delphi/Pascal