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

Procedimientos y Funciones en Pascal

Embed Size (px)

Citation preview

Page 1: Procedimientos y Funciones en Pascal

Unidad 22Procedimientos yProcedimientos yFuncionesFunciones

Paso a paso,no existe otra forma de lograr las cosas

Page 2: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos 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 sen-cillas 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 subproble-mas, también tengamos la necesidad de poder crear y trabajar con subpro-gramas para resolverlos. A estos subprogramas se les suele llamar módu-los, de ahí viene el nombre de programación modular. En Pascal dispone-mos 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 miem-bros de un equipo de programación; además, los programas se pueden es-cribir y probar independientemente del programa principal o de otros mó-dulos.

Por ejemplo, supongamos que tenemos un programa que calcula la des-viació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 so-lución de un problema más o menos complejo.

1

Page 3: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y Funciones

Muestra pantalla de bienvenida

Inicio

Introduce datos

Calcula Media

Calcula desviación estándar

Presentar resultados

Fin

{ Declaraciones iniciales }

{ … }

procedure MuestraPantallaDeBienvenida; { … }

procedure IntroduceDatos; { … }

procedure CalculaMedia; { … }

procedure CalculaDesviaciónEstandar; { … }

procedure PresentaResultados { … }

begin MuestraPantallaDeBienvenida; IntroduceDatos; CalculaMedia; CalculaDesviaciónEstandar; PresentaResultadosend.

Figura 1 Diagrama de flujo para el cálculo de la desviación están-dar 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 dia-grama de flujo, de lado derecho su implementación en Pascal.

Otra características de los subprogramas, es que a su vez, pueden divi-dirse en otros subprogramas para mejorar la legibilidad y manejabilidad del sistema. En la figura 2, podemos observar como dividimos el módulo Calcu-laMedia en otro diagrama de flujo:

Ing. Juventino Ávila Ramos

2

Page 4: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y funciones

Muestra pantalla de bienvenida

Inicio

Introduce datos

Calcula Media

Calcula desviación estándar

Presentar resultados

Inicio

Sumaß 0

i ≤ n

Sumaß Suma+Xi

Promedioß Suma/n

Figura 2 Diagrama de flujo para el cálculo de la desviación están-dar 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 incorpora-dos 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 mo-dularidad y su implementación en Pascal.

3

Page 5: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos 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:

Declaración de procedimiento

Declaración de función

Los diagramas sintácticos permiten al compilador de Pascal detec-tar en una sola revisión la estructura léxica y sintáctica de un pro-grama. Igual a como lo haríamos manualmente. Practica revisando la sintaxis de tus programas antes de escribirlos en la computado-ra 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. Ob-servemos 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, decla-raciones de variable, de tipo y constantes. Finalmente, el terminador del procedimiento es un punto y coma.

Cabecera de procedimiento Bloque ;

Ing. Juventino Ávila Ramos

4

Page 6: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos 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 com-pilador 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 proce-dimiento 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 pro-cedimiento para “personalizar” la ejecución del procedimiento.

procedure identificador

( Sección deparámetros formales )

;

;

La cabecera (signatura o firma) del procedimiento nos dice cómo se llama y qué parámetros espera del usuario. Se recomienda po-ner 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 pa-labra. Recuerda que Pascal no distingue entre mayúsculas y mi-

5

Page 7: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y Funciones

nú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 sin-tá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 po-co 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 descri-be 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 pa-labra var el paso del parámetro será por valor (más adelante describiremos la diferencia).

var

Identificador

,

: Identificador de tipo

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

Ing. Juventino Ávila Ramos

6

Page 8: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y funciones

subprograma se encuentre dentro del ámbito o alcance (que se explicará más adelante) donde se requiera utilizar.

Identificador de procedimiento

( Parámetro actual )

;

;

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:\AUTOEXE-C.BAT’ y Listo.

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:

Cabecera de función Bloque ;

Ejemplo:

7

Page 9: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y Funciones

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 pode-mos 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:

functi on identificador

( Sección deparámetros formales )

;

: Identificador de tipo ;

Ejemplos:

function Tan( angulo : real) : real;

function PieDePagina : string;

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 es-tructura:

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án-dole 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 fun-ción, si se omite el compilador no marcará error alguno, pero puede regre-

Ing. Juventino Ávila Ramos

8

Page 10: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y funciones

sar “basura” o información sin sentido. Pueden incluirse varias sentencias que regresen un valor, pero el valor regresado será la última asignación he-cha durante el flujo de la función.

Los nombres o identificadores de las funciones y procedimientos se es-criben siguiendo las reglas de nombrado de los identificadores, recordemos el diagrama sintáctico:

Letra

Letra o dígito

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 pa-rámetros y el valor de regreso de la función. Los parámetros 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.

9

Page 11: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y Funciones

Información de salida:Valor de retorno

functi on EsPr i mo( numer o : i nteger ) : bool ean; var pr i mo : bool ean; pr ueba : i nteger; begi n pr i mo : = true; pr ueba : = 2; whi l e ( pr i mo and ( pr ueba<=i nt ( sqr t ( numer o) ) ) ) do i f ( numer o mod pr ueba=0 ) then pr i mo : = fal se el se pr ueba : = pr ueba + 1; EsPr i mo : = pr i mo end;

{ … }

i f (EsPri mo(7)) then { l l amada a l a funci ón } { … }

Información de entrada: parámetro

Al llamar a la función: número ß 7

Al regresar de la funciónEsPri mo(7) tendrá el valor true

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: 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 fue-ra 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

Ing. Juventino Ávila Ramos

10

Page 12: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y funciones

referencia se utiliza cuando deseamos modificar el valor de una variable dentro del procedimiento o cuando el tamaño del valor es demasiado gran-de 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 } 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.

11

Page 13: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y Funciones

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 loca-les, incluso se puede redeclarar en ella un identificador que haya sido de-clarado en un bloque más externo. Una rutina declarada en un nivel más in-terno 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 pro-grama. El alcance o ámbito de los identificadores dependerá de su ubica-ción dentro del programa principal (globales) o dentro de algún procedi-miento o función (locales). La siguiente figura muestra los bloques de códi-go correspondientes a un programa Ejemplo:

Ing. Juventino Ávila Ramos

12

Page 14: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y funciones

program Ej empl o;

{ Decl ar aci ones gl obal es }

procedure Pr oc1; { decl ar aci ones l ocal es par a Pr oc1 } begi n { cuer po del pr ocedi mi ent o Pr oc1 } end;

procedure Pr oc2; { decl ar aci ones l ocal es par a Pr oc2} begi n { cuer po del pr ocedi mi ent o Pr oc2 } end;

{ … }

begi n { Cuer po del pr ogr ama pr i nci pal }end.

Blo

que

del p

rogr

ama

prin

cipa

l

Blo

que

del

proc

edim

ient

oB

loqu

e de

l pr

oced

imie

nto

Identación o sangría

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, re-peat y for). De hecho, los procedimientos y funciones son otro tipo de es-tructura 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.

13

Page 15: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos 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:

program Ej empl o;

var x : i nteger;

procedure A; var y : i nteger;

procedure B; var z : i nteger; begi n { códi go del pr ocedi mi ent o B } end;

begi n { cuer po del pr ocedi mi ent o A } end;

{ … }

begi n { Cuer po del pr ogr ama Ej empl o }end.

Ám

bito

de

la v

aria

ble

x

Ám

bito

de

la v

aria

ble

y

Ám

bito

de

la v

aria

ble

z

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 experi-mentados. Es más fácil entenderlo a través del ejemplo clásico: el factorial.

Ing. Juventino Ávila Ramos

14

Page 16: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y funciones

La definición de factorial de un número entero n es el producto acumula-do de todos los números enteros consecutivos desde 1 hasta n, en notación matemática se representa como:

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 mul-tiplicando 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.

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 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 infinita-

15

Page 17: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y Funciones

mente 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 aproxi-mación más adecuada a la definición formal del factorial. De hecho, hay problemas que pueden resolverse únicamente mediante algoritmos recursi-vos e implementarlos de otra forma puede ser muy difícil.

Ing. Juventino Ávila Ramos

16

Page 18: Procedimientos y Funciones en Pascal

Unidad 2Procedimientos y funciones

Bibliografía

Jamsa, Kris y Nameroff, SteveTurbo Pascal, Biblioteca de ProgramasMc Graw Hill, España. 1993ISBN:

Salas Ayape, A. La programación en Lenguaje PascalCentro 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, SteveTurbo Pascal 7, Manual de ReferenciaMc Graw Hill, España. 1993

Sitios recomendados:

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

17