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
Confeccionar una función que le enviemos como parámetro el valor del lado de un cuadrado y nos retorne su superficie.
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);
Confeccionar una función que le enviemos como parámetros dos enteros y nos retorne el mayor.
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));
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.
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.
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.
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.
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.
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.