Algoritmos y Estructuras de Datos – 2017 Prof. Lic.
María Gabriela Cerra
Apunte teórico –Programación modular.
LA PROGRAMACION MODULAR: USO DE PROCEDIMIENTOS Y FUNCIONES.
Una estrategia para la resolución de problemas complejos con computadoras, es la división o descomposición
del mismo en subproblemas más pequeños. Estos subproblemas se implementan mediante módulos o
subprogramas. Los subprogramas son una herramienta importante para el desarrollo de algoritmos y
programas, ya que un proyecto de programación normalmente se compone de un programa principal, y de un
conjunto de subprogramas, los cuales son llamados o invocados desde el programa principal.
¿Cómo llegar a la programación modular?
Como dijimos, uno de los métodos fundamentales para resolver problemas, es dividirlos en problemas más
pequeños. Estos subproblemas pueden, a su vez, ser divididos repetidamente en problemas aún más
pequeños, hasta que tales problemas más pequeños sean indivisibles y fáciles de resolver. Este tipo de diseño
recibe el nombre de Diseño modular, descendente o top-down. Se basa en la técnica ‘divide y vencerás’
expuesta anteriormente. La resolución en este diseño, comienza con una descomposición modular y luego
nuevas descomposiciones de cada módulo, constituyendo un proceso que se llama refinamientos sucesivos.
Así, el problema principal se resuelve con el programa principal, y los módulos o subproblemas, con los
subprogramas.
Subprogramas.
Un subprograma es una unidad de programa que desarrolla una tarea específica.
Los subprogramas tienen las mismas componentes que un programa principal: una cabecera, una zona de
declaraciones locales, un conjunto de instrucciones ejecutables y un conjunto de comentarios que documentan
su función.
Un subprograma puede realizar las mismas tareas que un programa, la diferencia está en la manera de
ejecutarlo o ponerlo en actividad: deben ser invocados o llamados por otra unidad de programa. Es decir, que
para que un subprograma se ejecute, debe existir una instrucción en el programa llamador que lo invoque
explícitamente al mismo, por lo cual en ese momento el S.O detiene la ejecución del programa llamador, cede
el control al procedimiento invocado, crea todos los datos propios del subprograma en otra zona de la
memoria RAM, y ejecuta secuencialmente cada una de las instrucciones del mismo, y recién cuando éste
termine de ejecutarse, le devolverá el control al programa principal que continuará su ejecución.
Tipos de subprogramas.
Los subprogramas se clasifican en: procedimientos y funciones.
Un procedimiento es un subprograma que puede recibir cero o más valores desde la unidad que lo
llama y lo activa, y devolver cero o más valores a dicha unidad llamadora.
Una función en un subprograma que puede recibir 0 o más valores de entrada, pero siempre devuelve
un solo resultado y de tipo estándar: entero, real, carácter o booleano, de una manera muy
particular: en su nombre.
El conjunto de datos que se envía como comunicación entre las unidades de programa recibe el nombre de
parámetros.
Declaración de subprogramas.
Para que un programa pueda utilizar un subprograma éste tiene que estar declarado y definido dentro del
mismo. Luego de la declaración de constantes, tipos y variables, viene la zona de declaración de subprogramas.
Sintaxis:
Programa Ejemplo
Constantes
…..
Variables
...
Procedimiento Nombre1;
Declaraciones locales
Hacer
... cuerpo del proc
..
FinHacer
FinProcedimiento
Procedimiento Nombre2 (lista de parámetros formales)
Declaraciones locales
Hacer... cuerpo del proc
1
Algoritmos y Estructuras de Datos – 2017 Prof. Lic. María Gabriela Cerra
Apunte teórico –Programación modular.
..
FinHacer
FinProcedimiento
Función nombre3: tipo de la función;
Declaraciones locales
Hacer
.. cuerpo de la función
..
nombre3:= valor resultante
FinHacer
FinFuncion
….
Función nombre4( lista de parámetros formales): tipo de la función;
Declaraciones locales
Hacer
.. cuerpo de la función
..
nombre4:= valor resultante
FinHacer
FinFuncion
….
……
Hacer { cuerpo del prog principal}
..
nombre1
.. llamada o invocación al proc
..
nombre2 (lista de parámetros actuales)
…
X:= nombre3 invocación a la func
..
Imprimir: ‘el resultado es:’, nombre4 (lista de parámetros actuales)
….
FinHacer
FinPrograma.
Observación:
- Los procedimientos se invocan a través de su nombre acompañado, si corresponde, de la lista de
parámetros actuales encerrados entre paréntesis y separados por coma.
- Las funciones se invocan a través de su nombre, acompañado o no de la lista de parámetros actuales,
según corresponda, pero SOLO se invocan dentro de otra expresión aritmético lógica o de una
impresión.
Ejemplos:
Programa primero
Variables Lista de parámetros formales
Ar, X,y: real 4,2
Per: real 5,2
Procedimiento rectan ( lado1: real4,2; lado2: real 4,2; ref Area: real 4,2; ref Perim : real 5,2)
{retorna el área y el perímetro de un rectánfulo}
Hacer
Perim:= 2*lado1 + 2*lado2
Area:=lado1 * lado2
Finhacer
finprocedimiento
Hacer {del programa principal}
Imprimir: ‘ingrese el primer lado del rectangulo’
2
Algoritmos y Estructuras de Datos – 2017 Prof. Lic. María Gabriela Cerra
Apunte teórico –Programación modular.
Leer: X
Imprimir: ‘ingrese el segundo lado del rectangulo’
Leer: y
Rectan(X,Y, Ar, Per) INVOCACIÓN con lista de parámetros ACTUALES
Imprimir: ‘el área del rectángulo es:’, Ar, ’y su perímetro:’, Per
Finhacer
Finprograma.
Programa segundo
Variables Lista de parámetros formales
Prim, seg: entero 2
s: entero 3
Función Suma ( lado1: entero 2; lado2: entero 2) : entero 3 TIPO DE LA FUNCIÓN
{retorna la suma de los valores lado1 y lado2}
Hacer
Suma= lado1 +lado2
Finhacer
finfuncion
Hacer {del programa principal}
Imprimir: ‘ingrese el primer valor’
Leer: prim
Imprimir: ‘ingrese el segundo valor’
Leer: seg
s:= Suma (X,Y) INVOCACIÓN con lista de parámetros ACTUALES
Imprimir: ‘la suma de los valores es:’ s
Finhacer
Finprograma.
Parámetros: ¿Cómo se establece la comunicación entre un programa principal y un subprograma?
Los parámetros son un mecanismo de comunicación de datos o transferencia de valores, entre unidades de
programa. Cuando es necesario enviar información al subprograma y/o recibir resultados del mismo, se utilizan
los parámetros.
Los parámetros actuales o reales determinan el conjunto de datos que son enviados al subprograma para que
éste trabaje con ellos y son datos declarados y conocidos por la unidad que hace la invocación. Se escriben en
la invocación, encerrados entre paréntesis, separados por coma y pueden ser constantes, variables o
expresiones matemáticas.
Los parámetros formales son un conjunto de variables donde se almacenan los datos que recibe la unidad
invocada o donde guarda los resultados que habrá de devolver. Se escriben en el encabezamiento del
subprograma, donde se especifica cada parámetro indicando nombre y tipo de cada uno de ellos, separados
por punto y coma.
La lista de parámetros actuales debe coincidir con la lista de parámetros formales en: cantidad, orden y tipo de
datos de cada uno de ellos. Esto se debe a que en el momento del llamado al subprograma, el S.O establece
una relación posicional, uno a uno, entre cada parámetro actual y su correspondiente parámetro formal.
Podemos hablar de distintos tipos de parámetros según sea su uso:
Entrada: cuando sirven para enviar información al subprograma, pero no devuelven resultados.
Salida: cuando no envían datos pero se usan para devolver resultados desde el subprograma
Entrada/salida: cuando llevan datos al subprograma y devuelven resultados al programa llamador
En función de esta clasificación, existen diversas maneras de realizar el pasaje de parámetros:
a) por copia o valor: unidireccionales, se usan para enviar datos al subprograma, pero no pueden devolver
resultados. El parámetro formal copia el valor del parámetro actual. Toda modificación sobre el parámetro
formal no afectará al parámetro actual relacionado. Se usa este pasaje para parámetros de entrada.
funcion triple (num: real 4,2) : real 4,2;
hacer
triple := 3 * num
fin hacer
3
Algoritmos y Estructuras de Datos – 2017 Prof. Lic. María Gabriela Cerra
Apunte teórico –Programación modular.
fin funcion;
b) por referencia: bidireccionales, se utilizan para llevar información desde el programa principal al
subprograma y viceversa. Se antepone al parámetro la palabra reservada ref y de esa manera, al realizarse
el llamado al subprograma, el parámetro formal se convierte en un puntero o una referencia a la zona de
la memoria del parámetro actual, de manera tal que cualquier cambio que se haga sobre el parámetro
formal en realidad se estará llevando a cabo sobre el parámetro actual. Este pasaje se usa con parámetros
de salida y de Entrada/salida.
Ej. Realizar un procedimiento que intercambie el valor de dos variables.
programa cambio;
variables
val1, val2: real 5,2;
procedimiento intercam ( ref a: real 5,2; ref b: real 5,2);
variables
aux: real 5,2;
hacer
aux:= a
a:= b
b:= aux
fin hacer
fin procedimiento;
hacer
leer: val1,val2
imprimir: 'valores originales:', val1, val2
intercam(val1,val2)
imprimir: 'valores intercambiados:', val1, val2
fin hacer
fin programa.
Correspondencia entre parámetros.
En las llamadas o invocaciones a los subprogramas aparecen 2 partes significativas:
el nombre del subprograma llamado
y la lista de parámetros actuales o reales.
Cuando se ejecuta la sentencia de llamada, dichos parámetros actuales deben tener valor.
En el encabezamiento de los subprogramas también aparece el nombre del mismo, y la lista de parámetros
formales o ficticios. Son estos parámetros los que reciben el valor de los parámetros actuales cuando se llama
al subprograma. Por esta razón, los parámetros actuales deben coincidir en número, orden y tipo con los
formales. Es decir que existe una correspondencia entre los parámetros actuales y los formales.
Reglas.
1. la lista de parámetros siempre aparece entre paréntesis.
2. cada parámetro formal debe tener tipo, y especificar si es pasado por valor o por referencia.
3. los parámetros actuales pueden ser expresiones, variables o constantes.
4. los parámetros actuales pasados por referencia deben ser expresados por variables.
5. los parámetros actuales pasados por valor pueden ser constantes, variables, funciones o expresiones.
6. debe haber correspondencia uno a uno, de tipo y cantidad entre los parámetros actuales y formales.
Las ventajas más destacables de usar subprogramas son:
1. facilitan el diseño top-down.
2. se pueden ejecutar más de una vez en un programa, con solo invocarlos las veces que se desee. Con esto se
ahorra tiempo de programación y líneas de código.
3. el mismo procedimiento se puede usar en distintos programas.
4. su uso facilita la división de tareas entre los programadores de un equipo.
5. se pueden probar individualmente e incorporarlos en librerías o bibliotecas.
6. Facilita la corrección, modificación y mantenimiento de un programa.
4
Algoritmos y Estructuras de Datos – 2017 Prof. Lic. María Gabriela Cerra
Apunte teórico –Programación modular.
Conclusión:
Un programa que se ha desarrollado usando la técnica de diseño modular, que está bien organizado e
implementado utiliza parámetros para compartir y transmitir datos entre los módulos del mismo.
Es indispensable conocer el método de transmisión de datos adoptado por el lenguaje de programación
elegido y es fundamental tener en claro cuál es el uso que se le ha de dar a cada parámetro (es decir de E, E/S,
o S) para poder seleccionar cuál es el pasaje de parámetros adecuado: copia o referencia.
Ejemplos.
Escribir un programa que dados los lados de un rectángulo calcule e imprima el área y el perímetro del mismo.
Programa ejemplo;
Variables
Lado1, lado2: entero 1
Area, perim: entero 2
Procedimiento Calculo ( base: entero1 ; altura: entero 1; REF ar: entero 2; REF per: entero 2)
Hacer
per:= 2* base + 2*altura
ar:=base*altura
Finhacer
Finprocedimiento
Hacer
Imprimir: ‘ingrese lado mayor y lado menor’
Leer: lado1, lado2
Calculo (lado1, lado2, area, perim)
Imprimir:’area’, area, ‘Perimetro’, perim
Finhacer
Finprograma.
Escribir un programa que permita calcular el cubo de un conjunto de números dados. El proceso finaliza
cuando se lee un 0.
Programa resul;
variables
aux, num : real 4,2;
funcion cubo ( val: real 4,2) : real 4,2;
hacer
cubo := val * val * val
fin hacer
fin funcion;
hacer
imprimir: 'ingrese valor:'
leer: num
repetir mientras (num <> 0 )
imprimir: 'el cubo de:' , num, 'es:', cubo(num)
imprimir: 'ingrese otro valor. 0 para finalizar el proceso'
leer: num
fin repetir mientras
fin hacer
fin programa.
Ej.: Calcular el máximo entre 2 nº dados.
programa calcul;
variables
max, x, y: real 4,2;
función maxim( vx: real 4,2; vy : real 4,2): real 4,2
5
Algoritmos y Estructuras de Datos – 2017 Prof. Lic. María Gabriela Cerra
Apunte teórico –Programación modular.
hacer
si (vx > vy) entonces maxim := vx
sino maxim := vy
finsi
fin hacer
fin funcion
hacer
leer: x,y
max := maxim(x,y)
imprimir: 'el mayor es:', max
fin hacer
fin programa.