Documentos de Académico
Documentos de Profesional
Documentos de Cultura
4 Programacin modular
4.
Introduccin a la programacin
modular
odu a
Es ms fcil resolver un problema complejo cuando se divide en
partes manejables: tcnica de divide y vencers.
En un programa monoltico la cantidad de variables utilizadas y caminos
que debe seguir el flujo de control hace imposible su correcta
comprensin.
i
9 Se dificulta la correccin de errores y el mantenimiento posterior del
programa.
Introduccin a la programacin
modular
odu a (
(II)
)
Un programa modular estara compuesto de:
Un programa principal, encargado de coordinar la ejecucin.
Una serie de mdulos que resolveran cada una de la tareas concretas del
problema.
Introduccin a la programacin
modular
odu a (
(III)
)
Ventajas.
j
Facilidad para aprehender el problema.
Divisin del trabajo entre un equipo de programadores.
9 Si los mdulos son independientes,
p
, cada programador
p g
del equipo
q p de
desarrollo puede encargarse de uno.
9 El jefe del proyecto integrar los distintos mdulos en la aplicacin
principal.
Independencia funcional.
Un mdulo
d l debe
d b realizar
l
una nica
tarea y comunicarse lo
l menos
posible con el resto de mdulos.
Acoplamiento.
9 Mide la relacin del mdulo con el resto de los mdulos.
o Debe comunicarse lo menos posible.
o Pocas veces se conseguir un acoplamiento nulo.
Llamadas a mdulos
Un programa modular contar con un programa principal y uno o varios
mdulos.
mdulos
El programa principal llama o invoca a los mdulos, cediendo a stos el
control del flujo del programa.
100
200
300
400
500
600
600
500
400
300
200
100
100
Programa principal
200
300
400
500
600
10
Tipos de subprogramas
Procedimientos.
Funciones.
11
Funciones
Realizan una tarea q
que siempre
p devuelve un valor
asociado a la propia llamada.
Cuando se detecta la llamada a una funcin, el control del
programa se transfiera a la funcin.
Cuando la funcin termina se retorna y la llamada es sustituida
por el valor que devuelve.
12
Funciones (II)
Funciones matemticas internas (predefinidas o intrnsecas) del lenguaje algortmico UPSAM 2.0.
Funcin
Significado
abs(x)
Funcin en C
entero(x)
exp(x)
Devuelve el valor
log(x)
log10(x)
raz2(x)
sen(x)
Devuelve el seno de x
tan(x)
Devuelve la tangente de x
trunc(x)
13
Declaracin de funciones
tipoDeDato funcin NombreDeFuncin([listaDeParmetrosFormales])
[//D l
[//Declaraciones
i
l
locales
l
d
de ti
tipos d
de d
datos,
t
constantes
t t
o variables]
i bl ]
inicio
//Cdigo de la funcin
devolver(expresin)
fin_funcin
_
Una funcin siempre devuelve un tipo de dato que habr que indicar
en la cabecera de la funcin
funcin.
Es necesario un identificador nico que identifique la funcin.
Es posible que sea necesario pasar informacin a la funcin (por
ejemplo el 45 de la funcin seno anterior).
Seran los argumentos o parmetros formales con los que realizar las
operaciones.
De momento por cada argumento se indicar el tipo de dato y el
nombre.
b
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011
14
de la funcin.
15
Ejemplo 4.1.
Declarar una funcin que calcule el factorial de un nmero entero positivo que se
pasar como argumento de la funcin.
funcin
16
Llamadas a funciones
Formato de la llamada:
NombreFuncin([ListaParmetrosActuales])
La lista de parmetros actuales son los valores reales con los que
trabajar la funcin.
9 Al realizar
li
la
l llamada
ll
d ell valor
l de
d los
l parmetros
t
actuales
t l sustituye
tit
a los
l
parmetros formales a la hora de ejecutar el cdigo.
Factorial(3)
Factorial(a)
17
Ejemplo 4.2.
El seno de un ngulo x se puede calcular por la siguiente serie:
(1)
x3 x5 x7 x n
2 n +1
sen( x) =
x
= x +
(
2
n
1
)!
3! 5! 7! n!
+
n =0
Cuanto mayor sea el nmero de trminos de la serie, mayor ser la precisin del
clculo
clculo.
Implemente una funcin seno que permita calcular el seno de un ngulo x
expresado en radianes utilizando dicha serie. El clculo terminar cuando la
diferencia entre dos trminos correlativos sea menor que 10-3.
18
19
Procedimientos
Su llamada sustituye a una accin.
Mdulo que realiza una accin especfica que puede devolver 0, 1 o n valores.
Dentro del procedimiento se pueden modificar algunos de los valores del programa
llamador pero no devuelve ningn valor asociado a la llamada.
Declaracin.
procedimiento NombreDeProcedimiento([listaDeParmetrosFormales])
[//Declaraciones locales de tipos de datos, constantes o variables]
inicio
//Cdigo del procedimiento
fin procedimiento
fin_procedimiento
20
Ejemplo 4.3.
Disee un mdulo que permita escribir por pantalla un nmero n que se pasar como
argumento al revs.
procedimiento EscribirNmeroAlRevs(entero : n)
inicio
mientras n >= 10 hacer
escribir(n mod 10)
n n div 10
fin mientras
fin_mientras
fin_procedimiento
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011
21
Llamadas a procedimientos
Formato de la llamada:
[llamar_a]NombreProcedimiento([listaDeParmetrosActuales])
Algunos lenguajes precisan de una orden especial para realizar la llamada (call
o similar).
Proceso de la llamada.
La llamada transfiere el control a la primera lnea del procedimiento.
Se carga el procedimiento en memoria, se crea las variables locales que se
precisen y se sustituyen los parmetros formales por los actuales.
Se ejecuta
j
el cdigo
g del procedimiento.
p
Al finalizar el control vuelve al programa llamador.
9 En algunos casos, si se han modificado los valores de los parmetros actuales, ese
cambio se refleja en el programa llamador.
22
Declaraciones locales.
9 Slo se pueden utilizar en el mdulo (procedimiento o funcin) donde han
sido declaradas.
9 Se almacenan en una zona de memoria que se crea cuando se llama al
mdulo, que slo es accesible desde ese mdulo y que se destruye cuando
j
del mdulo.
termina la ejecucin
23
E
En un algoritmo
l it
pueden
d coexistir
i ti variables
i bl distintas
di ti t con ell mismo
i
nombre, siempre que tengan un mbito distinto.
Resolucin de conflictos.
conflictos
En la g
gran mayora
y
de las ocasiones es p
posible utilizar variables
globales.
Si slo se utilizan variables globales, el programa que utiliza el
procedimiento est obligado a utilizar los mismos nombres de variables
que el procedimiento.
Un algoritmo as diseado tendra
mucho acoplamiento.
9 Depende mucho de la informacin del resto de los componentes del
algoritmo.
9 Pierde independencia funcional.
24
25
26
27
Paso de argumentos
Por cada tipo de argumento los parmetros formales se definen:
{E|E/S|valor|ref} tipoDato : listaIdentificadores ;
28
Las modificaciones q
que se realicen en el subprograma
p g
se hacen sobre la copia.
p
Se realiza una copia del valor de la variable en otra variable que tiene el nombre
del argumento.
Al finalizar el subprograma la referencia a esa zona de la memoria local
desaparece.
9 El valor del parmetro actual en el programa llamador permanece inalterado puesto
que lo que se ha modificado es la copia.
29
Fin
Procedimiento
EscribirNmeroAlRevs(valor entero: n)
inicio
mientras n >= 10 hacer
escribir(n mod 10)
n n div 10
fin mientras
fin_mientras
escribir(n)
fin_procedimiento
MEMORIA
nm
MEMORIA
MEMORIA
nm
nm
nm
345
MEMORIA
345
345
345
n
3
345
Al asignar el valor de nm
Al realizar la llamada
Al finalizar la llamada
Al retornar al programa
principal
30
Ejemplo 4.4.
Disee una funcin lgica que indique si una fecha es vlida. Se
pasar a la funcin tres nmeros enteros con el da, el mes y el ao.
Anlisis del problema
Habr que comprobar si el mes est entre 1 y 12 y el da entre 1 y 31.
Si esto es cierto habr que comprobar que si el mes es de 30 das, el
da no sea mayor que 30. Si se trata de febrero habr que comprobar si
es un ao bisiesto y si es as comprobar que el da no sea mayor que 29
o en caso contrario
o,
contrario, mayor que 28
28.
La solucin propuesta utilizar un switch o interruptor para comprobar
la fecha. Se trata de una variable lgica (vlida) que, al final del
proceso, servir para saber si la fecha es correcta. Inicialmente se le
dar un valor verdadero y en el caso de que se produzca algn error
tomar el valor falso.
La solucin propuesta implementar tambin una funcin que indique si
un nmero corresponde a un ao bisiesto.
bisiesto
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011
31
32
33
fin
//Intercambia el contenido de dos variables
procedimiento
di i t Intercambia(ref
I t
bi ( f entero
t
: x,y)
)
var
entero : aux
inicio
aux x
x y
y aux
fin_procedimiento
MEMORIA
a
4
x
aux
b
5
Al realizar la llamada
MEMORIA
MEMORIA
a
5
x
aux
b
4
b
4
Al finalizar la llamada
Al retornar al programa
principal
34
Ejemplo 4.5.
Disee un subprograma que reciba la posicin de un punto en coordenadas
polares
l
(radio
( d y ngulo)
l ) y devuelva
d
l su posicin
en coordenadas
d
d cartesianas
(x,y). Para pasar de coordenadas cartesianas a polares se utilizan las siguientes
frmulas.
x = radio * cos(a)
( )
y = radio * sen(a)
Anlisis del problema
El mdulo a utilizar debera ser un procedimiento, puesto que deber devolver ms de un
valor y es imposible devolver los valores de x y de y en la propia llamada.
La funcin recibir dos argumentos reales que se pasarn por valor para el radio y el ngulo.
Tambin tendr otros dos argumentos reales pasados por referencia para los valores de x e
y.
procedimiento DeCPolaresACartesianas(valor real : r,a; ref real: x,y)
inicio
x r * cos(a)
y r * sen(a)
fin_procedimiento
35
Efectos laterales
Un efecto lateral es el efecto producido por la modificacin de una
variable global o incluso de un argumento directamente en un
procedimiento o funcin.
Puede que en algunos casos sea beneficiosos.
Norma:
36
Ejercicios
1.
2
2.
3.
4.
1 1
3 5
1
7
= 41 + + ...
Calcule el valor del nmero hasta que la diferencia entre dos trminos sea
menor a 10-15.
37
Ejercicios (II)
5. El coseno de un ngulo x se puede calcular mediante la serie
(1) n 2 n
x2 x4 x6
cos( x) =
x =1 + + ...
(
)
2
!
2! 4! 6!
n
n =0
Disee una funcin que permita calcular el valor del seno de x hata
que la diferencia entre dos trminos sea menor que 10-3.
6 Disee una funcin que devuelva la suma de divisores de un
6.
nmero pasado como argumento. Por ejemplo, si el argumento
pasado es 24, deber devolver 1+2+3+4+6+8+12+24.
7 Disee una funcin lgica que indique si un nmero es perfecto.
7.
perfecto
Un nmero es perfecto si es igual a la suma de sus divisores. Por
ejemplo, 6 es un nmero perfecto ya que 6 = 1+2+3.
38
Ejercicios (III)
8. Disee una funcin lgica
g
que
q indique
q si dos nmeros
son amigos. Dos nmeros son amigos si cada uno es
igual a la suma de divisores del otro excepto el propio
nmero. Por ejemplo,
j p , 284 y 220 son amigos:
g
Divisores de 284 1, 2, 4, 71, 142 y 284.
Suma
Su
a de d
divisores
so es e
excepto
cepto 284
8 = 220.
0
Divisores de 220: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110 y 220.
Suma de divisores excepto
p 220 = 284
Disee adems un programa principal que saque por pantalla
todas las parejas de nmeros amigos entre 1 y n.
39
Ejercicios (IV)
9.
Disee una funcin que devuelva el mximo comn divisor por el algoritmo de
Euclides.
Euclides
(32 y 6) = 2
1428 y 316
9
9
9
9
10. Codifique un procedimiento permita leer por teclado una serie de caracteres.
La lectura terminar cuando el carcter introducido sea 0 (cero).
(cero) El
procedimiento deber devolver al programa que lo llam el nmero de vocales
que se introdujeron. Por ejemplo, si la serie de caracteres introducida es a, x,
h, e, a, v, 0, el procedimiento deber devolver el valor 3.
11 Dada una fecha expresada en da,
11.
da mes y ao
ao, escriba una funcin que
devuelva el nmero de das transcurrido desde el comienzo del ao.
12. Dada una fecha posterior al 1 de enero de 1980, escriba un mdulo que
devuelva el da de la semana sabiendo que el 1 de enero de 1980 fue martes.
40
Ejercicios (V)
13. Disee una funcin q
que reciba una hora expresada
p
en
horas, minutos y segundos y devuelva el nmero de
segundos totales.
14. Disee un subprograma que reciba un nmero de
segundos transcurridos y devuelva el nmero de horas,
minutos y segundos que representan.
Hh = segTotales div 3600
Mm = segTotales mod 3600 div 60
Ss = segTotales mod 3600 mod 60
41