Está en la página 1de 37

ALGORÍTMICA I

Unidad 3.- Subrutinas


Profesor: Lic. Julio Galeano
OBJETIVO
 El objetivo de este capítulo es conocer y aprender a utilizar las subrutinas como
un recurso para ayudar a lograr una adecuada estructura modular del
programa fuente. Su utilidad como recurso se hace evidente cuando permite a
quien lo utilice escribir un determinado algoritmo una sola vez y utilizarlo todas
las veces que sea necesario, empleando en cada ocasión diferentes
parámetros. Permite además, una significativa reducción del tiempo de
programación, facilita la detección de errores y hacen que los programas sean
fáciles de interpretar.
CONTENIDO

 Filosofía de la programación modular

 Propósito, sintaxis y funcionamiento

 Funciones y procedimientos

 Ámbito de variables (Local y Global)

 Paso de parámetros (por valor y referencia)


FILOSOFÍA DE LA PROGRAMACIÓN MODULAR

Una buena forma de resolver problemas


complicados es dividirlos en problemas más
pequeños y resolver cada uno de ellos
individualmente.
FILOSOFÍA DE LA PROGRAMACIÓN MODULAR (CONT.)
 La descomposición de un problema es un factor determinante para la reducción de
su complejidad.

 Si tomamos la complejidad como sinónimo de variedad, tenemos una cantidad de


situaciones diferentes que un problema puede presentar.

 Cuando se descompone un problema en problemas más pequeños, estamos


invariablemente dividiendo también la complejidad y, en consecuencia,
simplificando su solución.

 Otra ventaja de la descomposición es que permite enfocar la atención en un


problema pequeño cada vez, lo que permitirá una mejor comprensión del todo.
CRITERIOS PARA ORIENTAR EL PROCESO DE DESCOMPOSICIÓN

 Dividir el problema en sus partes principales.

 Analizar la división obtenida para garantizar la coherencia.

 Si alguna parte todavía se muestra compleja, se procede a descomponerla


también.

 Analizar el resultado para garantizar la comprensión y coherencia.

El proceso de descomposición continua se conoce como técnica de refinamientos


sucesivos, porque se parte de un problema complejo y abstracto, que es
sucesivamente dividido hasta resultar en problemas más simples y específicos.
TÉCNICA DE REFINAMIENTOS SUCESIVOS
 Llamada también divide y vencerás o análisis descendente (Top-Down).

 Al aplicar esta técnica a un problema complejo, este se divide en varios subproblemas más
simples, y estos a su vez en otros subproblemas más simple aún.

 La técnica debe ser aplicada hasta obtener subproblemas lo suficientemente simples como
para poder ser resueltos fácilmente con algún lenguaje de programación.

 Los subproblemas toman el nombre de módulos, que son cada una de las partes de un
programa que resuelve uno de los subproblemas en que se divide el problema complejo
original.

 Cada uno de los módulos tiene una tarea bien definida y algunos necesitan de otros para
poder operar, en este caso se establece una comunicación mediante una interfaz de
comunicación que para funcionar correctamente debe estar bien definida.
MÓDULOS
 Después de descomponer un problema complejo en subproblemas, se puede
construir un subalgoritmo o módulo por cada subproblema.

 Para modularizar el algoritmo es necesario de una sintaxis para expresar esa nueva
estructura formada por módulos, es necesario uniformizar

determinados conjuntos de acciones afines, que

obedecen a la misma estructuración de un algoritmo.


Identificador: nombre
por el cual el módulo es
referenciado.
SUBRUTINAS
 Un módulo puede entenderse como una parte de un programa en cualquiera de sus
formas y variados contextos.

 El tipo de módulo a utilizar en esta materia recibe el nombre de subrutina o


subprograma (también llamada procedimiento, función, rutina o método).

 No necesariamente ni estrictamente un módulo es una subrutina, ya que el módulo


puede contener muchas de ellas.

 Una subrutina es un segmento de código de algoritmo que forma parte de un


algoritmo principal, el cual permite resolver una tarea específica y que puede ser
invocado en cualquier momento desde esta, la misma u otra subrutina.
SUBRUTINAS (CONT.)
 Las subrutinas (funciones o procedimientos) son abstracciones que se usan en los
lenguajes de alto nivel para simplificar el código y poder reusarlo.
PROPÓSITO, SINTAXIS Y FUNCIONAMIENTO
 Las subrutinas son un grupo de instrucciones (bloques de código) escritas por
separado del programa principal para realizar una función que puede ser usada
repetidamente por el programa principal.

 Las subrutinas facilitan la estructuración del programa.

 Los programas de alto nivel hacen uso de los bloques de código a los que se les
pasan unas variables (parámetros) con las que se ejecuta una operación y
calcula sus resultados (funciones, procedimientos o métodos).

 Una subrutina se implementa asociada con dos instrucciones: Llamado a la


subrutina y Retorno de la subrutina.
PROPÓSITO, SINTAXIS Y FUNCIONAMIENTO (CONT.)
 Las subrutinas son bloques de código que se invocan desde un programa para
ejecutar una tarea, completada la misma regresan el control al lugar de donde
fueron llamadas.

 Las subrutinas pueden ser invocadas en cualquier momento desde un programa, la


misma u otra subrutina. Al ser llamada dentro de un programa, la subrutina hace que
el código principal se detenga y se dirija a ejecutar el código de la subrutina.

 Las subrutinas se invocan durante la ejecución del programa, mediante una


instrucción de llamada. La repetición de llamadas no aumenta el tamaño del
programa en cuanto a la cantidad de memoria que ocupa, si aumenta el tiempo de
ejecución del programa por el mayor número de instrucciones que se ejecutan.
ELEMENTOS DE DECLARACIÓN DE UNA SUBRUTINA

 Un nombre único en el ámbito: nombre de la función con el que se identifica y se


distingue de otras. No podrá haber otra función ni procedimiento con ese nombre.

 Un tipo de dato de retorno: tipo de dato del valor que la subrutina devolverá al
terminar su ejecución.

 Una lista de parámetros: especificación del conjunto de argumentos (pueden ser


cero, uno o más) que la función debe recibir para realizar su tarea.

 El código u órdenes de procesamiento: conjunto de órdenes y sentencias que debe


ejecutar la subrutina.
ELEMENTOS DE DECLARACIÓN DE UNA SUBRUTINA (CONT.)

La ejecución de una subrutina requiere la participación de tres elementos: la


instrucción de llamada, la instrucción de retorno y la pila.

 La pila: su objetivo principal es almacenar la dirección de retorno del programa


desde donde se llamó a la subrutina.

 La función de la instrucción de llamada y de retorno es guardar y extraer de la pila


la dirección de salida y retorno, según sea el caso
UTILIZACIÓN DE LA SUBRUTINA

Para utilizar una subrutina en el programa es preciso realizar tres tareas:

 Crear la subrutina.

 Definir los parámetros (en caso necesario) en la tabla de variables locales de la


subrutina.

 Llamar a la subrutina desde la el programa principal o desde una subrutina


diferentes.
TIPOS DE SUBRUTINAS
 Llamadas simples: una vez ejecutada la Llamadas Simples

subrutina, el control vuelve a la operación


que sigue a la llamada de la subrutina.

 Anidadas: se pueden anidar, hacer


llamadas a subrutinas una dentro de otra.

 Llamados múltiples: se pueden realizar


Anidadas
llamadas a subrutinas desde varios puntos
del programa, con diferentes tipos de
parámetros. Llamados múltiples
LA OPERACIÓN DE LLAMAR A UNA SUBRUTINA
 Desde el programa principal se llama a la subrutina utilizando la
Instrucción de llamada.

 La Instrucción de Llamada transfiere el control a la subrutina. Esta


operación se puede realizar con o sin la utilización de
parámetros.

 Una vez ejecutada la subrutina y utilizando la instrucción de


retorno, el control vuelve a la operación que sigue a la
Instrucción de llamada en el programa principal

 Los lenguajes de programación tienen definida la cantidad


máxima de parámetros que se pueden hacer en cada
instrucción de llamada, si se intenta exceder ese número se
generará un error.
VENTAJAS DE USAR SUBRUTINAS
 Evitan la repetición y favorecen la reutilización de código, puesto que una subrutina
puede ser invocada varias veces desde el mismo programa.

 Facilitan la lectura y comprensión de código fuente al ocultar los detalles menos


importantes, siempre y cuando los nombres de las subrutinas sean informativos de su
función.

 Ayudan a corregir errores, puesto que un error en una subrutina sólo se corrige una
vez aunque esa subrutina sea llamada en diferentes puntos del programa principal.

 La CPU del equipo funciona mas eficientemente, llamando al bloque solo cuando lo
necesita, en vez de ejecutar todos los bloques en cada ciclo de ejecución
VENTAJAS DE USAR SUBRUTINAS (CONT.)

 Pueden ayudarnos a optimizar un programa, puesto que podemos dividir un


algoritmo complejo en sucesivas llamadas a subrutinas, y de esta forma estimar el
coste de cada una de ellas.

 Una ventaja adiciona al trabajar con subrutinas es que se pueden construir y utilizar
bibliotecas de subrutinas. Una biblioteca es un archivo que contiene una colección
de programas (subrutinas) sobre un tema. Durante el proceso de ensamblaje del
programa, el programa enlazador toma de la biblioteca solamente las rutinas que
son solicitadas y las incorpora al programa objeto.
FUNCIONES Y PROCEDIMIENTOS

Existen dos tipos de bloques de código: el procedimiento y la función.

 La diferencia principal entre una función y un procedimiento es que las funciones


regresan un valor como resultado de su ejecución mientras que los procedimientos no
lo hacen.
 Ambos se componen de un cuerpo, con las instrucciones que se ejecutarán, y de una
cabecera, donde se especifica su nombre, sus parámetros y su tipo de retorno (si se
trata de una función).
FUNCIONES Y PROCEDIMIENTOS (CONT.)

 Su propósito principal es encapsular secciones de código que se puede utilizar múltiples


veces, reduciendo el tamaño de los programas, mejorando su legibilidad y facilitando
su mantenimiento.
 A la cabecera de las subrutinas así como a su cuerpo se les llama «declaración»
mientras que la instrucción en el programa principal usada para iniciar su ejecución
recibe el nombre de «invocación».
DECLARACIÓN
 La declaración de una función generalmente tiene la siguiente estructura:
[Tipo de datos del resultado] subrutina [nombre de la función] ( [Lista de parámetros] )
[Instrucciones a ejecutar como parte del cuerpo de la función)
regresar [Dato a regresar como resultado]
fin_subrutina
Tipo de datos del resultado: entero, real, carácter, etc.
subrutina: cualquier nombre válido según las reglas del lenguaje utilizado.
regresar: sirve para especificar el dato que se debe regresar como resultado de la
función. El dato regresado debe ser del tipo especificado en el tipo de retorno de la
función o de lo contrario el compilador reportará un error.
DECLARACIÓN (CONT.)

 La estructura de los procedimientos es igual a la estructura de las funciones. En su


declaración simplemente se omiten el tipo de datos del resultado y la instrucción
regresar al final del cuerpo de la subrutina.

subrutina [nombre del procedimiento] ( [Lista de parámetros] )


[Instrucciones a ejecutar como parte del cuerpo de la función)
fin_subrutina
ÁMBITO DE VARIABLES (LOCAL Y GLOBAL)
En el ámbito de la programación:

 Las variables son estructuras de datos que pueden cambiar de contenido a lo largo de la
ejecución de un programa.

 Estas estructuras representan a un área reservada de la memoria principal a la cual se le


puso un nombre y que puede ser utilizado para representar datos en lugar de
introducirlos directamente en un programa.

 El alcance de una variable es la región del código fuente del programa dentro del cual
se representan ciertos datos.

 La mayoría de los lenguajes de programación soportan tanto variables locales como


globales.
ÁMBITO DE VARIABLES (LOCAL Y GLOBAL) )CONT.)
La principal diferencia entre una variable local y una global es su ámbito de acción:
VARIABLES LOCALES

 Las variables locales sólo existen dentro de una función, una sección del código del
programa que realiza una tarea específica, en la que se definen o declaran.

 Dejan de existir una vez que la función es ejecutada.

 Las variables locales se vuelven a crear cada vez que la función es llamada, o
ejecutada.

 Estas variables no son accesibles para otras funciones o para el programa principal
y, como tal, por lo general están implementados utilizando un tipo especial de
estructura de datos, conocido como pila.
PILA

 En muchos lenguajes de programación, la "pila" es un elemento clave en la


implementación de variables locales.

 Antes de ejecutar una función, un programa añade todas las variables locales
declaradas en esa función en la pila, en orden inverso en que han sido declaradas.

 Cuando el programa llama a la función, las variables locales se quitan de la pila en


orden inverso, por lo que la variable más recientemente añadida es la primera en ser
eliminada.
VARIABLES GLOBALES
 Las variables globales son declaradas en el cuerpo principal del código fuente del
programa, fuera de todas las funciones, y por lo tanto existen en cualquier parte del
código, incluso dentro de las funciones.

 Las variables globales no se vuelven a crear cada vez que una función en particular
es llamada.

 Los programas suelen utilizar variables globales para almacenar datos que son
procesados por muchas funciones diferentes.

 Un programa de edición de texto simple, por ejemplo, puede cargar el contenido


del archivo en que se está trabajando en una variable global.
VENTAJAS Y DESVENTAJAS
 Las variables locales hacen que los programas de computadora sean más fáciles de depurar y
mantener.

 Los programadores pueden determinar el punto exacto en el que un programa modifica el valor de
una variable local, mientras que las variables globales pueden ser modificadas en cualquier lugar
dentro del código fuente.

 Las variables locales también producen menos interacciones inesperadas con llamadas a
funciones, o el mundo exterior, conocidas como efectos secundarios, que las variables globales.

 Las variables globales son accesibles en funciones en las que no son utilizadas, en contradicción
con el concepto de programación modular, en el que el código del programa se compone de
bloques o módulos pequeños aislados, por lo que los programadores que favorecen la estructura
modular rara vez las utilizan.
PASO DE PARÁMETROS (POR VALOR Y REFERENCIA)

 El mecanismo mediante el cual el programa invocador y la subrutina intercambian


información, recibe el nombre de paso de parámetros.

 Los parámetros intercambiados entre el programa invocador y la subrutina pueden


ser de tres tipos según la dirección en la que se transmita la información: de
entrada, de salida o de entrada/salida.

 Se denominan parámetros de entrada a los que proporcionan información del


programa invocador a la subrutina. Se denominan parámetros de salida a los que
devuelven información de la subrutina al programa invocador.
PASO DE PARÁMETROS (POR VALOR Y REFERENCIA) (CONT.)

 Los parámetros de entrada/salida proporcionan información del programa


invocador a la subrutina y devuelven información de la subrutina al programa
invocador.

 Para realizar el paso de parámetros es necesario disponer de algún lugar físico


donde se pueda almacenar y leer la información que se quiere transferir.

 Las dos opciones más comunes son: utilizar registros o utilizar la pila. Que se utilicen
registros o la pila depende de la arquitectura en cuestión y del convenio que se
siga para el paso de parámetros en dicha arquitectura.
PASO DE PARÁMETROS POR VALOR
El paso de parámetros por valor implica la siguiente secuencia de acciones:

 Al realizar la llamada a la subrutina, el programa invocador carga el valor de las variables


que queremos pasar en otras dentro del ámbito local de la subrutina, parámetros de
entrada de la subrutina.

 La subrutina, finalizadas las operaciones que deba realizar y antes de devolver el control
al programa invocador, carga el valor resultado en los parámetros de salida de la misma.

 El programa invocador recoge los parámetros de salida de los registros elegidos para ello.

 Se tendrán dos valores duplicados e independientes con lo que la modificación de uno


no afecta al otros
PASO DE PARÁMETROS POR VALOR (CONT.)
PASO DE PARÁMETROS POR REFERENCIA

El paso de parámetros por referencia implica la siguiente secuencia de acciones:

 Al realizar la llamada a la subrutina, el programa invocador pasa como parámetro la


dirección de memoria del dato, se tiene un único valor referenciado desde dos
puntos diferentes, el programa principal y la subrutina a la que se pasa el argumento.

 La subrutina accede a la dirección de la memoria indicada por los parámetros de


entrada y opera sobre ellas modificando su contenido.

 La subrutina, una vez finalizada devuelve el resultado al programa principal.


PASO DE PARÁMETROS POR REFERENCIA (CONT.)
BIBLIOGRAFÍA
Brassard, G., & Bratley, P. (1997). Fundamentos de Algoritmia. Madrid: Prentice Hall.

Braunstein, S. L., & Gioia, A. B. (1987). Introducción a la programación y a las estructuras


de datos. Buenos Aires: Editorial Universitaria.

Joyanes Aguilar, L. (1990). Fundamentos de programación, algoritmos y estructuras de


datos. Madrid: McGraw- Hil.

Liang, Y. D. (2014). Introduction to Programming with C++ Third Edition. Essex - England:
Pearson Education.

Villar Forbellone, A. L., & Eberspacher, H. F. (2005). Lógica de Programacao : A


construcao de algoritmos e estruturas de dados 3a Edicao. Sao Paulo: Prentice Hall.
ALGORÍTMICA I

Unidad 3.- Subrutinas


Profesor: Lic. Julio Galeano

También podría gustarte