27 - Funciones: conceptos

Venimos trabajando dividiendo los algoritmos en procedimientos, ahora veremos que el lenguaje Delphi/Pascal nos provee la posibilidad de definir funciones.

Una función tiene el mismo objetivo que un procedimiento con la única diferencia que una función debe retornar obligatoriamente un dato.

Si necesitamos hacer un algoritmo que retorne un único valor es mas conveniente implementar una función en lugar de un procedimiento que lo retorne por medio de un parámetro por referencia.

La sintaxis para declarar una función en Delphi/Pascal es:

function [nombre de la función]([parámetros]): [tipo de dato que retorna];
begin
  ....
  Result := [valor a retornar];
end

Problema 1

Confeccionar una función que le enviemos como parámetro el valor del lado de un cuadrado y nos retorne su superficie.

Proyecto107

program Proyecto107;

{$APPTYPE CONSOLE}

function RetornarSuperficie(lado: Integer): Integer;
begin
  Result := lado * lado;
end;


var
  lado: Integer;
  sup: Integer;
begin
  Write('Ingrese el lado de un cuadrado:');
  ReadLn(lado);
  sup := RetornarSuperficie(lado);
  WriteLn('La superficie del cuadrado es:', sup);
  ReadLn;
end.

La función RetornarSuperficie tiene un parámetro por valor de tipo Integer y retorna un dato Integer.
Dentro de la función debemos asignar a la palabra clave Result el valor a retornar.

function RetornarSuperficie(lado: Integer): Integer;
begin
  Result := lado * lado;
end;

Como la función RetornarSuperficie retorna un Integer debemos asignar a una variable de este tipo para que almacene el valor retornado:

  sup := RetornarSuperficie(lado);

Problema 2

Confeccionar una función que le enviemos como parámetros dos enteros y nos retorne el mayor.

Proyecto108

program Proyecto108;

{$APPTYPE CONSOLE}

function RetornarMayor(v1, v2: Integer): Integer;
begin
  if v1 > v2 then
  begin
    Result := v1;
  end
  else
  begin
    Result := v2;
  end;
end;


var
  valor1: Integer;
  valor2: Integer;

begin
  Write('Ingrese el primer valor:');
  ReadLn(valor1);
  Write('Ingrese el segundo valor:');
  ReadLn(valor2);
  Write('El valor mayor es:', RetornarMayor(valor1, valor2));
  ReadLn;
end.

La función RetornarMayor recibe dos parámetros de tipo Integer y retorna un Integer:

function RetornarMayor(v1, v2: Integer): Integer;
begin
  if v1 > v2 then
  begin
    Result := v1;
  end
  else
  begin
    Result := v2;
  end;
end;

Siempre en una función debemos asignar a la palabra clave Result el dato a devolver.

A una función podemos llamarla dentro de un Write y el dato que retornado mostrarlo sin tener que asignar dicho valor a una variable:

  Write('El valor mayor es:', RetornarMayor(valor1, valor2));

Problema 3

Confeccionar un programa que permita administrar un vector de 5 enteros.
Implementar un procedimiento para su carga y una función que retorne la suma de todas sus componentes.

Proyecto109

program Proyecto109;

{$APPTYPE CONSOLE}

type
  TVector = array[1..5] of Integer;

procedure Cargar(var Vec: TVector);
var
  f: Integer;
begin
  for f:=1 to 5 do
  begin
    Write('Ingrese componente:');
    ReadLn(Vec[f]);
  end;
end;

function SumarElementos(Vec: TVector): Integer;
var
  f: Integer;
  suma: Integer;
begin
  suma := 0;
  for f:=1 to 5 do
  begin
    suma := suma + Vec[f];
  end;
  Result := suma;
end;


var
  Vector: TVector;

begin
  Cargar(Vector);
  WriteLn('La suma de todas sus componentes es ', SumarElementos(Vector));
  ReadLn;
end.

Para resolver este problema hemos planteado un procedimiento que le enviamos por referencia un vector para que sean cargadas todas sus componentes:

procedure Cargar(var Vec: TVector);
var
  f: Integer;
begin
  for f:=1 to 5 do
  begin
    Write('Ingrese componente:');
    ReadLn(Vec[f]);
  end;
end;

La función SumarElementos recibe el vector, suma todos sus elementos y retorna dicho valor:

function SumarElementos(Vec: TVector): Integer;
var
  f: Integer;
  suma: Integer;
begin
  suma := 0;
  for f:=1 to 5 do
  begin
    suma := suma + Vec[f];
  end;
  Result := suma;
end;

El bloque principal de nuestro programa define una variable de tipo TVector y procede a llamar al procedimiento y la función:

var
  Vector: TVector;

begin
  Cargar(Vector);
  WriteLn('La suma de todas sus componentes es ', SumarElementos(Vector));
  ReadLn;
end.

Problema 4

Confeccionar un programa que permita cargar dos vectores de 5 elementos de tipo Integer.
Implementar:
Un procedimiento para carga de vectores.
Un procedimiento para imprimir vectores.
Una función que se le envíe dos vectores y nos retorne un vector con la suma componente a componente.

Proyecto110

program Proyecto110;

{$APPTYPE CONSOLE}

type
  TVector = array[1..5] of Integer;

procedure Cargar(var Vec: TVector);
var
  f: Integer;
begin
  for f:=1 to 5 do
  begin
    Write('Ingrese componente nro ', f, ':');
    ReadLn(Vec[f]);
  end;
end;

function SumarVectores(Vec1, Vec2: TVector): TVector;
var
  f: Integer;
  Suma: TVector;
begin
  for f:=1 to 5 do
  begin
    Suma[f] := Vec1[f] + Vec2[f];
  end;
  Result := Suma;
end;

procedure Imprimir(Vec: TVector);
var
  f: Integer;
begin
  for f:=1 to 5 do
  begin
    Write(Vec[f], ' ');
  end;
end;

var
  Vector1: TVector;
  Vector2: TVector;
  VecSuma: TVector;
begin
  Cargar(Vector1);
  Cargar(Vector2);
  VecSuma := SumarVectores(Vector1, Vector2);
  Imprimir(VecSuma);
  ReadLn;
end.

Con este ejemplo podemos comprobar que una función puede retornar tipos de datos simple como Char, Integer, Double, String etc. pero también puede retornar un vector o una matriz:

function SumarVectores(Vec1, Vec2: TVector): TVector;
var
  f: Integer;
  Suma: TVector;
begin
  for f:=1 to 5 do
  begin
    Suma[f] := Vec1[f] + Vec2[f];
  end;
  Result := Suma;
end;

Cuando llamamos a esta función si es obligatorio asignar el dato devuelto a una variable de tipo TVector:

var
  Vector1: TVector;
  Vector2: TVector;
  VecSuma: TVector;
begin
  Cargar(Vector1);
  Cargar(Vector2);
  VecSuma := SumarVectores(Vector1, Vector2);
  Imprimir(VecSuma);
  ReadLn;
end.

Problemas propuestos

  • Elaborar una función que reciba tres enteros y nos retorne un entero con el valor promedio de los mismos.
  • Confeccionar una función que calcule la superficie de un rectángulo y la retorne, la función recibe como parámetros los valores de dos de sus lados:
    function RetornarSuperficie( lado1, lado2: Integer): Integer;
    
    En el bloque principal del programa cargar los lados de dos rectángulos y luego mostrar cual de los dos tiene una superficie mayor.
Solución
program Proyecto111;

{$APPTYPE CONSOLE}

function RetornarPromedio(x1, x2, x3: Integer): Integer;
begin
  Result := (x1 + x2 + x3) div 3;
end;


var
  valor1: Integer;
  valor2: Integer;
  valor3: Integer;

begin
  Write('Ingrese primer valor:');
  ReadLn(valor1);
  Write('Ingrese segundo valor:');
  ReadLn(valor2);
  Write('Ingrese tercer valor:');
  ReadLn(valor3);
  WriteLn('El promedio de los tres valores ingresados es:', RetornarPromedio(valor1, valor2, valor3));
  ReadLn;
end.




program Proyecto112;

{$APPTYPE CONSOLE}

function RetornarSuperficie( lado1, lado2: Integer): Integer;
begin
  Result := lado1 * lado2;
end;

var
  lado1: Integer;
  lado2: Integer;
  lado3: Integer;
  lado4: Integer;

begin
  WriteLn('Primer rectangulo');
  Write('Ingrese lado menor del rectangulo:');
  ReadLn(lado1);
  Write('Ingrese lado mayor del rectangulo:');
  ReadLn(lado2);
  WriteLn('Segundo rectangulo');
  Write('Ingrese lado menor del rectangulo:');
  ReadLn(lado3);
  Write('Ingrese lado mayor del rectangulo:');
  ReadLn(lado4);
  if RetornarSuperficie(lado1, lado2) = RetornarSuperficie(lado3, lado4) then
  begin
    Write('Los dos rectangulos tiene la misma superficie');
  end
  else
  begin
    if RetornarSuperficie(lado1, lado2) > RetornarSuperficie(lado3, lado4) then
    begin
      Write('El primer rectangulo tiene una superficie mayor');
    end
    else
    begin
      Write('El segundo rectangulo tiene una superficie mayor');
    end;
  end;
  ReadLn;
end.