17.01.2015 Views

Versión para imprimir - Dpto. Ciencias de la Computación e ...

Versión para imprimir - Dpto. Ciencias de la Computación e ...

Versión para imprimir - Dpto. Ciencias de la Computación e ...

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Programación Estructurada<br />

Complementos <strong>de</strong> Informática<br />

Tema 2: Programación Estructurada y<br />

Programación Modu<strong>la</strong>r<br />

Álvaro Romero Jiménez<br />

Departamento <strong>de</strong> <strong>Ciencias</strong> <strong>de</strong> <strong>la</strong> Computación e Inteligencia Artificial<br />

Universidad <strong>de</strong> Sevil<strong>la</strong><br />

Conjunto <strong>de</strong> técnicas <strong>para</strong> <strong>de</strong>sarrol<strong>la</strong>r programas fáciles <strong>de</strong><br />

escribir, verificar, leer y modificar.<br />

Técnicas utilizadas:<br />

◮ Diseño <strong>de</strong>scen<strong>de</strong>nte: <strong>de</strong> los conceptos generales a los<br />

<strong>de</strong>talles particu<strong>la</strong>res.<br />

◮ Recursos abstractos: los subproblemas se suponen ya<br />

resueltos.<br />

◮ Estructuras básicas: se utilizan únicamente <strong>la</strong>s estructuras<br />

secuencial, selectiva y repetitiva.<br />

2 / 21<br />

Números Amigos<br />

Definición<br />

Dos números se dice que son amigos si cada uno <strong>de</strong> ellos es<br />

igual a <strong>la</strong> suma <strong>de</strong> los divisores propios <strong>de</strong>l otro.<br />

Por ejemplo, los números 220 y 284 son amigos, ya que:<br />

Suma <strong>de</strong> divisores <strong>de</strong> 284: 1 + 2 + 4 + 71 + 142 = 220<br />

Suma <strong>de</strong> divisores <strong>de</strong> 220: 1 + 2 + 4 + 5 + 10 +<br />

11 + 20 + 22 + 44 +<br />

55 + 110 = 284<br />

Problema: Encontrar y mostrar todas <strong>la</strong>s parejas <strong>de</strong> números<br />

amigos menores o iguales a uno dado.<br />

Ejemplo <strong>de</strong> Programa Estructurado<br />

Esqueleto <strong>de</strong>l Programa<br />

programa números_amigos<br />

variables<br />

natural : cota, num1, num2<br />

inicio programa<br />

cota ← leer ‘Introduce <strong>la</strong> cota: ’<br />

<strong>para</strong> num1 <strong>de</strong>s<strong>de</strong> 1 hasta cota-1 hacer<br />

<strong>para</strong> num2 <strong>de</strong>s<strong>de</strong> num1+1 hasta cota hacer<br />

si num1 y num2 son amigos entonces<br />

escribir num1, num2<br />

fin si<br />

fin <strong>para</strong><br />

fin <strong>para</strong><br />

fin programa<br />

3 / 21<br />

4 / 21


Ejemplo <strong>de</strong> Programa Estructurado<br />

Primer Refinamiento<br />

programa números_amigos<br />

variables<br />

natural : cota, num1, num2, suma1, suma2<br />

inicio programa<br />

cota ← leer ‘Introduce <strong>la</strong> cota: ’<br />

<strong>para</strong> num1 <strong>de</strong>s<strong>de</strong> 1 hasta cota-1 hacer<br />

<strong>para</strong> num2 <strong>de</strong>s<strong>de</strong> num1+1 hasta cota hacer<br />

suma1 ← suma <strong>de</strong> los divisores <strong>de</strong> num1<br />

suma2 ← suma <strong>de</strong> los divisores <strong>de</strong> num2<br />

si suma1 = num2 y suma2 = num1 entonces<br />

escribir num1, num2<br />

fin si<br />

fin <strong>para</strong><br />

fin <strong>para</strong><br />

fin programa<br />

Ejemplo <strong>de</strong> Programa Estructurado<br />

Segundo Refinamiento<br />

5 / 21<br />

Ejemplo <strong>de</strong> Programa Estructurado<br />

Segundo Refinamiento<br />

programa números_amigos<br />

variables<br />

natural : cota, num1, num2, suma1, suma2, número<br />

inicio programa<br />

cota ← leer ‘Introduce <strong>la</strong> cota: ’<br />

<strong>para</strong> num1 <strong>de</strong>s<strong>de</strong> 1 hasta cota-1 hacer<br />

<strong>para</strong> num2 <strong>de</strong>s<strong>de</strong> num1+1 hasta cota hacer<br />

suma1 ← 0<br />

<strong>para</strong> número <strong>de</strong>s<strong>de</strong> 1 hasta num1-1 hacer<br />

si número divi<strong>de</strong> a num1 entonces<br />

suma1 ← suma1 + número<br />

fin si<br />

fin <strong>para</strong><br />

Programación Modu<strong>la</strong>r<br />

6 / 21<br />

suma2 ← 0<br />

<strong>para</strong> número <strong>de</strong>s<strong>de</strong> 1 hasta num2-1 hacer<br />

si número divi<strong>de</strong> a num2 entonces<br />

suma2 ← suma2 + número<br />

fin si<br />

fin <strong>para</strong><br />

si suma1 = num2 y suma2 = num1 entonces<br />

escribir num1, num2<br />

fin si<br />

fin <strong>para</strong><br />

fin <strong>para</strong><br />

fin programa<br />

Resolución in<strong>de</strong>pendiente <strong>de</strong> los subproblemas resultantes <strong>de</strong> <strong>la</strong><br />

<strong>de</strong>scomposición <strong>de</strong> un problema.<br />

Completa y amplía el diseño <strong>de</strong>scen<strong>de</strong>nte como método <strong>de</strong><br />

resolución <strong>de</strong> problemas.<br />

Un problema será resuelto por un programa principal que<br />

transferirá el control a los distintos módulos o subprogramas,<br />

los cuales al terminar su tarea <strong>de</strong>volverán el control al<br />

programa principal.<br />

7 / 21<br />

8 / 21


Programación Modu<strong>la</strong>r<br />

Tipos <strong>de</strong> subprogramas<br />

Funciones<br />

Algunas ventajas significativas <strong>de</strong> <strong>la</strong> programación modu<strong>la</strong>r:<br />

◮ La in<strong>de</strong>pen<strong>de</strong>ncia <strong>de</strong> los módulos permite trabajar en ellos<br />

simultáneamente.<br />

◮ La modificación <strong>de</strong> un módulo no afecta a los <strong>de</strong>más.<br />

◮ Los módulos solo se escriben una vez, aunque se<br />

necesiten en distintas ocasiones.<br />

Una función toma uno o más valores, <strong>de</strong>nominados<br />

argumentos o parámetros formales, y <strong>de</strong>vuelve un resultado.<br />

Para invocar a una función se escribe su nombre seguido por<br />

los parámetros actuales —entre paréntesis y se<strong>para</strong>dos por<br />

comas— sobre los que aplicar<strong>la</strong>.<br />

Cada lenguaje <strong>de</strong> programación tiene sus propias funciones<br />

internas incorporadas. Si estas no permiten realizar el tipo <strong>de</strong><br />

cálculo <strong>de</strong>seado será necesario <strong>de</strong>c<strong>la</strong>rar una función externa.<br />

9 / 21<br />

10 / 21<br />

Tipos <strong>de</strong> Subprogramas<br />

Procedimientos<br />

Un procedimiento es un programa que realiza una tarea<br />

específica, pero que generalmente no <strong>de</strong>vuelve ningún<br />

resultado.<br />

La entrada <strong>de</strong> información se realiza a través <strong>de</strong> los<br />

parámetros. En caso necesario <strong>la</strong> salida <strong>de</strong> información<br />

también se realiza a través <strong>de</strong> los parámetros.<br />

Para invocar a un procedimiento se escribe l<strong>la</strong>mar a seguido<br />

<strong>de</strong>l nombre <strong>de</strong>l procedimiento y <strong>de</strong> los parámetros actuales<br />

—entre paréntesis y se<strong>para</strong>dos por comas— sobre los que<br />

aplicarlo.<br />

Paso <strong>de</strong> Parámetros<br />

Al invocar un procedimiento o una función se produce una<br />

correspon<strong>de</strong>ncia entre los parámetros formales y los<br />

parámetros actuales.<br />

◮ Correspon<strong>de</strong>ncia posicional: los parámetros formales y los<br />

actuales se emparejan según su posición, en <strong>la</strong> <strong>de</strong>finición<br />

<strong>de</strong>l procedimiento o función los primeros, y en <strong>la</strong> l<strong>la</strong>mada<br />

realizada los segundos.<br />

◮ Correspon<strong>de</strong>ncia por nombre: <strong>la</strong> correspon<strong>de</strong>ncia entre los<br />

parámetros formales y los actuales se indica<br />

explícitamente en <strong>la</strong> l<strong>la</strong>mada al procedimiento o función.<br />

11 / 21<br />

12 / 21


Paso <strong>de</strong> Parámetros<br />

Según el lenguaje <strong>de</strong> programación utilizado, existen tres<br />

métodos <strong>de</strong> transmisión <strong>de</strong> valores a los parámetros formales.<br />

◮ Paso por valor: los parámetros formales reciben una copia<br />

<strong>de</strong> los valores <strong>de</strong> los parámetros actuales.<br />

◮ Paso por valor resultado: los parámetros formales reciben<br />

una copia <strong>de</strong> los valores <strong>de</strong> los parámetros actuales y al<br />

finalizar <strong>la</strong> ejecución <strong>de</strong>l subprograma se realiza el proceso<br />

inverso.<br />

◮ Paso por referencia: los parámetros formales reciben <strong>la</strong>s<br />

direcciones <strong>de</strong> memoria que referencian a los valores <strong>de</strong><br />

los parámetros actuales.<br />

Variables Globales y Locales<br />

Variable global: el ámbito en que se conoce su valor es el<br />

programa completo.<br />

Variable local: el ámbito en que se conoce su valor es<br />

únicamente una parte <strong>de</strong>l programa.<br />

Todas <strong>la</strong>s variables usadas por un subprograma que no sean<br />

variables globales <strong>de</strong>ben <strong>de</strong>c<strong>la</strong>rarse como variables locales <strong>de</strong><br />

ese subprograma. Los parámetros <strong>de</strong>l subprograma también<br />

actúan como variables locales.<br />

Se pue<strong>de</strong> <strong>de</strong>c<strong>la</strong>rar una variable local con el mismo nombre que<br />

otra variable ya <strong>de</strong>c<strong>la</strong>rada. El valor asignado a <strong>la</strong> primera solo<br />

tendrá vigencia <strong>para</strong> <strong>la</strong>s expresiones incluidas <strong>de</strong>ntro <strong>de</strong> su<br />

ámbito.<br />

13 / 21<br />

14 / 21<br />

Dec<strong>la</strong>ración <strong>de</strong> funciones<br />

Dec<strong>la</strong>ración <strong>de</strong> procedimientos<br />

función <br />

()<br />

constantes<br />

<br />

variables<br />

<br />

inicio función<br />

.<br />

<strong>de</strong>volver <br />

fin función<br />

procedimiento <br />

()<br />

constantes<br />

<br />

variables<br />

<br />

inicio procedimiento<br />

.<br />

fin procedimiento<br />

15 / 21<br />

16 / 21


Ejemplo <strong>de</strong> Programa Modu<strong>la</strong>r<br />

programa números_amigos<br />

inicio programa<br />

procedimiento calcu<strong>la</strong>_pares ()<br />

variables<br />

natural : cota, num1, num2<br />

inicio procedimiento<br />

cota ← leer ‘Introduce <strong>la</strong> cota: ’<br />

<strong>para</strong> num1 <strong>de</strong>s<strong>de</strong> 1 hasta cota-1 hacer<br />

<strong>para</strong> num2 <strong>de</strong>s<strong>de</strong> num1+1 hasta cota hacer<br />

si son_amigos(num1, num2) entonces<br />

escribir num1, num2<br />

fin si<br />

fin <strong>para</strong><br />

fin <strong>para</strong><br />

fin procedimiento<br />

Ejemplo <strong>de</strong> Programa Modu<strong>la</strong>r<br />

lógico función son_amigos (natural : num1, num2)<br />

variables<br />

natural : suma1, suma2<br />

lógico : resultado<br />

inicio función<br />

suma1 ← suma_divisores(num1)<br />

suma2 ← suma_divisores(num2)<br />

resultado ← suma1 = num2 y suma2 = num1<br />

<strong>de</strong>volver resultado<br />

fin función<br />

17 / 21<br />

18 / 21<br />

Ejemplo <strong>de</strong> Programa Modu<strong>la</strong>r<br />

natural función suma_divisores (natural : num)<br />

variables<br />

natural : suma, número<br />

inicio función<br />

suma ← 0<br />

<strong>para</strong> número <strong>de</strong>s<strong>de</strong> 1 hasta num-1 hacer<br />

si número divi<strong>de</strong> a num entonces<br />

suma ← suma + número<br />

fin si<br />

fin <strong>para</strong><br />

<strong>de</strong>volver suma<br />

fin función<br />

fin programa<br />

Programas Recursivos<br />

Son aquellos que forman parte <strong>de</strong> sí mismos o intervienen en<br />

su propia <strong>de</strong>finición.<br />

Resultan útiles <strong>para</strong> trabajar con problemas o estructuras<br />

<strong>de</strong>finidos en modo recursivo.<br />

Todo programa recursivo pue<strong>de</strong> ser convertido en iterativo.<br />

19 / 21<br />

20 / 21


Ejemplo <strong>de</strong> Programa Recursivo<br />

La sucesión <strong>de</strong> Fibonacci se <strong>de</strong>fine por recursión como sigue:<br />

fib 0 = 0, fib 1 = 1<br />

fib n = fib n−1 + fib n−2 , <strong>para</strong> todo n > 1<br />

Función que calcu<strong>la</strong> un término especificado <strong>de</strong> <strong>la</strong> sucesión.<br />

natural función fib (natural : n)<br />

variables<br />

natural : término<br />

inicio función<br />

si n < 2 entonces<br />

término ← n<br />

si no entonces<br />

término ← fib(n-1) + fib(n-2)<br />

fin si<br />

<strong>de</strong>volver término<br />

fin función<br />

21 / 21

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!