Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Funciones y Procedimientos
2
ÍNDICE
• Introducción
• Tipos de subprogramas
• Procedimientos
• Funciones
• Declaración y llamada de subprogramas propios: conceptos básicos
• Declaración de subprogramas propios
• Declaración de Procedimientos
• Declaración de Funciones
• Identificadores locales y globales
• Parámetros
• Tipos de parámetros
• Parámetros formales y parámetros actuales
• Paso de Parámetros
• Criterios de selección
• Generación de números aleatorios
Introducción 3
• Subprograma:
parte autónoma del programa, que realiza una tarea específica y puede ser
llamada desde diferentes partes del programa
• Ventajas:
• Reducción de código repetido a lo largo del programa
• Reutilización de código en múltiples programas
• División de un problema complejo en varios sencillos:
Programación Modular: divide y vencerás
• Mejor legibilidad
Diseño de subprogramas
• Subprogramas claros y sencillos con una única misión
• Mostrar datos
• Leer datos correctos
• Realizar cálculos concretos sobre los datos. Ejemplo:
calcular la media
• …
USES
(*Unidades*)
CONST
DECLARACIONES (*Constantes*)
Y DEFINICIONES FUNCTION/PROCEDURE
(*Declaración de Subprogramas*)
DATOS
VAR
(*Variables*)
BEGIN
SENTENCIAS: (*Sentencias*)
{Leer datos}
OPERACIONES CON LOS DATOS
{Llamadas a los subprogramas}
{Hacer operaciones}
{Mostrar resultados}
END.
• Funciones:
- Valor que se genera como resultado de la ejecución de una secuencia de
instrucciones en función de unos parámetros (si existen)
- Cuando se utilizan o se llaman, aparecen dentro de expresiones u operaciones
DECLARACIÓN
• Se define el funcionamiento del subprograma
• Se indican los datos necesarios para su ejecución :
•Parámetros Formales
• Se compone de:
• Cabecera
• Sección de Declaraciones
• Sentencias
LLAMADA
• Sentencia que dispara la ejecución del subprograma
• Se pasan al subprograma los datos necesarios para la ejecución actual:
•Parámetros Actuales
PROGRAM Nombre;
USES
CONST
TYPE
VAR
{Declaración de procedimientos y/o funciones}
PROCEDURE NombreProcedimiento (lista de parámetros formales);
… {Declaraciones y Código del procedimiento}
FUNCTION NombreFunción (lista de parámetros formales) : Tipo valor devuelto;
… {Declaraciones y Código de la función}
BEGIN
…
{Utilización o Llamada de procedimientos y/o funciones}
NombreProcedimiento (lista de parámetros actuales);
Variable_Resultado := NombreFunción (lista de parámetros actuales);
…
END.
…
Declaraciones locales:
PROCEDURE Identificador (lista de Parámetros Formales) ;
solamente son conocidas
CONST dentro del procedimiento
{Declaración de constantes, si es necesario} Estructura igual a la de un
TYPE programa, excepto USES
{Declaración de tipos, si es necesario}
VAR
{Declaración de variables LOCALES, si es necesario} Caso más habitual
…
FUNCTION Identificador (lista de Parám. Form.) : Tipo_del_valor_devuelto ; Declaraciones locales:
solamente son conocidas
CONST
dentro del procedimiento
{Declaración de constantes, si es necesario}
TYPE Estructura igual a la de un
{Declaración de tipos, si es necesario} programa, excepto USES
VAR
{Declaración de variables LOCALES, si es necesario} Caso más habitual
NOTA: El identificador de la función solamente se puede utilizar para asignarle valores ESCRITURA
…
FUNCTION fnNombreFuncion (lista de Parámetros Formales) : Tipo_del_valor_devuelto ;
VAR
{Declaración de variable LOCAL para almacenar el valor devuelto}
ValorDevolver : Tipo_del_valor_devuelto;
BEGIN
END;
…
Ámbito de un identificador
Región del programa en el que está definido dicho identificador y, por tanto, se puede
utilizar. Hay dos tipos de ámbitos:
• Global: identificadores definidos en la zona de declaraciones del programa principal.
Pueden ser referenciados tanto en el programa principal como en los subprogramas
definidos dentro de él.
• Local: identificadores definidos en la zona de declaraciones del subprograma. Pueden ser
referenciados tanto en el subprograma como en los subprogramas definidos dentro de él.
Aplicable a:
• Variables
• Funciones y procedimientos
Ámbito de un identificador
Acceso a las variables del programa:
Las variables accedidas dentro de un subprograma deben:
• o bien encontrarse en la zona de declaración local VAR
• o bien encontrarse definidas como parámetro formal
PROGRAM EjemploPasoValor;
VAR
iValor1, iValor2 : Integer;
{Declaración de función}
FUNCTION fnRdoSuma (iSumando1, iSumando2 : Integer) : Integer;
VAR
iRdoSuma : Integer; …
BEGIN BEGIN
iRdoSuma := iSumando1 + iSumando2; WriteLn (‘Introducir 2 sumandos’);
fnRdoSuma := iRdoSuma; ReadLn (iValor1, iValor2);
END; Write (‘El resultado de la suma es ‘);
… WriteLn ( fnRdoSuma (iValor1, iValor2));
END.
Ámbito de un identificador
Normas de acceso a los subprogramas:
1. Un subprograma puede llamarse a sí mismo (llamada recursiva) y a los
subprogramas que lo engloban.
2. Un subprograma puede llamar a los subprogramas de su mismo nivel que
hayan sido declarados antes que él.
3. Un subprograma puede llamar a los subprogramas internos (declarados
dentro de él).
• Salida
- Variables donde se guardan resultados de la ejecución del subprograma
- Al hacer la llamada, el programa que le ha llamado le indica al subprograma en qué variable
o variables debe dejar el resultado de su ejecución.
- Ejemplo: ReadLn (iValor1) iValor1 es parámetro de salida
FUNCIONES
Procedimiento
Procedimiento
Procedimiento Función
Procedimiento
Procedimiento
Procedimiento
Procedimiento Procedimiento Función
• Parámetros formales
• Parámetros que se indican en la cabecera de la DECLARACIÓN del subprograma
• Sirven para declarar CUÁNTOS DATOS de ENTRADA y/o SALIDA debe tener el
subprograma cuando se utilice, así como los TIPOS de cada uno de estos datos.
• Hay que indicar para cada parámetro: el modo, el nombre y el tipo de dato
• Modo*: paso por valor (-), paso por referencia (VAR) o paso por constante (CONST)
• Parámetros actuales
• Parámetros de ENTRADA y/o SALIDA que deben pasarse y/o ser devueltos por el
subprograma en la LLAMADA a dicho subprograma, es decir, cuando se utiliza
dicho subprograma desde el programa principal o desde otro subprograma.
• NO hay que indicar el MODO ni el TIPO de dato
• Los parámetros actuales y formales deben coincidir en:
NÚMERO, POSICIÓN y TIPO
PROGRAM EjemploPasoValor;
{Declaración de función}
FUNCTION fniRdoSuma (iSumando1, iSumando2 : Integer) : Integer;
VAR
iRdoSuma : Integer;
BEGIN
iRdoSuma := iSumando1 + iSumando2;
fniRdoSuma := iRdoSuma;
END;
VAR
iValor1, iValor2 : Integer;
{Programa Principal}
BEGIN
WriteLn (‘Introducir 2 sumandos’);
ReadLn (iValor1, iValor2);
WriteLn (‘El resultado de la suma es ‘, fniRdoSuma (iValor1, iValor2));
END.
PROGRAM EjemploPasoValor;
{Declaración de función}
FUNCTION fniRdoSuma (CONST iSumando1, iSumando2 : Integer) : Integer;
VAR
iRdoSuma : Integer;
BEGIN
iRdoSuma := iSumando1 + iSumando2;
fniRdoSuma := iRdoSuma;
END;
VAR
iValor1, iValor2 : Integer;
BEGIN
WriteLn (‘Introducir 2 sumandos’);
ReadLn (iValor1, iValor2);
WriteLn (‘El resultado de la suma es ‘, fniRdoSuma (iValor1, iValor2));
END.
Resumen
CRITERIOS DE SELECCIÓN
• SUBPROGRAMA:
• sin parámetros (ni recibe ni devuelve)
• solo con parámetros de ENTRADA
• con más de un parámetro de SALIDA PROCEDURE
• con parámetros de ENTRADA y más de un parámetro de SALIDA
• con más de un parámetro ENTRADA-SALIDA
• con parámetros de ENTRADA, SALIDA y ENTRADA-SALIDA
RANDOM Y RANDOMIZE
RANDOMIZE
• PROCEDIMIENTO que inicializa el generador de números aleatorios
RANDOM
• FUNCIÓN que devuelve un número aleatorio
• Random; devuelve número aleatorio de tipo real entre 0.0 y 1.0
• Random (N);
• devuelve número aleatorio de tipo entero entre 0 y N-1
• N es de tipo Word (0..65535)
RANDOM Y RANDOMIZE
PROGRAM EjemploAleatorios;
VAR
i: Integer;
BEGIN
Randomize;
FOR i := 1 TO 10 DO
Write (Random(10), ‘ , ‘);
END;
RANDOM Y RANDOMIZE
PROGRAM EjemploWhile;
FUNCTION fniSeguir: Integer;
VAR
PROGRAM EjemploWhile;
iSeguir: Integer;
VAR
BEGIN
iSeguir : Integer;sumar números? Pulse 1 en caso afirmativo, y 0 en caso negativo: ' );
Write ('¿Desea
rSuma,
ReadLnrValor:
(iSeguir);Real;
Ejemplo: BEGIN
fniSeguir := iSeguir;
rSuma := 0;
Realizar un programa que sume los números END;
Write ('¿Desea sumar números? Pulse 1 en caso afirmativo, y 0 en caso negativo: ' );
VAR
(reales) introducidos por teclado. Para ello, se ReadLn
iSeguir : (iSeguir);
Integer;
deberá preguntar al usuario si desea seguir rSuma, rValor: Real;
sumando números en cada iteración. Al WHILE iSeguir = 1 DO
BEGIN
finalizar, deberá mostrarse el resultado en la BEGIN:= 0;
rSuma
pantalla. Write:=
iSeguir ('Introduzca
fniSeguir; nuevo valor a sumar ');
ReadLn
WHILE (rValor);
iSeguir = 1 DO
rSuma
BEGIN := rSuma + rValor;
Write ('¿Desea
('Introduzcasumar números?
nuevo 1 en caso afirmativo, y 0 en caso negativo: ’ ');
Pulse ');
valor a sumar
(iSeguir);
ReadLn (rValor);
END;
rSuma := rSuma + rValor;
WriteLn
iSeguir('El
:=resultado
fniSeguir;de la suma es ', rSuma : 0 : 2);
END.
END;
WriteLn ('El resultado de la suma es ', rSuma : 0 : 2);
END.
Ejemplo 2 Subprogramas 46
Ejemplo:
Realizar un programa que muestra un menú y
PROGRAM EjemploRepeat;
se asegure que un usuario introduce una opción
PROCEDURE ElegirOpcion (VAR iOpc: Integer);
válida
BEGIN
REPEAT
PROGRAM EjemploRepeat;
Write ('Introduzca su Opcion: ');
ReadLn (iOpc);
VAR
UNTIL (iOpc>= 1) AND (iOpc<= 3);
iOpc : Integer;
END;
VAR
BEGIN
iOpc : Integer;
WriteLn('----------MENU-------------');
BEGIN
WriteLn('1. Hacer una Suma');
WriteLn('----------MENU-------------');
WriteLn('2. Hacer una Resta');
WriteLn('1. Hacer una Suma');
WriteLn('3. Hacer una Multiplicación');
WriteLn('2. Hacer una Resta');
WriteLn;
WriteLn('3. Hacer una Multiplicación');
REPEAT
WriteLn;
Write ('Introduzca su Opcion: ');
ElegirOpcion (iOpc);
ReadLn (iOpc);
WriteLn('Ha elegido la opcion ',iOpc);
UNTIL (iOpc>= 1) AND (iOpc<= 3);
END.
WriteLn('Ha elegido la opcion ',iOpc);
END.
Ejemplo 3 Subprogramas 47
Ejemplo: Ejemplo:
Realizar una función que permita hacer el Realizar una función que permita elevar un número a
factorial de cualquier número. cualquier otro.
PROGRAM ElevarNumero;
PROGRAM Factorial;
FUNCTION fniElevar (iNum, iElevacion: Integer): Integer;
FUNCTION fniFactorial (iNum: Integer): Integer;
VAR
VAR
PROGRAM Factorial;
iResultado: LongInt;
iResultado, i: Integer;
VAR
i: Integer;
BEGIN
i, iResultado : Integer;
BEGIN
iResultado := 1;
BEGIN
iResultado := 1;
FOR i:= 1 TO
iResultado iNum DO
:= 1;
FOR i:= 1 TO iElevacion DO
FORiResultado
i := 1 TO 5:=DO iResultado*i;
iResultado := iResultado*iNum;
fniFactorial
iResultado:=:=iResultado;
iResultado*i;
fniElevar := iResultado;
END;
END.
END;
VAR
VAR
iResultado : Integer;
iResultado : LongInt;
BEGIN
BEGIN
iResultado := fniFactorial(5);
iResultado := fniElevar(5,5);
END.
END.
REFERENCIAS 48