Sunteți pe pagina 1din 18

0

Unidad 2
Procedimientos y funciones

2
Unidad
Procedimientos y
Funciones

Paso a paso,
no existe otra forma de lograr las cosas
1
Unidad 2
Procedimientos y funciones

Uno de los métodos más conocidos para resolver un problema es dividirlo


en fragmentos más pequeños, llamados subproblemas. De esta manera, en
lugar de resolver una tarea compleja y tediosa, resolvemos otras más
sencillas y a partir de ellas llegamos a la solución. Esta técnica se usa
mucho en programación ya que programar no es más que resolver
problemas, y se le suele llamar diseño descendente, metodología del divide
y vencerás o programación top-down.

Es evidente que si esta metodología nos lleva a tratar con


subproblemas, también tengamos la necesidad de poder crear y trabajar
con subprogramas para resolverlos. A estos subprogramas se les suele
llamar módulos, de ahí viene el nombre de programación modular. En
Pascal disponemos de dos tipos de módulos: los procedimientos y las
funciones.

Podemos utilizar los módulos para hacer más legible un programa, para
reutilizar código que puede ser repetitivo, para dividir problemas en sus
partes esenciales, o bien para distribuir la carga de trabajo entre los
miembros de un equipo de programación; además, los programas se
pueden escribir y probar independientemente del programa principal o de
otros módulos.

Por ejemplo, supongamos que tenemos un programa que calcula la


desviación estándar de un conjunto de datos. Observa el diagrama de flujo
de la figura 1. Probablemente, en este ejemplo no se alcancen a percibir
los detalles del código en un lenguaje de programación específico, pero nos
permite observar, a grosso modo, los pasos que deben seguirse para la
solución de un problema más o menos complejo.
Unidad 2 2
Procedimientos y Funciones

{ Declaraciones iniciales }
{ … }
procedure MuestraPantallaDeBienvenida;
{ … }
procedure IntroduceDatos;
{ … }
procedure CalculaMedia;
{ … }
procedure CalculaDesviaciónEstandar;
{ … }
procedure PresentaResultados
{ … }
begin
MuestraPantallaDeBienvenida;
IntroduceDatos;
CalculaMedia;
CalculaDesviaciónEstandar;
PresentaResultados
end.

Figura 1 Diagrama de flujo para el cálculo de la desviación


estándar de un conjunto de números. Observa la
utilización del símbolo de “proceso predefinido” para la
descripción de un módulo de programación. De lado
izquierdo el diagrama de flujo, de lado derecho su
implementación en Pascal.

Otra características de los subprogramas, es que a su vez, pueden


dividirse en otros subprogramas para mejorar la legibilidad y manejabilidad
del sistema. En la figura 2, podemos observar como dividimos el módulo
CalculaMedia en otro diagrama de flujo:

Ing. Juventino Ávila Ramos


3
Unidad 2
Procedimientos y funciones

Figura 2 Diagrama de flujo para el cálculo de la desviación


estándar de un conjunto de números. Se observa como
un módulo puede ser detallado como sea necesario.

A lo largo del segundo semestre de la asignatura has utilizado funciones


y procedimientos como los procedimientos readln o writeln. Existen
algunos subprogramas que se utilizan de manera común y por ello están
incorporados dentro del lenguaje de programación. Sin embargo, también
podemos crear nuestros propios procedimientos y funciones.

A continuación describiremos algunos conceptos adicionales sobre


modularidad y su implementación en Pascal.
Unidad 2 4
Procedimientos y Funciones

Procedimientos y Funciones en Pascal

Los procedimientos y funciones son elementos para lograr la modularidad


en los programas hechos en el lenguaje Pascal. El diagrama sintáctico para
su implementación es el siguiente:


Los diagramas sintácticos permiten al compilador de Pascal
detectar en una sola revisión la estructura léxica y sintáctica de un
programa. Igual a como lo haríamos manualmente. Practica
revisando la sintaxis de tus programas antes de escribirlos en la
computadora y cuando te marque error el compilador.

Procedimiento

Un procedimiento es un subprograma que realiza una tarea específica. La


estructura de un procedimiento es casi idéntica a la de un programa.
Observemos la declaración del procedimiento a través del uso del diagrama
sintáctico: iniciamos con la cabecera del procedimiento y terminamos con
el bloque del procedimiento, el cual puede contener subprogramas,
declaraciones de variable, de tipo y constantes. Finalmente, el terminador
del procedimiento es un punto y coma.

Ing. Juventino Ávila Ramos


5
Unidad 2
Procedimientos y funciones


Es muy importante que aprendas cómo interpretar los diagramas
sintácticos, los cuales son una herramienta muy útil desarrollada
para describir el lenguaje de programación Pascal, cuando el
compilador detecta errores es fácil seguir tu programa, verificando
que siga una sintaxis adecuada.

Ejemplo:

procedure BorrarPantalla; { Cabecera de procedimiento }


begin
textattr:=$0F; { Bloque }
clrscr
end;

Podemos ver con más detalle la cabecera de procedimiento, iniciamos


con la palabra reservada procedure, seguida de un identificador del
procedimiento que sigue las reglas de creación de los identificadores
utilizados para declarar los nombres de las variables o los nombres de los
programas.

A continuación se muestra una lista opcional de parámetros formales del


subprograma, los cuales nos permiten enviar información adicional al
procedimiento para “personalizar” la ejecución del procedimiento.
Unidad 2 6
Procedimientos y Funciones


La cabecera (signatura o firma) del procedimiento nos dice cómo
se llama y qué parámetros espera del usuario. Se recomienda
poner nombres descriptivos a los identificadores del procedimiento
y a los parámetros para identificarlos rápidamente. Además, el
estilo de Pascal es el uso de minúsculas y mayúsculas iniciando
cada palabra. Recuerda que Pascal no distingue entre mayúsculas
y minúsculas, por lo que los identificadores MiNombre, MINOMBRE y
minombre tendrán el mismo significado para el compilador.

Ejemplos:

procedure BorrarPantalla;

En la declaración del procedimiento BorrarPantalla, observa que no se


utilizan parámetros, la cual es cierto cuando observamos el diagrama
sintáctico anterior para la declaración del procedimiento.

procedure VisualizarArchivo( NombreArchivo : string;


var OK : boolean);

En este segundo ejemplo se declara un procedimiento


VisualizarArchivo que acepta dos parámetros uno por valor
NombreArchivo de tipo string y otro por referencia OK de tipo boolean. A
continuación hablaremos un poco más acerca del uso de parámetros dentro
de los subprogramas.

El diagrama sintáctico para la sección de parámetros formales se


describe en la siguiente. El uso de la palabra reservada var indicará que el
parámetro debe ser una variable y el paso será por referencia, si se omite
la palabra var el paso del parámetro será por valor (más adelante
describiremos la diferencia).

Ing. Juventino Ávila Ramos


7
Unidad 2
Procedimientos y funciones

Para utilizar un procedimiento, o hacer una llamada al procedimiento, se


utilizará el identificador del mismo, seguido de los parámetros de llamada o
actuales con los que contará el procedimiento. Para ello es necesario que el
subprograma se encuentre dentro del ámbito o alcance (que se explicará
más adelante) donde se requiera utilizar.

Por ejemplo:

 BorrarPantalla; invocará al método creado anteriormente en


la declaración del procedimiento

 VisualizarArchivo(‘C:\AUTOEXEC.BAT’, Listo);
ejecutará el procedimiento VisualizarArchivo con los
parámetros ‘C:\AUTOEXEC.BAT’ y Listo.
Unidad 2 8
Procedimientos y Funciones

Función

Una función es un subprograma que tiene un valor de retorno, el cual


puede ser utilizado dentro de la evaluación de una expresión. El diagrama
sintáctico para la declaración de una función es el siguiente:

Ejemplo:

function Tan( angulo : real) : real; { Cabecera de función }


begin
Tan := sin(angulo)/cos(angulo) { Bloque }
end;

De hecho es muy similar en concepto al del procedimiento. Pero


podemos observar con mayor detenimiento la declaración de la cabecera
de la función y observaremos al final la necesidad de especificar el tipo de
dato que regresará la función:

Ejemplos:

function Tan( angulo : real) : real;

function PieDePagina : string;

Ing. Juventino Ávila Ramos


9
Unidad 2
Procedimientos y funciones

Otra diferencia respecto a los procedimientos, es que en el cuerpo de la


función debe regresarse el valor de la función de acuerdo a la siguiente
estructura:

function Tan( angulo : real) : real; { Cabecera de función }


begin
{ Aquí pueden ir otras instrucciones }
Tan := sin(angulo)/cos(angulo) { Debe haber al menos
una línea con el identificador
asignándole un valor válido de
acuerdo al tipo de la función }
end;

Este valor se conoce como valor de retorno o valor de regreso de la


función, si se omite el compilador no marcará error alguno, pero puede
regresar “basura” o información sin sentido. Pueden incluirse varias
sentencias que regresen un valor, pero el valor regresado será la última
asignación hecha durante el flujo de la función.

Los nombres o identificadores de las funciones y procedimientos se


escriben siguiendo las reglas de nombrado de los identificadores,
recordemos el diagrama sintáctico:

Parámetros

Todo lo que existe dentro del bloque del subprograma es desconocido


para el resto del programa. Las únicas interfaces con el exterior son los
parámetros y el valor de regreso de la función. Los parámetros
Unidad 2 10
Procedimientos y Funciones

proporcionan información de entrada y, en el caso del valor de retorno es


información de salida.

El uso de los parámetros dentro de las funciones y procedimientos nos


permite tener un comportamiento más especializado de los módulos. El uso
de los parámetros tiene el mismo efecto que declarar variables dentro del
procedimiento.

Como se mencionó anteriormente, el paso de parámetros puede ser por


referencia o por valor. El ejemplo anterior utiliza paso por valor, esto es:

Ing. Juventino Ávila Ramos


11
Unidad 2
Procedimientos y funciones

cuando se pasa un parámetro por valor a un procedimiento se guarda una


copia temporal de la variable. Dentro del procedimiento sólo se utiliza una
copia, si se modifica el valor del parámetro, dentro del subprograma, sólo
afectará el almacenamiento temporal; la variable (o parámetro) actual
fuera del procedimiento nunca se toca. Cuando se hace una llamada por
valor, pueden enviarse tanto variables como constantes. A diferencia del
paso por referencia, donde se envía una referencia a una variable; si se
modifica dentro de la función, entonces se modificará. El envío de
parámetros por referencia se utiliza cuando deseamos modificar el valor de
una variable dentro del procedimiento o cuando el tamaño del valor es
demasiado grande y no queremos enviarlo para no sobrecargar la
memoria.

El siguiente ejemplo muestra como se modifica una variable enviada por


valor:

programa Modifica;

var
A, B;

procedure incrementaEnUno(var X : integer); { paso por referencia


}
begin
X := X+10
end;

begin
A := 5;
B := 48;
incrementaEnUno(A);
writeln(A); { escribe 15, porque se envió una referencia }
incrementaEnUno(B);
writeln(B); { escribe 48, porque se envió una referencia }
end.

El mismo programa por paso por valor sería el siguiente:

programa Modifica;

var
A, B;

procedure incrementaEnUno(X : integer); { paso por valor }


Unidad 2 12
Procedimientos y Funciones

begin
X := X + 1
end;

begin
A := 5;
B := 48;
incrementaEnUno(A);
writeln(A); { escribe 5, no modifica A, sólo envió una copia }
incrementaEnUno(B);
writeln(B); { escribe 48, no modifica B, sólo envió una copia }
end.

Alcance de los identificadores

El PASCAL es un lenguaje para la programación estructurada en


bloques. Permite anidar bloques de rutinas, no sólo dentro del programa
principal, sino también dentro de otros subprogramas o rutinas.

Cada rutina puede tener sus propias declaraciones y definiciones locales,


incluso se puede redeclarar en ella un identificador que haya sido declarado
en un bloque más externo. Una rutina declarada en un nivel más interno
tiene acceso a las declaraciones y definiciones hechas en todos los bloques
que la contienen.

La parte del programa donde se tiene acceso a un identificador se llama


ámbito o alcance del identificador. Fuera de ese dominio, un identificador
no tiene significado o tiene significado diferente. Concretamente, el ámbito
de un identificador es el bloque donde ha sido declarado.

Como los bloques pueden estar anidados, el alcance de un identificador


puede incluir a bloques situados a niveles inferiores en la jerarquía del
programa. El alcance o ámbito de los identificadores dependerá de su
ubicación dentro del programa principal (globales) o dentro de algún
procedimiento o función (locales). La siguiente figura muestra los bloques
de código correspondientes a un programa Ejemplo:

Ing. Juventino Ávila Ramos


13
Unidad 2
Procedimientos y funciones

Dentro del programa se declaran dos procedimientos Proc1 y Proc2. El


área sombreada representa una sangría o identación que debe guardarse,
al igual que en las estructuras de control (if…then, if…then…else, while,
repeat y for). De hecho, los procedimientos y funciones son otro tipo de
estructura de control y por lo tanto pueden tener anidamientos.

En Pascal, que es un lenguaje muy ordenado, no se puede utilizar


ningún identificador, incluyendo a los procedimientos y funciones, sin
declararlos previamente.
Unidad 2 14
Procedimientos y Funciones

No pueden existir dos identificadores con el mismo nombre en el mismo


nivel de anidamiento, y aunque de hecho no es una buena práctica hacerlo,
se usa en ocasiones. Veamos el siguiente ejemplo:

Recursividad

La recursividad es una técnica mediante la cual un procedimiento o una


subrutina se llama a si mismo para poder realizar su tarea. De hecho es un
concepto difícil de entender, incluso para muchos programadores

Ing. Juventino Ávila Ramos


15
Unidad 2
Procedimientos y funciones

experimentados. Es más fácil entenderlo a través del ejemplo clásico: el


factorial.

La definición de factorial de un número entero n es el producto


acumulado de todos los números enteros consecutivos desde 1 hasta n, en
notación matemática se representa como:

n
n !   n  1  2  3  ...  (n  1)  n
i 1

La función factorial no recursiva asociada al algoritmo anterior sería la


siguiente:

function factorial( n : integer ) : longint;


var
f : longint;
i : integer;
begin
f := 1;
for i := 1 to n do
f := f * i;
factorial := f
end;

Observa que se crea una variable f con un valor inicial de 1 y se va


multiplicando repetidamente por i mientras cambia de valor de uno en uno
hasta n. Otra forma de entender este problema es mediante la siguiente
definición recursiva.

 n
n !   n  1  2  3  ...  (n  1)  n  (n  1)!n
 i 1
 0!  1

Y se entiende que Factorial(n) = n*Factorial(n–1), es decir,


multiplicamos n por el factorial del número anterior a n. Observa que existe
una condición en la cual deja de hace la llamada iterativa a la función de de
Unidad 2 16
Procedimientos y Funciones

factorial, ésta es una definición que dice que el factorial de 0 = 1. Esta


última condición debe cumplirse en las funciones recursivas para que no se
ejecuten infinitamente las llamadas recursivas a la función o
procedimiento. El equivalente recursivo de la función factorial es el
siguiente:

function factorial( n : integer ) : longint;


begin
if (n=0) then
factorial := 1 { condición de paro }
else
factorial := factorial(n-1) * n { llamada recursiva }
end;

Probablemente se te haga un poco rebuscada, pero esta es una


aproximación más adecuada a la definición formal del factorial. De hecho,
hay problemas que pueden resolverse únicamente mediante algoritmos
recursivos e implementarlos de otra forma puede ser muy difícil.

Ing. Juventino Ávila Ramos


17
Unidad 2
Procedimientos y funciones

Bibliografía

Jamsa, Kris y Nameroff, Steve


Turbo Pascal, Biblioteca de Programas
Mc Graw Hill, España. 1993
ISBN:

Salas Ayape, A.
La programación en Lenguaje Pascal
Centro de Cálculo de la Universidad de Zaragoza, España, 1988.
http://wwwdi.ujaen.es/~lidia/topografia/ccuz19.pdf

Stephen K. O’Brien y Nameroff, Steve


Turbo Pascal 7, Manual de Referencia
Mc Graw Hill, España. 1993

Sitios recomendados:

 http://www.lawebdelprogramador.com/cursos/

S-ar putea să vă placă și