Está en la página 1de 41

Fundamentos de Programacin I

4 Programacin modular
4.

Lus Rodrguez Baena (luis.rodriguez@upsam.net)


Universidad Pontificia de Salamanca (campus Madrid)
Escuela Superior de Ingeniera y Arquitectura

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.

La programacin modular proporciona un mtodo para plasmar el


uso de recursos abstractos y la programacin descendente.
Consiste en descomponer un problema complejo en partes ms
pequeas: mdulos,
mdulos subalgoritmos o subprogramas.
subprogramas
Cada mdulo sera un programa normal pensado para ser integrado
en una aplicacin mayor.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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.

Facilidad de mantenimiento y correccin de errores


errores.
9 Si cada mdulo cumple una tarea completa es ms fcil detectar
donde se produce un error.
9 Si se necesita realizar una mejora,
j , slo habr que
q modificar un
mdulo.

Reutilizacin del cdigo.


9 Un mdulo que realice una tarea determinada podr utilizarse en
otro
t programa que precise
i d
de la
l misma
i
tarea.
t
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

Criterios de descomposicin modular


Es necesario un compromiso entre el tamao de los mdulos y la
complejidad de la aplicacin.
Si un programa se descompone en demasiadas unidades, decrece la
efectividad.
9 Cuando el nmero de mdulos se incrementa, decrece el esfuerzo para
realizarlos, pero aumenta el esfuerzo de integracin y la carga en memoria.

Algunos criterios de descomposicin (no vlidos).


Descomposicin po
por tamao (50 lneas po
por md
mdulo).
lo)
Complejidad del mdulo: niveles de anidamiento (menos de 7 niveles).

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.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

Criterios de descomposicin modular


( )
(II)
Un mdulo se debe dividir hasta q
que se consiga
g un nivel
mnimo aceptable de independencia funcional.
La independencia funcional se puede medir segn dos
criterios:
Cohesin.
9 Mide la relacin entre las partes internas de un mdulo.
9 Todas deben estar encaminadas a realizar una nica funcin.

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.

Un mdulo debe tener mucha cohesin y poco


acoplamiento.
p
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

600

Llamadas a mdulos (II)


Cuando se hace la llamada a un mdulo se transfiere el
control a la primera lnea del mdulo llamado.
El programa llamador queda en suspenso hasta que termina el
mdulo llamado.
9 En algunos lenguajes no estructurados (COBOL) es posible entrar
por otra lnea.

El mdulo llamado carga en memoria su cdigo y un


espacio
i para sus propias
i variables
i bl y estructuras.
Cuando el programa llamado termina, transfiere el
control a la instruccin siguiente
g
a la llamada.
Se pierde la informacin generada por el mdulo a no se que se
produzca un intercambio de informacin entre el programa
llamador y el llamado.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

Llamadas a mdulos (III)


Durante su ejecucin el programa llamado acta como si se tratara
del programa principal.
principal
Puede realizar llamadas a otros mdulos que funcionan de la misma
forma antes expuesta.
El posible realizar llamadas a otros mdulos: llamadas anidadas.
Es posible llamarse a si mismo (recursividad).

Cmo se retorna a la instruccin dnde se ha hecho la llamada?

La direccin de la lnea donde se realiza la llamada y el estado de las variables


del p
programa
g
llamador se almacena en una estructura de tipo
p pila:
p
la pila
p de
llamadas (call stack).
9 Los datos salen de forma inversa a como han entrado.
9 Cuando acaba un mdulo, el flujo de control retorna a la direccin de
memoria almacenada en la parte superior de la pila: la ultima que ha
entrado.
entrado
9 Se retorna en orden inverso al orden de llamada.
9 Cuando termina un programa y la pila de llamadas est vaca, el control
retorna el sistema operativo.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

Llamadas a mdulos (IV)


Pila de llamadas

600
500
400
300
200
100

100

Programa principal
200

300

400

500

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

600

10

Tipos de subprogramas
Procedimientos.

Ejecutan una accin que puede o no modificar valores y puede o no


necesitar datos de entrada.
9 ImprimirFactura.
9 OrdenarLista.

Su llamada sustituye a una tarea.

Funciones.

Realizan una operacin que siempre tiene como resultado un valor.


9 Factorial.
9 Potencia.
9 Mximo.
Mximo

Su llamada sustituye a un valor.

Algunos lenguajes hacen esta distincin entre subprogramas.

Procedure y Function en Pascal, procedimientos Sub y procedimientos Function


en VB.NET

En algunos lenguajes no hacen esa distincin

En C, a todo se le denomina funcin, aunque algunas no devuelven nada (funciones


void).
En Java, que utiliza programacin orientada a objetos, a todo se le denomina mtodo
y forman parte del objeto.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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.

En la instruccin de asignacin y 1 + sen(45)


Se evala la expresin de izquierda a derecha.
Antes de evaluar la expresin, el control se transfiera a la
llamada a la funcin sen() con el valor 45.
La funcin se ejecuta, termina y devuelve el valor del seno de 45
(0,7071) que sustituye a la llamada.
La expresin evaluada (1+0.7071) se asigna a la variable y.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

12

Funciones (II)

Funciones matemticas internas (predefinidas o intrnsecas) del lenguaje algortmico UPSAM 2.0.

Funcin

Significado

abs(x)

Funcin en C

Devuelve el valor absoluto de la expresin


numrica x
aleatorio() Devuelve un nmero aleatorio real mayor
y o
igual que 0 y menor que 1
cos(x)
Devuelve el coseno de x

fabs() en el archivo de cabecera math.h

entero(x)

Devuelve el primer valor entero menor que


la expresin numrica x

ceil(), redondea al entero mayor ms cercano y floor(),


redondea al entero menor ms cercano, en el archivo de
cabecera math.h.
math h ceil(2.6)
ceil(2 6) es 3; ceil(-2.6)
ceil(-2 6) es 2;
2;
floor(2.6) es 2; floor(-2.6) es 3.

exp(x)

Devuelve el valor

exp() en el archivo de cabecera math.h

log(x)

Devuelve el logaritmo neperiano de x.

log() en el archivo de cabecera math.h

log10(x)

Devuelve el logaritmo en base 10 de x.


x

l 10() en el archivo de cabecera math.h


log10()
th h

raz2(x)

Devuelve la raz cuadrada de x

sqrt() en el archivo de cabecera math.h

sen(x)

Devuelve el seno de x

sin() en el archivo de cabecera math.h

tan(x)

Devuelve la tangente de x

tan() en el archivo de cabecera math.h

trunc(x)

Trunca (elimina los decimales) de la


expresin numrica x.

rand() y srand() en al archivo de cabecera stdlib.h


cos() en el archivo de cabecera math.h

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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

Declaracin de funciones (II)


Es p
posible que
q sea necesario utilizar datos auxiliares
para ejecutar la funcin.
Para ello se utilizarn las declaraciones locales.
Las declaraciones de variables se realizarn de la misma forma
que en un algoritmo principal.

Entre las palabras reservadas inicio y fin_funcin


se colocar
el cdigo

de la funcin.

Una funcin siempre devuelve un valor.


La expresin de la instruccin devolver(),
devolver() indicar el valor
que devuelve.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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

Anlisis del problema


9 Se deber proporcionar a la funcin un dato sobre el que vamos a sacar el factorial: el argumento de
tipo entero n.
9 Para el clculo del factorial habr que acumular las multiplicaciones de todos los nmeros entre 1 y n,
por lo que ser necesario un acumulador de multiplicaciones (variable fact)
f t) que habr que inicializar
al elemento neutro de la multiplicacin.
9 Por ltimo ser necesario realizar un bucle en el que una variable vaya tomando los valores entre 2 y
n (hay que recordar que factorial de 0 es 1 y factorial de 1 tambin es 1).
9 Se utilizar una estructura de tipo desde. El valor de retorno de la funcin ser el del acumulador
fact.

entero funcin Factorial(entero : n)


var
entero: fact, i
inicio
fact 1
desde i 2 hasta n hacer
fact fact * i
fin_desde
devolver(fact)
fin funcin
fin_funcin

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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)

//Realiza la llamada a la funcin con n = 3


//Evala el contenido de la variable a
//y realiza la llamada con n = a
Factorial(a+5)//Evala el contenido de la expresin a+5
// y realiza la llamada con n = a+5

Una funcin devuelve un valor, por lo que la llamada se deber


utilizar en una expresin que requiera un valor del tipo de dato
devuelto por la funcin.
escribir(Factorial(3)
a x * Factorial(y)
b Factorial(Factorial(b))

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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.

Anlisis del problema


9 Cada trmino de la serie se calcular mediante la funcin factorial declarada en el
ejercicio 5.1. En cada trmino, el exponente y el factorial van tomando valores
1,3,5,7, por lo que ser necesario un contador que, a partir de 1, incremente
los valores de dos en dos.
9 En la serie,
serie el primer trmino se suma,
suma el segundo se resta,
resta el tercero se suma
suma,
etc., es decir, se va alternado la suma y la resta. Para solucionar esto se utiliza
una variable lgica (sumar) que cambia de estado en cada iteracin. Si la variable
es cierta se sumar el trmino a la serie, en caso contrario se resta.
9 Adems es necesario guardar el ltimo y el penltimo trmino para controlar la
salida

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

18

Ejemplo 4.2. (II)


real funcin Seno(entero: x)
var
real : suma, ltimo, penltimo
entero : i
lgico : sumar //si es cierto, suma el trmino, en caso contrario
//lo resta
inicio
suma x
i 1
ltimo x
repetir
i i + 2
penltimo ltimo
p
ltimo x ** i / factorial(i)
//Si sumar es verdad, suma el trmino x**i/Factorial(i)
si sumar entonces
suma suma + ltimo
si_no
suma suma - ltimo
fin_si
//En cada iteracin se cambia el estado de la variable sumar
sumar no sumar
hasta_que penltimo ltimo < 0.001
devolver(suma)
fin funcin
fin_funcin

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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

NombreProcedimiento es un identificador nico que referencia el procedimiento.


La listaDeParmetrosFormales es una lista con los argumentos con los que se
ejecutar el procedimiento.
9 Algunos podrn devolver valores al programa llamador.

Si se necesita, se pueden declarar tipos de datos y variables auxiliares que se precisen


dentro de las declaraciones locales.
El cdigo del procedimiento se realizar de la misma forma que en un programa
principal
principal.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

20

Ejemplo 4.3.
Disee un mdulo que permita escribir por pantalla un nmero n que se pasar como
argumento al revs.

Anlisis del problema


9 El mdulo deseado simplemente realiza una accin (escribir un nmero al revs) y no necesita
devolver o modificar ningn dato del programa principal. Por lo tanto el tipo de mdulo apropiado
para realizarlos ser un procedimiento.
9 Para poder escribir un nmero al revs, tenemos que utilizar los operadores div y mod. El resto de
dividir un nmero entre 10 ser el ltimo dgito, las unidades. Si modificamos el nmero para
eliminarle las unidades (n div 10) el siguiente resto nos dara las decenas, etc. El proceso se tiene
que repetir hasta que el nmero sea menor que 10.

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.

Al sustituir una accin la llamada a un p


procedimiento sustituye
y a una
instruccin.
La llamada EscribirNmeroAlreves(2345) produce el mismo efecto que
insertar en ese punto las instrucciones del procedimiento haciendo que n sea
igual
g
a 2345.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

22

Visibilidad o mbito de las variables


No todos los datos se pueden utilizar desde todos los puntos del
algoritmo.
l i
El mbito o visibilidad de una variable sera el lugar donde puede ser
utilizadas.

Segn su mbito las declaraciones de un algoritmo pueden ser:


Declaraciones globales.
9 Afectan a todo el programa.
9 Se almacenan en una zona de memoria comn, accesible desde cualquier
punto del programa y que se mantiene mientras dura el programa.
9 Son las declaraciones del programa principal.

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

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

23

Visibilidad o mbito de las variables (II)


Conflictos en los nombres de variables.

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.

9 Cada mdulo almacena las variables en lugares de memorias distintos entre


s y distintos del programa principal.

Resolucin de conflictos.
conflictos

9 La prioridad la tiene la declaracin ms local.

Por qu son necesarias las declaraciones locales?

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.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

24

Visibilidad o mbito de las variables (III)


...
var
entero: n, fact, i
inicio
leer(n)
escribir(factorial())
...
entero funcin Factorial()
inicio
fact 1
desde i 2 hasta n hacer
fact fact * i
fin_desde
devolver(fact)
fin_funcin

Esta funcin Factorial tendra mucho acoplamiento.

Necesitara que siempre el programa factorial utilizara las variables enteras n , i


y factorial.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

25

Intercambio de informacin: paso de


pa et os
parmetros
Los argumentos de un procedimiento o funcin se utilizan para
intercambiar informacin entre el mdulo y el programa llamador.
llamador
La lista de parmetros actuales sustituye a la lista de parmetros
formales.

9 La lista de parmetros actuales est compuesta de una lista de variables o


expresiones separadas por comas
comas.
9 La lista de parmetros formales est compuesta por grupos de argumentos
del mismo tipo.
o Los argumentos se separan por comas.
o Los grupos
g p por
p punto
p
y coma.

La sustitucin se realiza por su posicin.

Los parmetros de ambas listas deben coincidir en nmero posicin


y tipo de dato
dato.
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

26

Intercambio de informacin: paso de


parmetros
pa
et os (II)
( )
En algunos casos el intercambio de informacin se realizar
slo desde el programa llamador al mdulo.
Se trata de argumentos de entrada.
Se sealan utilizando una E o la palabra valor antes del tipo del
grupo de
d argumentos.
t

Otras veces es preciso realizar un intercambio bidireccional.


Se trata de argumentos de entrada y salida.
Se
S sealan
l utilizando
ili
d una E/S o la
l palabra
l b ref antes del
d l tipo
i del
d l
grupo de argumentos.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

27

Paso de argumentos
Por cada tipo de argumento los parmetros formales se definen:
{E|E/S|valor|ref} tipoDato : listaIdentificadores ;

E o E/S (valor o ref) define el tipo de paso de argumentos.


tipoDato es un dato ya declarado (estndar o definido por el usuario).
listaIdentificadores es el nombre de los argumentos separados
por comas.
Puede haber distintos tipos de argumentos, cada tipo se separa por
punto
t y coma.

Segn se trate de argumentos de entrada o de entrada salida los


argumentos se pasarn:
P
Por valor.
l
Por referencia.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

28

Paso por valor


Argumentos de entrada.
Modo
M d de
d funcionamiento:
f
i
i t

Al realizar la llamada se evalan los valores de la lista de parmetros actuales.


Se enva una copia de dichos valores al subprograma.
La copia de los parmetros actuales sustituye a los parmetros formales por
posicin.
posicin
Los parmetros formales actan como variables locales.
9 Se reserva una zona de la memoria para almacenar el valor de la copia que se ha
pasado y se la identifica con el nombre del parmetro.

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.

Cmo lo que se manda es una copia de un valor, los parmetros actuales


pueden ser expresiones.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

29

Paso por valor (II)


algoritmo PasoPorValor
var
entero : nm
inicio
nm 345
EscribirNmeroAlRevs(nm)

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

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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

Ejemplo 4.4. (II)


lgico funcin EsBisiesto(valor entero: a)
inicio
devolver((a mod 4 = 0) y ((a mod 100 <> 0) o (a mod 400 = 0)))
fin_funcin
lgico funcin EsFechaVlida(valor entero: ao, mes, da)
var
lgico : vlida
inicio
vlida verdad
si (dia > 31) o (da < 1) o (mes> 12) o (mes< 1) entonces
vlida falso
si_no
segn_sea mes hacer
4, 6, 9, 11 : vlida da <= 30
2 : si EsBisiesto(ao) entonces
vlida da <= 29
si_no
vlida dia <= 28
fin_si
fin_segn
fin_si
devolver(vlida)
fin_funcin

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

32

Paso por referencia


Tambin se llama paso por variable.
Argumentos
A
de
d entrada
d o entrada/salida.
d / lid
No se pasa una copia del valor, sino la referencia a la zona de la
memoria donde se almacena el parmetro actual.
En este caso el parmetro actual y el formal hacen referencia a la
misma zona de memoria.

Durante la ejecucin del programa se referencia esa zona de


memoria con el nombre de los parmetros formales.
Cualquier modificacin que se haga en esa zona de memoria
afectar a la misma regin de memoria donde se almacenan los
parmetros actuales.
Como no se pasa un valor sino una referencia a una zona de
memoria,
i es necesario
i pasar algo
l que se almacene
l
en memoria:
i
Se pasan variables, no expresiones.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

33

Paso por referencia (II)


algoritmo PasoPorReferencia
var
entero : a, b
inicio
a 4
b 5
Intercambia(a b)
Intercambia(a,b)

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

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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.

9 Es la nica forma en que los procedimientos pueden devolver valores a un


programa.
programa
9 En ocasiones, cuando se pasa una estructura de datos muy grande, utilizar
variables globales directamente puede ahorra espacio y tiempo de ejecucin.

Pero se deben evitar.

Para disminuir el acoplamiento de los mdulos todo intercambio de


informacin se debe realizar por medio de parmetros.

Aunque se pueda realizar el intercambio por medio de variables globales,


esto aumentar el acoplamiento.

Norma:

No modificar variables globales dentro de los mdulos.


Si se desea modificar variables globales se debe utilizar el paso por
referencia.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

36

Ejercicios
1.
2
2.

3.

4.

Disee una funcin que calcule el valor absoluto de un nmero entero.


S
Suponiendo
i d que nuestro
t lenguaje
l
j de
d programacin
i no dispone
di
de
d los
l
operadores de divisin entera y resto, disee un mdulo que permita
obtener la divisin entera y el resto de dos nmeros enteros positivos
mediante restas sucesivas. Justifique la eleccin del tipo de mdulo
utilizado.
utilizado
Suponiendo que nuestro lenguaje de programacin no dispone del
operador de exponenciacin, disee un mdulo que devuelva el resultado
de xy, siendo x un nmero real e y un nmero entero. Justifique la eleccin
del tipo
p de mdulo utilizado.
El nmero se puede calcular mediante la serie

1 1
3 5

1
7

= 41 + + ...
Calcule el valor del nmero hasta que la diferencia entre dos trminos sea
menor a 10-15.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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

1428 mod 316 = 164


316 mod
d 164 = 152
164 mod 152 = 2
152 mod 2 = 0

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.

Universidad Pontificia de Salamanca (Campus Madrid)


Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

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

15 Disee un subprograma que reciba dos horas


15.
expresadas en horas, minutos y segundos y devuelva
otra hora que represente la suma de ambas.
Universidad Pontificia de Salamanca (Campus Madrid)
Luis Rodrguez Baena, Escuela Superior de Ingeniera y Arquitectura, 2011

41

También podría gustarte