Você está na 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 4

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 6

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

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

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


100

300 200 100 Programa principal

200

300

400

500

600

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

10

Tipos de subprogramas
Procedimientos.
Ejecutan una accin que puede o no modificar valores y puede o no necesitar datos de entrada. Su llamada sustituye a una tarea. Realizan una operacin que siempre tiene como resultado un valor.
9 Factorial. 9 Potencia. 9 Mximo. Mximo 9 ImprimirFactura. 9 OrdenarLista.

Funciones.

Algunos lenguajes hacen esta distincin entre subprogramas. En algunos lenguajes no hacen esa distincin

Su llamada sustituye a un valor.

Procedure y Function en Pascal, procedimientos Sub y procedimientos Function en VB.NET 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.
Significado Funcin en C fabs() en el archivo de cabecera math.h rand() y srand() en al archivo de cabecera stdlib.h cos() en el archivo de cabecera math.h 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; floor(2.6) es 2; floor(-2.6) es 3. exp() en el archivo de cabecera math.h log() en el archivo de cabecera math.h l 10() en el archivo de cabecera math.h log10() th h sqrt() en el archivo de cabecera math.h sin() en el archivo de cabecera math.h tan() en el archivo de cabecera math.h

Funcin abs(x)

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 entero(x) Devuelve el primer valor entero menor que la expresin numrica x

exp(x) log(x) log10(x) raz2(x) sen(x) tan(x) trunc(x)

Devuelve el valor Devuelve el logaritmo neperiano de x. Devuelve el logaritmo en base 10 de x. x Devuelve la raz cuadrada de x Devuelve el seno de x Devuelve la tangente de x Trunca (elimina los decimales) de la expresin numrica x.

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(), 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 el l 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. Declaracin.
Dentro del procedimiento se pueden modificar algunos de los valores del programa llamador pero no devuelve ningn valor asociado a la llamada.

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. 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.
9 Algunos podrn devolver valores al programa llamador.

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_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 el l mismo i nombre, siempre que tengan un mbito distinto. Resolucin de conflictos. conflictos

9 Cada mdulo almacena las variables en lugares de memorias distintos entre s y distintos del programa principal. 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. 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 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.

Cmo lo que se manda es una copia de un valor, los parmetros actuales pueden ser expresiones.

9 El valor del parmetro actual en el programa llamador permanece inalterado puesto que lo que se ha modificado es la copia.

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 345 nm 345

MEMORIA
nm 345

MEMORIA
nm 345

MEMORIA

n 345 3

n 3

Al asignar el valor de nm

Al realizar la llamada

Al finalizar la llamada

Al retornar al programa principal


30

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

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. 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. En este caso el parmetro actual y el formal hacen referencia a la misma zona de memoria.

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( I t bi (ref f entero t : x,y) ) var entero : aux inicio aux x x y y aux fin_procedimiento

MEMORIA
a 4 x b 5 y aux

Al realizar la llamada MEMORIA


a 5 x b 4 y 4 aux a 5

MEMORIA

b 4 4

Al finalizar la llamada

Al retornar al programa principal

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

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.

Para disminuir el acoplamiento de los mdulos todo intercambio de informacin se debe realizar por medio de parmetros. Norma:

Pero se deben evitar.

Aunque se pueda realizar el intercambio por medio de variables globales, esto aumentar el acoplamiento. 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. 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

3.

4.

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

1 1 3 5

1 7

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

Você também pode gostar