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 ...
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