Programación Modular en Informática
Programación Modular en Informática
UNIDAD 2:
PROGRAMACIÓN
MODULAR
CONTENIDOS
El licenciante no puede revocar estas libertades en tanto usted siga los términos de la licencia.
• Atribución — Usted debe dar crédito de manera adecuada, brindar un enlace a la licencia, e
indicar si se han realizado cambios. Puede hacerlo en cualquier forma razonable, pero no de
forma tal que sugiera que usted o su uso tienen el apoyo de la licenciante.
• NoComercial — Usted no puede hacer uso del material con propósitos comerciales.
• SinDerivadas — Si remezcla, transforma o crea a partir del material, no podrá distribuir el
material modificado.
No hay restricciones adicionales — No puede aplicar términos legales ni medidas tecnológicas que
restrinjan legalmente a otras a hacer cualquier uso permitido por la licencia.
1
PROGRAMACIÓN MODULAR
ÍNDICE DE CONTENIDOS
1. DISEÑO DESCENDENTE ...............................................................................................................3
4. SUBPROGRAMAS .........................................................................................................................8
4.1. FUNCIONES ..........................................................................................................................8
4.2. PROCEDIMIENTOS...............................................................................................................9
6. RECURSIVIDAD ...........................................................................................................................12
6.1. RECURSIVIDAD SIMPLE Y MÚLTIPLE...............................................................................12
6.2. RECURSIVIDAD DIRECTA E INDIRECTA ..........................................................................13
7. BIBLIOTECAS ..............................................................................................................................14
7.1. CARACTERÍSTICAS DE UNA BIBLIOTECA........................................................................14
7.2. TIPOS DE BIBLIOTECAS ....................................................................................................15
8. CASOS PRÁCTICOS....................................................................................................................17
8.1. FUNCIÓN: MEDIA DE TRES NÚMEROS ............................................................................17
8.2. PROCEDIMIENTO: DIBUJAR CUADRADO .........................................................................18
8.3. ÁMBITO DE VARIABLES .....................................................................................................19
8.4. FUNCIONES MEDIA DE TRES NÚMEROS Y LEER DATOS ..............................................20
2
PROGRAMACIÓN MODULAR
1. DISEÑO DESCENDENTE
El diseño descendente (también denominado top-down) consiste en dividir un problema dado en
diversos subproblemas más pequeños que se pueden resolver por separado y después recomponer los
resultados para generar la solución al problema planteado. A su vez, si es necesario, cada subproblema
se puede descomponer en otros problemas aún más pequeños para ser resueltos.
Cada subproblema se llama módulo, tiene una misión específica y detallada dentro del problema dado
y se puede resolver de forma independiente. Cualquier programa no trivial normalmente se descompone
en módulos, creando entre sí una estructura modular jerárquica o en árbol que permite resolver el
problema dado.
3
PROGRAMACIÓN MODULAR
2. TIPOS DE MÓDULOS
Según la función de un módulo dentro del programa, el módulo se puede clasificar en:
• Módulo Principal. Tiene como objetivo dar una solución al problema planteado y siempre está
presente dentro del programa. También se llama programa principal, ya que el flujo de ejecución
del programa comienza y finaliza en este módulo. Si el problema es complejo, será recomendable
descomponer el módulo principal en varios módulos secundarios.
• Módulo Secundario. Tiene como objetivo dar una solución a una parte o componente del
problema planteado (módulo principal) o de otra parte (módulo secundario). Dependiendo de la
complejidad del problema, puede haber cero, pocos o muchos módulos secundarios dentro del
programa.
Según el posible retorno de un valor por un módulo, el módulo se puede clasificar en:
• Función. Retorna un valor cuando devuelve el control del flujo de ejecución al módulo que lo ha
invocado. El valor devuelto al módulo llamador se debe recoger en una expresión. Por ejemplo:
resultado = calcularMediaDeTres(5.83, 4.72, 6.91);
• Procedimiento. No hace un retorno explícito de un valor al finalizar la ejecución del módulo. Por
ejemplo:
dibujarRectanguloDeAsteriscos(5, 14);
Según el momento en que un módulo ha sido desarrollado, el módulo se puede clasificar en:
• Módulo de Biblioteca. Ha sido desarrollado con anterioridad al momento de realizar un
programa, está contenido en un fichero fuente o compilado de una biblioteca y se puede utilizar en
cualquier parte del programa.
• Módulo de Programa. Se desarrolla explícitamente como una parte o componente del programa
como consecuencia de aplicar el diseño descendente al programa.
Según la situación de un módulo con respecto al módulo que lo invoca, el módulo se puede
clasificar en:
• Módulo Interno. Está incluido en el mismo fichero fuente o compilado donde se encuentra el
módulo que lo llama.
• Módulo Externo. Está incluido en un fichero fuente o compilado distinto del fichero donde se
encuentra el módulo que lo llama.
4
PROGRAMACIÓN MODULAR
Debe existir una correspondencia entre los parámetros actuales y los parámetros formales en número,
orden y tipos de datos:
• El número de parámetros actuales debe coincidir con el número de parámetros formales.
• Para cada pareja compuesta por un parámetro actual y un parámetro formal que ocupan la misma
posición dentro de sus listas respectivas de parámetros, el tipo de datos del parámetro actual
debe ser igual o compatible con el tipo de datos del parámetro formal.
Según el papel de un parámetro dentro del módulo, el parámetro se puede clasificar en:
• Parámetro de Entrada. Indica un valor o referencia de un dato que el módulo necesita para iniciar
su ejecución. Se utiliza para suministrar un dato de entrada desde el módulo llamador al módulo
llamado.
5
PROGRAMACIÓN MODULAR
• Parámetro de Salida. Indica un valor o referencia de un dato que el módulo genera y devuelve
como resultado. Se utiliza para devolver un dato de salida desde el módulo llamado al módulo
llamador.
• Parámetro de Entrada/Salida. Indica un valor o referencia de un dato que el módulo necesita
para iniciar su ejecución y posteriormente modifica y devuelve como resultado. Se utiliza para
suministrar un dato de entrada desde el módulo llamador al módulo llamado y después devolver
un dato de salida desde el módulo llamado al módulo llamador.
6
PROGRAMACIÓN MODULAR
Java utiliza el paso de parámetros por valor, de forma independiente de los tipos de datos de las
variables a comunicar entre dos módulos. Cuando un módulo llama a otro módulo:
1) Se copian los valores de los parámetros actuales del módulo llamador en una zona de memoria
(pila) dedicada para el programa.
2) Dentro del módulo llamado, los valores copiados en la pila representan los parámetros formales y
se interpretan según la complejidad de cada tipo de datos:
• Si el tipo de datos de un parámetro formal es un tipo primitivo (boolean, byte, short,
int, long, float o double), el módulo invocado recibe una copia del parámetro actual del
módulo llamador.
Por tanto, el módulo invocado no tiene acceso a dicho parámetro actual y no puede
modificarlo.
• Si el tipo de datos de un parámetro formal no es un tipo primitivo, se trata de un tipo
estructurado que se gestiona en memoria mediante referencias. El módulo invocado recibe
una copia del parámetro actual del módulo llamador, siendo esta copia en realidad una
referencia o dirección de memoria.
De esta manera, el módulo llamador comparte los datos de memoria referenciados por dicho
parámetro actual con el módulo llamado y hay dos referencias que apuntan a los mismos
datos en memoria: la del parámetro actual y la del parámetro formal. En este caso, el
módulo invocado sí puede acceder a los datos de memoria referenciados y modificarlos.
7
PROGRAMACIÓN MODULAR
4. SUBPROGRAMAS
Cuando un módulo necesita utilizar otro módulo para resolver un problema, debe realizar una llamada o
invocación a dicho módulo. Una llamada o invocación a un módulo se divide en tres pasos:
• El módulo llamador comunica información al módulo llamado a través de una lista de parámetros
(definida en su cabecera). El flujo de ejecución del programa se transfiere desde la instrucción de
llamada del módulo llamador al inicio del módulo llamado.
• Se ejecutan las instrucciones correspondientes a la implementación del módulo llamado.
• Cuando finaliza la ejecución del módulo llamado, el módulo llamado devuelve resultados al
módulo llamador. El flujo de ejecución del programa se transfiere desde el final del módulo
llamado a la instrucción siguiente a la de llamada del módulo llamador.
4.1. FUNCIONES
Una función es un subprograma que recibe cero, uno o varios parámetros de entrada y produce un
valor de salida o resultado (a veces, indicado como parámetro de salida) a partir de dichos parámetros.
La cabecera, declaración o definición de una función contiene los siguientes elementos:
• Un nombre o identificador válido asociado con la función.
• Una lista de parámetros formales, en la que cada parámetro formal será una variable únicamente
visible dentro de la función, sólo de entrada y definida mediante un identificador y un tipo de datos.
• El tipo de datos correspondiente al valor de retorno de la función.
El cuerpo de una función está compuesto por las instrucciones y sentencias de control que son
ejecutables en un ordenador para resolver el subproblema indicado. Estas instrucciones deben contener
al menos una instrucción devolver entre ellas (normalmente, se usa al final del cuerpo). La instrucción
devolver finaliza la ejecución de la función y devuelve un valor resultado al módulo que llama a la
función.
La declaración y utilización de una función en Java se muestra en el siguiente ejemplo:
public static
double calcularMediaDeTres(double num1, double num2, double num3) {
FUNCIÓN double media = (num1 + num2 + num3) / 3.0;
return media;
}
public static void main(String[] args) {
Scanner teclado = new Scanner([Link]);
double numA, numB, numC, resultado;
[Link]("Introduce el número A: ");
numA = [Link]();
PROGRAMA [Link]("Introduce el número B: ");
PRINCIPAL numB = [Link]();
[Link]("Introduce el número C: ");
numC = [Link]();
resultado = calcularMediaDeTres(numA, numB, numC);
[Link]("Media de Tres = " + resultado);
}
8
PROGRAMACIÓN MODULAR
4.2. PROCEDIMIENTOS
Un procedimiento es un subprograma que recibe cero, uno o varios parámetros de entrada/salida y
realiza efectos laterales sobre el programa (modificación de variables compartidas por varios módulos o
impresión de textos en consola) a partir de dichos parámetros.
La cabecera, declaración o definición de un procedimiento contiene los siguientes elementos:
• Un nombre o identificador válido asociado con el procedimiento.
• Una lista de parámetros formales, en la que cada parámetro formal será una variable compartida
por el módulo que lo llama y el procedimiento, de entrada/salida y definida mediante un
identificador y un tipo de datos.
El cuerpo de un procedimiento está compuesto por las instrucciones y sentencias de control que son
ejecutables en un ordenador para resolver el subproblema indicado.
La declaración y utilización de un procedimiento en Java se muestra en el siguiente ejemplo:
public static
void dibujarRectanguloDeAsteriscos(int altura, int anchura) {
int i, j;
for (i = 1 ; i <= altura ; i++) {
for (j = 1 ; j <= anchura ; j++) {
PROCEDIMIENTO
[Link]('*');
}
[Link]();
}
}
public static void main(String[] args) {
Scanner teclado = new Scanner([Link]);
int alto, ancho;
[Link]("Introduce el alto: ");
PROGRAMA alto = [Link]();
PRINCIPAL [Link]("Introduce el ancho: ");
ancho = [Link]();
[Link]("Rectángulo de Asteriscos");
dibujarRectanguloDeAsteriscos(alto, ancho);
}
9
PROGRAMACIÓN MODULAR
5. ÁMBITO DE IDENTIFICADORES
En un programa que contiene funciones y/o procedimientos, existen varios puntos en los que se pueden
declarar identificadores: en la parte de declaraciones del programa principal, en los parámetros formales
de cada función y/o procedimiento, y en la parte de declaraciones de cada función y/o procedimiento.
Se denomina ámbito de un identificador a la parte, porción o bloque de código fuente en la que dicho
identificador es visible y se puede utilizar. Como regla general, el ámbito de un identificador corresponde
al programa principal o subprograma en el que dicho identificador se declara o define.
Los identificadores utilizados en programas principales y subprogramas se clasifican en dos tipos:
identificadores locales e identificadores globales.
10
PROGRAMACIÓN MODULAR
11
PROGRAMACIÓN MODULAR
6. RECURSIVIDAD
Se habla de recursividad cuando un subprograma (función o procedimiento) se llama o se invoca a sí
mismo. La recursividad tiene exactamente la misma potencia expresiva que la iteración, en el sentido de
que permite describir los mismos algoritmos o procesos iterativos de forma recursiva. Su uso genera
programas recursivos más compactos que sus correspondientes versiones iterativas.
Los subprogramas recursivos son especialmente apropiados si el problema, el cálculo a realizar o la
estructura del problema aceptan una definición recursiva: el problema tiene casos triviales o sencillos
y define casos complejos mediante recursividad. Sin embargo, la existencia de tales definiciones no
garantiza que la mejor forma de resolver un problema sea realizar un subprograma recursivo.
Cuando se desarrolla un subprograma recursivo, se debe asegurar de que el número de llamadas sea
finito y pequeño. De esta forma, la recursión siempre finaliza (no hay recursión infinita) y la memoria
dedicada al programa (pila) tiene suficiente espacio para almacenar, en cada invocación, los parámetros
formales, las variables locales y el estado del proceso en curso para recuperarlo después.
La recursividad requiere dos condiciones para su correcto funcionamiento:
• Debe existir al menos una condición o criterio (denominado caso base o trivial) que no requiera
una invocación recursiva y que permita finalizar la cadena de llamadas o recursividad generada.
• Las sucesivas invocaciones deben ser efectuadas con versiones cada vez reducidas del problema
inicial, de forma que se encuentren más cerca de un caso base o trivial.
Cuando un subprograma genera en tiempo de ejecución dos o más invocaciones recursivas, dicho
subprograma tiene una recursividad múltiple o no lineal.
El siguiente ejemplo muestra una recursividad múltiple o no lineal en Java:
12
PROGRAMACIÓN MODULAR
FUNCIÓN FIBONACCI
public static int fibonacci(int numero) {
if (numero == 0 || numero == 1) {
return numero;
}
else {
return fibonacci(numero - 1) + fibonacci(numero - 2);
}
}
13
PROGRAMACIÓN MODULAR
7. BIBLIOTECAS
Una biblioteca (o librería) es un conjunto probado, documentado y, a veces previamente compilado, de
funciones y procedimientos que se pueden invocar desde otro programa.
Una biblioteca básica debe proporcionar una colección de constantes, estructuras de datos, funciones y
procedimientos independientes del tipo de aplicación donde se vaya a utilizar. Esta colección debe ser
suficiente para cubrir las necesidades de la mayoría de las aplicaciones en los lenguajes que permitan
su uso.
14
PROGRAMACIÓN MODULAR
El inconveniente es que se genera un programa ejecutable de gran tamaño, lo que puede suponer
una ocupación excesiva de la memoria RAM del ordenador, pudiéndose llegar incluso al
desbordamiento de la memoria. Este sistema se utiliza en programas que no han de compartir
recursos con otras aplicaciones.
• Biblioteca de Enlace Dinámico. Es un fichero con código ejecutable que mantiene su
independencia física del programa principal.
Cuando se usa una biblioteca de enlace dinámico en un programa, es necesaria su presencia
para que el programa funcione adecuadamente.
La utilidad principal es evitar programas ejecutables de tamaño excesivo, lo que podría provocar
un desbordamiento de la memoria del ordenador. Cuando un programa realiza una llamada a un
módulo de la biblioteca, solo se carga en memoria el código del módulo llamado y se libera el
espacio ocupado por éste cuando se retorna al programa que lo llamó. Este sistema también es
ventajoso cuando muchas aplicaciones utilizan de forma común un amplio grupo de módulos: el
código de un módulo dado sólo aparece una vez en el soporte físico. El inconveniente principal es
la pérdida de velocidad en la ejecución.
Un ejemplo de este tipo es el archivo DLL (Dynamic Link Library) de los sistemas operativos de
Windows, aunque en la actualidad la mayoría de los sistemas operativos poseen bibliotecas de
enlace dinámico.
16
PROGRAMACIÓN MODULAR
8. CASOS PRÁCTICOS
8.1. FUNCIÓN: MEDIA DE TRES NÚMEROS
El siguiente ejemplo muestra la creación y uso de una función. La función calcularMedia recibe como
parámetros de entrada tres números reales y devuelve como parámetro de salida la media de los
mismos.
En el programa principal, se solicita al usuario que introduzca tres números y se llama a la función
calcularMedia pasándole estos datos. El dato devuelto por la función es asignado a la variable media.
Finalmente, se muestra el resultado por pantalla.
17
PROGRAMACIÓN MODULAR
En el programa principal, se solicita al usuario que escriba el lado del cuadrado y se llama al
procedimiento dibujarCuadrado pasándole este dato.
18
PROGRAMACIÓN MODULAR
En primer lugar, destacar que se ha creado una variable global, que está fuera del bloque principal y
fuera del procedimiento modificarDatos. Esta variable será visible y modificable desde todos los
bloques.
Como puede observarse en la ejecución del ejemplo, las variables locales no han cambiado su valor.
Esto se debe a que las variables son visibles a nivel de bloque y lo que se pasa al subprograma es una
copia de las mismas. Los subprogramas tienen sus propias variables locales, que son independientes
de las variables locales de otros bloques, aunque tengan el mismo nombre.
19
PROGRAMACIÓN MODULAR
En el programa principal, se llama a la función leerDouble tres veces y los datos que devuelve se
asignan a tres variables. A continuación, se llama a la función calcularMedia pasándole estos datos. El
dato devuelto por la función es asignado a la variable media. Finalmente, se muestra el resultado por
pantalla.
20