Logo Studenta

09 - Subprogramas

¡Este material tiene más páginas!

Vista previa del material en texto

Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 1 de 13 
 
 
 
UNIVERSIDAD TECNOLÓGICA NACIONAL 
 
 
INGENIERIA EN SISTEMAS 
 
 
Cátedra: 
 
“ALGORITMOS Y ESTRUCTURAS DE DATOS” 
 
 
 
UNIDAD Nº 7 
 
 
SUBPROGRAMAS 
 
PROCEDIMIENTOS Y FUNCIONES 
 
 
 
 
 
 
 
 
 
 
 
 
Ing. Esp. Rosanna M. MAINIERI 
 
 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 2 de 13 
UNIDAD 7: 
 
 
 
SUBPROGRAMAS 
 
PROCEDIMIENTOS Y FUNCIONES 
 
 
 
 
 
 Supbrogramas .................................................................................3 
 Procedimiento..................................................................................4 
 Función............................................................................................4 
 Ejemplo con Procedimiento y con Función......................................5 
 Diagrama de Módulos …...... ...........................................................6 
 Diferencia entre Procedimiento y Función .......................................7 
 Parámetros ......................................................................................8 
 Variables Locales y Globales ........................................................10 
 Codificación del Programa.............................................................11 
 Ejemplo de uso: Parámetro Por Valor y Parámetro Variable.........12 
 Bibliografía.....................................................................................13 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 3 de 13 
 
SUBPROGRAMAS 
 
 
El concepto de Subprograma fue introducido en la Unidad 1, debemos recordar 
los siguientes términos: 
 
 Acción Simple 
 Acción Compuesta 
 Programación Modular 
 Diseño Descendente 
 Programación Estructurada 
 
 
En programación modular el programa se divide en módulos (subprograma), cada 
uno de los cuales resuelve una actividad o tarea y se codifican 
independientemente de otros módulos. Cada uno de estos módulos se analizan, 
codifican y ponen a punto por separado. 
 
Podemos decir que los términos siguientes son sinónimos: 
 
Subprograma, Módulo, Acción Compuesta, Proceso o Subalgoritmo: Es un 
conjunto de acciones (sentencias), agrupadas bajo un nombre, que resuelven 
una tarea o subproblema. 
 
 
Cada programa contiene un módulo denominado programa principal que controla 
todo lo que sucede. Este programa principal es el que transfiere el control a los 
otros módulos (subprogramas), de modo que ellos pueden ejecutar sus funciones. 
Cuando el módulo ejecuta su tarea devuelve el control al módulo principal o al 
módulo que lo llamó. 
 
Lo más interesante del Diseño Descendente, que incluye a la Programación 
Modular, es que trata en forma separada lo global de los detalles, un 
subprograma oculta el detalle sobre la resolución global. 
 
Resulta más sencillo resolver al problema subdividiéndolo en subproblemas 
siendo así más fácil llegar a la solución. Además, es conveniente aplicar este 
método ya que habitualmente se trabaja en equipo y cada grupo del equipo, 
entonces, puede encargarse de resolver una parte, ensamblando luego todas las 
soluciones de estos subproblemas. Otra de las ventajas es la reutilización de 
código, es decir, que si una misma tarea se debe realizar en distintas partes de un 
programa, se escribe (se programa) una vez y se la invoca todas las veces que 
sea necesario. 
 
Entre el módulo llamante y el módulo llamado se debe transmitir información, ya 
sea porque el módulo llamado necesita datos para poder trabajar o porque 
devuelve los resultados obtenidos. 
 
Parámetros o Argumentos: Información que se transmite entre módulos. 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 4 de 13 
 
Existen dos tipos de subprogramas: 
 
 Procedimientos 
 Funciones 
 
 
PROCEDIMIENTO 
 
 
El procedimiento es un subprograma, que devuelve uno, varios o ningún 
resultado y devuelve estos resultados a través de parámetros. 
 
El procedimiento es creado para resolver una tarea. Para trabajar puede necesitar 
recibir información del módulo llamante, esta información la recibe a través de los 
parámetros de entrada. El procedimiento luego trabaja, es decir realiza la tarea 
para la cual fue creado. Si obtiene resultados para devolver al módulo llamante, 
los devuelve a través de los parámetros de salida. 
 
¿Cómo se invoca a un procedimiento? 
 
El procedimiento tiene la misma forma que un programa. Para invocar (o llamar) 
a un procedimiento solamente se lo nombra, indicando los parámetros entre 
paréntesis. 
 
NombreProcedimiento (Lista de parámetros) 
 
Si el subprograma no devuelve resultados al módulo que lo invocó es porque 
muestra los resultados en el mismo subprograma. 
 
 
FUNCIÓN 
 
 
La función es un subprograma que devuelve un solo resultado y lo hace a través 
del nombre de la misma. 
 
La función es creada para resolver una tarea y obtener un solo dato simple como 
resultado. Para trabajar puede necesitar recibir información del módulo llamante, 
esta información la recibe a través de los parámetros de entrada. La función luego 
trabaja, es decir realiza la tarea para la cual fue creada y devuelve el resultado a 
través del nombre, al módulo llamante. 
 
La función es una expresión (es un dato simple) y debe ser invocada como tal. 
Se diferencia del procedimiento ya que cuando se la invoca debe ser considerada 
como un dato en sí. 
 
¿Cómo se invoca a una función? 
 
Se invoca a una función en cualquier sentencia a excepción de la sentencia de 
Lectura o Ingreso. Mostramos 3 formas posibles: 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 5 de 13 
 
 
1. En una sentencia de Asignación 
 
NombreVariable  NombreFunción (Lista de parámetros) 
 
2. En una sentencia de Salida o Mostrar 
 
Mostrar (NombreFunción (Lista de parámetros)) 
 
3. En una sentencia de Decisión 
 
Si NombreFunción(Lista de parámetros) > 10 entonces ACCIÓN_A 
 
 
 
EJEMPLO RESUELTO CON PROCEDIMIENTO Y CON FUNCIÓN 
 
Se tienen como datos dos números enteros, se los debe ingresar en el programa 
principal. Se desea calcular el promedio de los mismos, invocando a un 
subprograma, y mostrar el resultado en el programa principal. Resolverlo de dos 
formas distintas: 
 
a) Utilizar un procedimiento 
b) Utilizar una función. 
 
a) CON PROCEDIMIENTO 
 
 
PROGRAMA PRINCIPAL 
Ingresar (N1, N2) 
PROMEDIO (N1, N2, PROM) 
Mostrar (‘El promedio es ’, PROM) 
 
PROMEDIO (N1, N2, PROM) 
ACUM  N1 + N2 
PROM  ACUM / 2 
 
En este caso, cuando se invoca al Procedimiento PROMEDIO desde el programa 
principal, la computadora transmite el control al módulo llamado PROMEDIO. Se 
ejecutan todas las acciones del módulo invocado y al finalizar se devuelve el 
control a la sentencia siguiente a la invocación. Al llamar a PROMEDIO se envía 
como datos N1 y N2. El subprograma se ejecuta y devuelve el resultado en el 
parámetro PROM. 
 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 6 de 13 
 
 
b) CON FUNCIÓN 
 
 
PROGRAMA PRINCIPAL 
Ingresar (N1, N2) 
PROME  FUNCPRO (N1, N2) 
Mostrar (‘El promedio es ’, PROME) 
 
FUNCPRO (N1, N2) 
ACUM  N1 + N2 
FUNCPRO  ACUM / 2 
 
En este caso, cuando se invoca a la función FUNCPRO desde el programa 
principal, la computadora transmite el control al módulo llamado FUNCPRO. Se 
envía como datos (parámetros) N1 y N2. El subprograma se ejecuta y devuelve el 
resultado bajo el nombre de la función FUNCPRO. En el algoritmo principal se 
asigna ese resultado a la variable simple PROME. 
 
 
DIAGRAMA DE MODULOS 
 
 
a) CON PROCEDIMIENTO 
 
 
Cantidad de Parámetros: 3 
 Parámetros de Entrada: 2 
 Parámetros de Salida: 1 
 
 
PROMEDIO. 
PROGRAMA 
PRINCIPAL 
N1, N2 
PROM 
 
 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 7 de 13 
 
 
 
b) CON FUNCIÓN 
 
 
Cantidadde Parámetros: 2 
 Parámetros de Entrada: 2 
 Parámetros de Salida:0 
EL RESULTADO SE DEVUELVE EN EL 
NOMBRE DE LA FUNCIÓN !!! 
 
 
 
DIFERENCIAS 
PROCEDIMIENTO FUNCION 
Devuelve uno, ninguno o varios 
resultados. Devuelve un resultado. 
Devuelve los resultados a través de 
parámetros 
Devuelve el resultado a través de su 
nombre 
Se lo invoca nombrándolo, indicando 
los parámetros entre paréntesis 
Se lo invoca en cualquier sentencia a 
excepción de la de Ingreso (Lectura), 
indicando los parámetros entre 
paréntesis. 
Puede tener parámetros Por Valor y 
Por Referencia (*) 
Sólo puede tener parámetros Por 
Valor (*) 
Su nombre nunca aparece dentro del 
mismo procedimiento 
Su nombre debe aparecer al menos 
una vez dentro de la función, 
sentencia en la que se le asigna el 
resultado 
Para realizar la misma tarea la función tendrá un parámetro menos que el 
procedimiento 
 
 
(*) Veremos más adelante. 
 
FUNCPRO 
PROGRAMA 
PRINCIPAL 
N1, N2 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 8 de 13 
 
PARÁMETROS 
 
Al trabajar con subprogramas hay un módulo llamante y un módulo llamado 
(invocado). En general el programa principal invoca a un subprograma, pero a 
veces un subprograma puede llamar, a su vez, a otro subprograma. 
 
Parámetros o argumentos: es la información que se transmite entre módulos. 
 
Los parámetros son los identificadores puestos entre paréntesis en la invocación 
al subprograma y representan la forma en que se comunican el programa 
principal (o módulo llamante) y los subprogramas llamados. 
 
Existen dos tipos de clasificaciones de los parámetros: 
 
1. Según el lugar en que aparecen en el programa 
a. Parámetro Actual o Real 
b. Parámetro Formal 
 
2. Según vuelva modificado o no al módulo invocante 
a. Parámetro Por Valor 
b. Parámetro Variable o Por Referencia 
 
1. a. Parámetro Actual o Real 
 
Los parámetros Actuales o Reales son los que aparecen en la invocación al 
subprograma. 
 
En la codificación en Pascal estos parámetros NO se declaran. 
 
1. b. Parámetro Formal 
 
Los parámetros Formales son los que aparecen en el encabezamiento del 
subprograma. 
 
En la codificación en Pascal estos parámetros SI se declaran. 
 
Los parámetros actuales y formales deben coincidir en cantidad y en tipo, pero no 
necesariamente deben tener el mismo identificador (nombre). Se emparejan entre 
sí por la posición que ocupan en la lista de parámetros. 
 
Ejemplo: 
 
PROGRAMA PRINCIPAL 
… 
PROMEDIO (N1, N2, PROM) 
... 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 9 de 13 
 
PROMEDIO (X, Y, Z) 
... 
... 
 
En este caso, N1 en el principal equivale a X en el procedimiento, N2 en el 
principal equivale a Y en el procedimiento y PROM en el principal equivale a Z en 
el procedimiento. 
 
 
2. Según vuelva modificado o no, al módulo invocante 
 
El procedimiento puede recibir datos para trabajar (Parámetros de Entrada) y 
puede devolver resultados al módulo invocante (Parámetros de Salida). Un 
parámetro de Entrada puede ser modificado en el procedimiento y volver 
modificado al módulo invocante (Parámetro de Entrada/Salida). 
 
 Entrada 
 Parámetros Entrada / Salida 
 Salida 
 
 
 
2. a. Parámetro Por Valor 
 
Cuando se transmite un parámetro a un subprograma y éste no vuelve modificado 
al módulo llamante, se llama parámetro Por Valor. 
 
El parámetro puede ser modificado o no en el subprograma, pero lo importante es 
que no vuelve modificado. ¿Cómo se logra esto? Al transmitir un parámetro por 
valor, en realidad se hace una copia, es decir, se crea un nuevo espacio de 
memoria que es una copia del parámetro actual y el subprograma trabaja con esa 
nueva posición de memoria. Cuando se devuelve el control al módulo llamante, 
esa copia no se usa más, ese espacio queda nuevamente disponible, y se sigue 
trabajando con el original. Si en el subprograma se modificó la copia, no se ve 
materializada esa modificación en la variable original (parámetro actual). 
 
Estos parámetros son los parámetros de Entrada. 
 
2. b. Parámetro Variable o Por Referencia 
 
Cuando un subprograma devuelve uno o varios resultados al módulo llamante lo 
hace a través de los parámetros Variables o Por Referencia. Es decir, cuando 
un parámetro vuelve modificado al módulo llamante es un parámetro Variable. 
 
En realidad lo que se transmite, al utilizar un parámetro variable, es la dirección 
de memoria de la variable. Entonces, cuando en el subprograma se utiliza esa 
variable, se dirige a esa posición de memoria y se trabaja y modifica ese lugar de 
la memoria. Al devolver el control al módulo llamante se sigue trabajando con esa 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 10 de 13 
misma dirección de memoria, por lo cual, si hubo alguna modificación en el 
subprograma se la materializa en el módulo llamante. 
 
Estos parámetros son los de Entrada/Salida o de Salida. El parámetro de 
Entrada/Salida se envía con un valor al módulo llamado y se devuelve modificado. 
El parámetro de Salida se crea directamente en el módulo llamado. 
 
Para diferenciar a un parámetro de otro, en la codificación en Pascal se usa la 
palabra reservada var. Si el parámetro es Variable se antepone var al parámetro 
en el encabezamiento del subprograma. Si el parámetro es Por Valor no lleva 
ninguna palabra adelante en la declaración del subprograma. 
 
 
VARIABLES LOCALES Y GLOBALES 
 
 
Cuando un subprograma necesita una variable para trabajar y sólo interesa que 
se conozca dentro de él, será una variable Local. Las variables locales no son 
necesarias en otros módulos, se las declara en el módulo en el que se la utiliza, 
en la sección Var. En el módulo llamante, o en cualquier otro módulo, no existen, 
no se las conoce. 
 
La variable Local sólo tiene validez en el módulo en el que se la declara. Cuando 
se transmite el control al módulo llamante, las celdas destinadas a estas variables 
locales quedan nuevamente disponibles. 
 
Cualquier variable declarada en el programa principal es conocida por él y por 
cualquier subprograma al que llame, a esta variable se la llama variable Global. 
Lo mismo ocurre con un subprogama que llame a otro, si en el llamante se 
declara una variable, será local para él y global para cualquier módulo por él 
llamado. Este es un concepto relativo, una variable es local para un módulo y 
global para cualquier módulo por él llamado. 
 
Cuando una variable es declarada en un módulo es conocida por cualquier 
módulo llamado por él, a menos que dicho módulo llamado declare una variable 
con el mismo nombre. Esto se llama precedencia de nombre, la declaración de 
una variable local en un módulo, hace que se desconozca a la variable global con 
el mismo nombre. En realidad, son distintos espacios de memoria llamados con el 
mismo nombre pero desde distintos módulos. 
 
Reglas de ámbito: cualquier variable o constante definida en un bloque, se 
conoce en cualquier módulo que esté dentro de él. 
 
¿Por qué se usa lista de parámetros? 
 
Si bien se podría trabajar con todas variables globales, es una buena práctica que 
la comunicación entre los módulos sea explícita. Esto limita la posibilidad de que 
un módulo interfiera con otro. En otras palabras, se le da a cada módulo sólo lo 
que necesita conocer, creándose módulos estancos. Esto evita errores y otorga 
claridad al programa. 
 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 11 de 13 
 
 
CODIFICACIÓN DEL PROGRAMA 
 
Al referirnos a las sentencias de un programa en Pascal hablamos de: 
 
 Orden Físico: Orden en que aparecen las sentencias en el programa 
 Orden Lógico: Orden en que se ejecutan las sentencias 
 
Si recordamos lo visto en la Unidad 3, las partes de un programa son: 
 
Cabecera 
Sección de Declaraciones y Definiciones (D. y D.) 
Sentencias 
 
Vemos que, en el programa, el orden físico es distinto al orden lógico,ya que los 
subprogramas (Procedimientos y Funciones) se insertan en la Sección de 
Declaraciones y Definiciones y se escriben antes que la Sección Ejecutable 
propiamente dicha (Sección de Sentencias) o programa principal. 
 
Cuando se ejecuta el programa, lo que se ejecuta primero es el programa 
principal y desde allí se transfiere el control a los subprogramas invocados. Al 
detectarse el nombre de un subprograma se transmite el control a la primera 
sentencia del primer par Begin-End del cuerpo del subprograma. Cuando se 
termina de ejecutar el subprograma se vuelve a transmitir el control al módulo que 
lo invocó. 
 
A continuación se codifica en Pascal los algoritmos solución del ejercicio: 
 
a) CON PROCEDIMIENTO 
 
Program PROGRAMA (Input, Output); 
 
(*Comienza Sección de Declaraciones y Definiciones *) 
 
Var N1, N2, PROM: Real; 
 
Procedure PROMEDIO (N1, N2: Real; var PROM: Real); 
Var ACUM: Real: 
Begin 
 ACUM:= N1 + N2; 
 PROM:= ACUM / 2 
End; 
 
Begin (* Comienza Sentencias *) 
 Read (N1, N2); 
 PROMEDIO (N1, N2, PROM); 
 Write (‘El promedio es ‘, PROM) 
End. 
 
 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 12 de 13 
 
 
b) CON FUNCIÓN 
 
 
Program PROGRAMA (Input, Output); 
 
(*Comienza Sección de Declaraciones y Definiciones *) 
 
Var N1, N2, PROME: Real; 
 
Function FUNCPRO (N1, N2: Real): Real; 
Var ACUM: Real: 
Begin 
 ACUM:= N1 + N2; 
 FUNCPRO:= ACUM / 2 
End; 
 
Begin (* Comienza Sentencias *) 
 
 Read (N1, N2); 
 PROME:= FUNCPRO (N1, N2); 
 Write (‘El promedio es ‘, PROME) 
End. 
 
 
Observemos que los parámetros formales se declaran. La función también se 
debe declarar, ya que es una expresión, se debe indicar de qué tipo es. 
 
 
EJEMPLO DE USO: PARÁMETRO POR VALOR Y PARÁMETRO VARIABLE 
 
PROG. PRINCIPAL SUBP (X) 
X  10 X  20 
SUBP (X) Mostrar (X) 
Mostrar (X) 
 
Si el parámetro X se transmite como Por Valor se muestra lo siguiente: 
20 
10 
 
Si el parámetro X se transmite como Variable se muestra lo siguiente: 
20 
20 
 
 
Algoritmos y Estructuras de Datos 
Unidad 7 
Ing. Rosanna M. MAINIERI – Página 13 de 13 
 
 
BIBLIOGRAFÍA 
 
 
 
DALE Nell, WEEMS Chip, (1989), PASCAL, Ed. Mc. Graw Hill, España 
 
DE GIUSTI Armando, (2001), Algoritmos, Datos y programas, Ed. Prentice Hall, 
Fac. de Informática, Univ. Nac. La Plata, Argentina. 
 
JENSEN Kathleen, WIRTH Niklaus, (1987), PASCAL Manual del usuario e 
informe, Ed. El Ateneo, Argentina. 
 
JOYANES AGUILAR Luis, (1996), Fundamentos de Programación, Ed. Mc Graw-
Hill, España.

Continuar navegando

Materiales relacionados