23 septiembre 2014

Pascal - 6c: Funciones

6.3. Funciones

En muchas ocasiones querremos obtener un valor como resultado de esa "subrutina" que hemos creado. Llamaremos "función" a un procedimiento capaz de devolver un valor. Por ejemplo, podríamos crear una función sencilla, que calcule (y devuelva) el doble del número que se le pase como parámetro, así:
(* DOBLE.PAS, Primer ejemplo de funcion *)
(* Parte de CUPAS5, por Nacho Cabanes   *)
 
program FuncionDoble;
 
function doble( numero: integer): integer;
begin
    doble := numero * 2;
end;
 
(* Cuerpo del programa *)
var
    n: integer;
 
begin
    write('Introduce un numero entero: ');
    readLn( n );
    writeLn('Su doble es: ', doble(n) );
    writeLn('Y el doble de 5 es: ', doble(5) );
end. 
 
(* 
Ejemplo de ejecucion:
Introduce un numero entero: 3
Su doble es: 6
Y el doble de 5 es: 10
*)
 
Aquí hay varios detalles que merece la pena comentar, algunos de ellos nuevos:
  • Esta función se llama "doble".
  • Tiene un parámetro llamado "numero", que es un número entero.
  • El resultado va a ser también un número entero.
  • Antes de salir de la función, le asignamos el que será su valor definitivo.
  • Desde el cuerpo del programa usamos la función 2 veces: la primera para calcular el doble del número "n", que ha introducido el usuario, y la segunda para hallar el doble de 5.

Una función puede recibir más de un parámetro, y puede realizar operaciones más complejas. Por ejemplo, podríamos calcular una potencia (un número elevado a otro) mediante multiplicaciones repetitivas, así:
(* POTENCIA.PAS, Segundo ejemplo de funcion *)
(* Parte de CUPAS5, por Nacho Cabanes       *)
 
program PruebaDePotencia;
 
 
function potencia(a,b: integer): integer;   (* Definimos la funcion *)
var
    i: integer;                      (* Locales: para bucles *)
    temporal: integer;               (* y para el valor temporal *)
begin
    temporal := 1;                    (* Inicializacion *)
    for i := 1 to b do
        temporal := temporal * a;     (* multiplicamos "b" veces por "a" *)
    potencia := temporal;             (* y finalmente devolvemos el valor *)
end;
 
 
var
    numero1, numero2: integer;
 
begin                                (* Cuerpo del programa *)
    writeLn('Potencia de un numero entero');
    writeLn;
    writeLn('Introduce el primer numero');
    readLn( numero1 );
    writeLn('Introduce el segundo numero');
    readLn( numero2 );
    writeLn( numero1 ,' elevado a ', numero2 ,' vale ',
        potencia (numero1, numero2) )
end. 
 

Por supuesto, una función puede devolver valores de otros tipos, no solo numéricos. Así, una función que nos devolviera la inicial de una palabra podría ser:
(* INICIAL.PAS, Funcion que devuelve char *)
(* Parte de CUPAS5, por Nacho Cabanes     *)
 
program FuncionInicial;
 
function inicial( texto: string): char;
begin
    inicial := texto[1];
end;
 
(* Cuerpo del programa *)
var
    frase: string;
 
begin
    write('Introduce una frase: ');
    readLn( frase );
    writeLn('Su primera letra es: ', inicial(frase) );
end. 
 
(* 
Ejemplo de ejecucion:
Introduce una frase: hola, que tal
Su primera letra es: h
*)
 
O bien podríamos recorrer una frase formada por varias palabras, para así construir y devolver una cadena que contenga las iniciales de todas ellas:
(* INICIALES.PAS, Funcion que devuelve un string *)
(* Parte de CUPAS5, por Nacho Cabanes            *)
 
program FuncionIniciales;
 
function iniciales( texto: string): string;
var
    temporal: string;
    i: byte;
begin
    temporal := '';
    temporal := temporal + texto[1];
    for i := 2 to length(texto) do
        if texto[i-1] = ' ' then
            temporal := temporal + texto[i];
    iniciales := temporal;
end;
 
(* Cuerpo del programa *)
var
    frase: string;
 
begin
    write('Introduce una frase con varias palabras: ');
    readLn( frase );
    writeLn('Sus iniciales son: ', iniciales(frase) );
end. 
 
(* 
Ejemplo de ejecucion:
Introduce una frase con varias palabras: hola, que tal
Sus iniciales son: hqt
*)