Sie sind auf Seite 1von 9

En muchas ocasiones querremos obtener un valor como resultado de esa

"subrutina" que hemos creado. Llamaremos "funcin" a un procedimiento


capaz de devolver un valor. Por ejemplo, podramos crear una funcin sencilla,
que calcule (y devuelva) el doble del nmero que se le pase como parmetro,
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 funcin se llama "doble".


Tiene un parmetro llamado "numero", que es un nmero entero.
El resultado va a ser tambin un nmero entero.
Antes de salir de la funcin, le asignamos el que ser su valor definitivo.
Desde el cuerpo del programa usamos la funcin 2 veces: la primera
para calcular el doble del nmero "n", que ha introducido el usuario, y la
segunda para hallar el doble de 5.
Ejercicio propuesto 6.3.1: Crea una funcin "triple", que reciba un nmero
real como parmetro, y devuelva como resultado ese nmero multiplicado por
tres.

Una funcin puede recibir ms de un parmetro, y puede realizar operaciones


ms complejas. Por ejemplo, podramos calcular una potencia (un nmero
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.
Ejercicio propuesto 6.3.2: Prepara una funcin llamada "media", que reciba
dos nmeros reales como parmetros, y devuelva como resultado su media
aritmtica.
Ejercicio propuesto 6.3.3: Crear una funcin "potenciaReal", que trabaje con
nmeros reales, y permita clculos como 3.2 elevado a 1.7 (pista; hay que usar
exponenciales y logaritmos, como vimos en el apartado 1.6.3
Ejercicio propuesto 6.3.4: Haz una funcin que halle la raz cbica del
nmero que se le indique (pista: hallar una raz cbica es lo mismo que elevar a
1/3).
Ejercicio propuesto 6.3.5: Define las funciones Suma3 y Producto3, que
calculen suma y producto de tres nmeros enteros, y crea un programa que
haga una operacin u otra segn escoja el usuario (empleando "case").
Por supuesto, una funcin puede devolver valores de otros tipos, no solo
numricos. As, una funcin que nos devolviera la inicial de una palabra podra
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 podramos 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
*)

2.2. Variables booleanas


Una variable "Boolean" (llamadas as en honor al matemtico George
Boole) es una variable lgica, que puede valer TRUE (verdadero)
o FALSE (falso), y se pueden usar para hacer que las condiciones
resulten ms legibles:

(* IF5.PAS, "if" y booleanos


(* Parte de CUPAS5, por Nacho Cabanes

*)
*)

program if5;
var
numero: integer;
esPositivo: boolean;
begin
writeLn('Escriba un numero');
readLn(numero);
esPositivo := numero>0;
if esPositivo then writeLn('El numero es
positivo');
end.
(* Ejemplo de ejecucion:
Escriba un numero
2
El numero es positivo
*)
Ejercicio propuesto 2.2.1: Crea un programa que cree una variable de tipo
boolean, le asigne el valor TRUE y luego muestre dicho valor en pantalla.
Ejercicio propuesto 2.2.2: Crea un programa que pida al usuario un nmero
real y diga si es cero o no, usando una variable boolean.
Ejercicio propuesto 2.2.3: Crea un programa que pida al usuario un nmero
entero y diga si es positivo, negativo o cero, usando dos variables boolean
(esPositivo y esNegativo).
Ejercicio propuesto 2.2.4: Crea un programa que pida al usuario un nmero
entero y diga si es positivo, negativo o cero, usando tres variables boolean
(esPositivo, esNegativo y esCero).

2.3. Muchos posibles valores (case)


Cuando queremos comprobar entre varios posibles valores,
podemos hacerlo con muchos "if" seguidos, pero puede resultar

pesado y hacer que el programa sea poco legible. Hay una alternativa
que resulta mucho ms cmoda en esas ocasiones: la orden case. Su
sintaxis es

case expresion of
caso1: sentencia1;
caso2: sentencia2;
...
casoN: sentenciaN;
end;
o bien, si queremos indicar tambin lo que se debe hacer si no
coincide con ninguno de los valores que hemos enumerado, aadimos
la clusula opcional else:

case expresion of
caso1: sentencia1;
caso2: sentencia2;
...
casoN: sentenciaN;
else
otraSentencia;
end;
(Nota: Esta es la sintaxis empleada por Turbo Pascal y Free Pascal.
En Pascal estndar, esta construccin se empleaba
conotherwise en lugar de "else" para expresar "en caso contrario".
Veamos un ejemplo:

(* CASE1.PAS, Condiciones mltiples con "case" *)


(* Parte de CUPAS5, por Nacho Cabanes
*)
program case1;
var
letra: char;

begin
WriteLn('Escriba un simbolo');
ReadLn(letra);
case letra of
' ':
WriteLn('Un espacio');
'A'..'Z', 'a'..'z': WriteLn('Una letra');
'0'..'9':
WriteLn('Un digito');
'+', '-', '*', '/': WriteLn('Un operador');
else { otherwise en SURPAS y otros compiladores }
WriteLn('No es espacio, ni letra, ni digito,
ni operador');
end;
end.
(* Ejemplo de ejecucion:
Escriba un simbolo
a
Una letra
*)

Una precaucin: la "expresin" debe pertenecer a un tipo de datos


con un nmero finito de elementos, como "integer" o "char", pero
no "real".
Y como se ve en el ejemplo, los "casos" posibles pueden ser valores
nicos, varios valores separados por comas, o un rango de valores
separados por .. (como los puntos suspensivos, pero slo dos).
Ejercicio propuesto 2.3.1: Crea un programa que pida al usuario un smbolo y
diga si es una letra en maysculas, una letra en minsculas o algn otro
smbolo.
Ejercicio propuesto 2.3.2: Crea un programa que pida al usuario una letra y
diga si es una vocal o una consonante.
Ejercicio propuesto 2.3.3: Crea un programa que pida al usuario un nmero
entero del 1 al 3, y escriba en pantalla "Uno", "Dos", "Tres" o "Nmero
incorrecto" segn corresponda.

Ejercicio propuesto 2.3.4: Crea un programa que pida al usuario un nmero,


una operacin (+, -, * o /) y otro nmero, y muestre el resultado de aplicar esa
operacin a esos dos nmeros.

2015 Nacho Cabanes 66

Das könnte Ihnen auch gefallen