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.