Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


programación estructurada, Apuntes de Informática

introducción a la programación y sus objetivos

Tipo: Apuntes

2020/2021

Subido el 20/03/2021

wolex-wolex
wolex-wolex 🇲🇽

5

(2)

7 documentos

1 / 24

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Curso Ingreso 2013 Carrera Ingeniería en Computación - Facultad de Informática Facultad de Ingeniería
U. N. L. P.
Capítulo 6
Programación Estructurada
Objetivo
Este capítulo introduce una metodología que permitirá facilitar la resolución de problemas.
La propuesta radica en descomponer las tareas a realizar en subtareas s sencillas de
manera de no tener que escribir un programa como un todo.
Los problemas del mundo real, en general, resultan ser complejos y extensos. Si se pretende
seguir con la forma de trabajo hasta aquí utilizada, se verá que resulta difícil cubrir todos los
aspectos de la solución.
Por ejemplo, supongamos que se pide que el robot recorra todas las avenidas de la ciudad
juntando flores y papeles e informe la cantidad de flores por avenida y el total de papeles
durante todo el recorrido, seguramente nos resultará más natural y sencillo pensar en
términos de tareas. Por ejemplo, recorrer una avenida contando flores y papeles, informar
cantidad de flores de la avenida, posicionarse en la avenida siguiente, poner la cantidad de
flores en cero, y al finalizar el recorrido informar la cantidad de papeles.
Esta forma de trabajo es lo que se formalizará a partir de este capítulo y se presentarán sus
beneficios.
Temas a tratar
Descomposición de problemas en partes
Programación modular
Conclusiones
Ejercitación
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18

Vista previa parcial del texto

¡Descarga programación estructurada y más Apuntes en PDF de Informática solo en Docsity!

Curso Ingreso 2013– Carrera Ingeniería en Computación - Facultad de Informática – Facultad de Ingeniería

Capítulo 6

Programación Estructurada

Objetivo

Este capítulo introduce una metodología que permitirá facilitar la resolución de problemas. La propuesta radica en descomponer las tareas a realizar en subtareas más sencillas de manera de no tener que escribir un programa como un todo.

Los problemas del mundo real, en general, resultan ser complejos y extensos. Si se pretende seguir con la forma de trabajo hasta aquí utilizada, se verá que resulta difícil cubrir todos los aspectos de la solución.

Por ejemplo, supongamos que se pide que el robot recorra todas las avenidas de la ciudad juntando flores y papeles e informe la cantidad de flores por avenida y el total de papeles durante todo el recorrido, seguramente nos resultará más natural y sencillo pensar en términos de tareas. Por ejemplo, recorrer una avenida contando flores y papeles, informar cantidad de flores de la avenida, posicionarse en la avenida siguiente, poner la cantidad de flores en cero, y al finalizar el recorrido informar la cantidad de papeles.

Esta forma de trabajo es lo que se formalizará a partir de este capítulo y se presentarán sus beneficios.

Temas a tratar

 Descomposición de problemas en partes

 Programación modular

 Conclusiones

 Ejercitación

Introducción a la Informática

6.1 Descomposición de problemas en partes

Una de las herramientas más útiles en la resolución de problemas con computadora es la descomposición de los problemas a resolver en subproblemas más simples. Esta descomposición, que se basa en el paradigma “ Divide y Vencerás ", persigue un objetivo: cada problema es dividido en un número de subproblemas más pequeños, cada uno de los cuales a su vez, puede dividirse en un conjunto de subproblemas más pequeños aún, y así siguiendo. Cada uno de estos subproblemas debiera resultar entonces más simple de resolver. Una metodología de resolución con estas características se conoce como diseño Top - Down.

La figura 6.1 muestra la representación en forma de árbol de una descomposición Top-Down.

Figura 6.1: Diseño Top-Down

El nivel de descomposición al que se llega depende de los conocimientos de quien va a implementar la solución (obviamente, el nivel de detalle al que puede arribar un experto no es el mismo que al que llegará un novato).

Es decir, que con esta metodología, resolver el problema original se reduce a resolver una serie de problemas más simples o subproblemas. En cada paso del proceso de resolución, cada subproblema es refinado hasta llegar a un punto en que está compuesto de acciones tan simples que ya no tiene sentido seguir refinando.

Cuando se realiza esta descomposición debe tenerse en cuenta que los subproblemas que se encuentran a un mismo nivel de detalle pueden resolverse independientemente de los demás y que las soluciones de estos subproblemas deben combinarse para resolver el problema original

De la figura 6.1 podemos inducir que la resolución de los subproblemas C.1, C.2 y C. implica resolver el problema C. A su vez la resolución de los subproblemas A, B, C y D permitirán obtener la resolución del problema original. Es importante destacar que los

Introducción a la Informática

módulo que iguala la cantidad de flores y de papeles haciendo que el robot se lleve lo que sobra. El programador B será el encargado de usar este módulo en la resolución de este problema.

Es importante notar que al programador B no le interesa cómo hizo el programador A para igualar la cantidad de elementos de la esquina. Por su parte, el programador A desconoce como se utilizará el módulo que está implementando. Esto hace que ambos programadores trabajen con subproblemas más simples que el problema original. El programador A sólo se dedica al procesamiento de una esquina y el programador B sólo se preocupa porque el robot recorra todas las esquinas de la ciudad, dando por hecho el procesamiento de cada esquina.

- Modificación de los módulos Cada módulo tiene una tarea específica que debe llevar a cabo. En su interior sólo se definen acciones relacionadas con este fin. Por tal motivo, la modificación interna de un módulo no afectará al resto.

Volviendo al ejemplo anterior, suponga que debe modificarse el procesamiento de cada esquina de manera que el robot iguale la cantidad de elementos intentando depositar primero (igualará hacia el número superior) y si no tiene, recién entonces se llevará lo que sobra. Al tener el comportamiento de la esquina encerrado en un módulo, bastará con realizar allí las modificaciones para que todos los programas que lo utilicen se vean actualizados SIN necesidad de cambiar nada.

  • Reusabilidad de código El desarrollo de un módulo es independiente del problema original que se desea resolver. Por ejemplo, podría definirse un módulo que permita al robot girar a la izquierda. Cuando esté implementado, podrá ser aplicado en múltiples recorridos. El concepto de reusabilidad hace hincapié en la ventaja de utilizar cada módulo directamente sin necesidad de volver a pensarlo nuevamente. No importa cómo hace para quedar posicionado hacia la izquierda, lo que importa es que el módulo cumple con la función especificada. En otras palabras, para poder utilizar un módulo no interesa saber cómo está implementado internamente sino que alcanza con saber qué es lo que hace. Obviamente el hacedor o implementador del módulo deberá ocuparse de que ese módulo cumpla la función de la mejor manera posible. Es por ello que los que luego lo utilizarán pueden desentenderse del cómo lo hace y concentrarse en qué hace - Mantenimiento del código Una vez que el programa es puesto en marcha resulta común que aparezcan errores de diseño, ya sea porque no se interpretaron correctamente los requerimientos del usuario o porque han cambiado las especificaciones.

Cuando se desea realizar modificaciones, el uso de módulos es muy beneficioso ya que cada tarea se encuentra concentrada en un lugar del programa y basta con cambiar esta parte para llevar a cabo la actualización. Es más fácil encontrar dentro del programa, el lugar dónde deben efectuarse las modificaciones.

Programación estructurada

Por ejemplo, inicialmente el módulo encargado de hacer girar al robot a la izquierda podría utilizar siete giros a derecha pero luego de verlo funcionar, se ve la conveniencia de realizar solo tres giros. Resulta claro ver que hay que ir al módulo que hace girar al robot y efectuar los cambios allí. Si no se utilizara un módulo con estas características, seguramente habría varios lugares dentro del programa donde habría que hacer modificaciones, aumentando así la posibilidad de error.

En general, en las soluciones modularizadas, un programa es un módulo en sí mismo denominado programa principal que controla todo lo que sucede y es el encargado de transferir el control a los submódulos de modo que ellos puedan ejecutar sus funciones y resolver el problema. Cada uno de los submódulos al finalizar su tarea, devuelve el control al módulo que lo llamó. Un módulo puede transferir temporalmente el control a otro módulo; en cuyo caso, el módulo llamado devolverá el control al módulo que lo llamó, al finalizar su tarea.

A continuación se presenta la sintaxis a utilizar para la definición de módulos en el Visual Da Vinci: proceso nombre del módulo comenzar { acciones a realizar dentro del módulo } fin

El esquema general de un programa que utilice módulos y variables es el siguiente:

programa nombre del programa procesos {indicar aquí TODOS los procesos a utilizar} proceso nombre del proceso comenzar { acciones a realizar dentro del proceso } fin variables { declarar aquí las variables del programa } comenzar { acciones del programa principal } fin

Ejemplo 6.1 : Se desea programar al robot para que recoja todas las flores de la esquina (1,1) y de la esquina (1,2).

Programación estructurada

El programa principal sería de la siguiente forma:

programa principal Realizar una avenida {Juntar todas las flores de la esquina} {Juntar todos los papeles de la esquina} {Avanzar a la próxima esquina}

El programa quedaría entonces de la siguiente manera:

programa Cap6Ejemplo6. procesos proceso JuntarFlores comenzar mientras HayFlorEnLaEsquina tomarFlor fin proceso JuntarPapeles comenzar mientras HayPapelEnLaEsquina tomarPapel fin

comenzar iniciar repetir 99 JuntarFlores JuntarPapeles mover {Falta juntar las flores y papeles de la última esquina} JuntarFlores JuntarPapeles fin

Ejemplo 6.3 : Se desea programar al robot para que recorra las primeras 10 avenidas juntando todas las flores y los papeles que encuentre.

Introducción a la Informática

Figura 6.3: Diseño Top-Down del ejemplo 6.

Solución 1 Solución 2 programa Cap 6 Ejemplo 6. 3. 1 procesos proceso JuntarFlores comenzar mientras HayFlorEnLaEsquina tomarFlor fin proceso JuntarPapeles comenzar mientras HayPapelEnLaEsquina tomarPapel fin

comenzar iniciar repetir 10 repetir 99 JuntarFlores JuntarPapeles mover {última esquina} JuntarFlores JuntarPapeles Pos (PosAv+1,1) fin

programa Cap 6 Ejemplo 6 .3. 2 procesos proceso JuntarFlores comenzar mientras HayFlorEnLaEsquina tomarFlor fin proceso JuntarPapeles comenzar mientras HayPapelEnLaEsquina tomarPapel fin

proceso Avenida comenzar repetir 99 JuntarFlores JuntarPapeles mover {última esquina} JuntarFlores JuntarPapeles fin comenzar iniciar repetir 10 Avenida Pos (PosAv+1,1) fin

Introducción a la Informática

Submódulo Recorrer la avenida impar juntando papeles {para cada esquina de la avenida impar} { recoger todos los papeles de la esquina} { avanzar una cuadra sobre la avenida impar}

Submódulo Recorrer la avenida par juntando flores {para cada esquina de la avenida par} {recoger todas las flores de la esquina} {avanzar una cuadra sobre la avenida par}

Figura 6.4: Diseño Top-Down del Ejemplo 6.

La representación gráfica se muestra en la figura 6.4. Puede verse que a nivel de módulo se considera como elemento de trabajo a la avenida mientras que a nivel de submódulo se hace sobre las esquinas de cada avenida.

Recordemos que la descomposición Top-Down parte del problema general descomponiéndolo en tareas cada vez más específicas y el concentrarse en una tarea en particular es más simple que resolver el problema completo. En el ejemplo, es más simple resolver una única avenida par que intentar resolver las 26 avenidas pares en forma conjunta. Lo mismo ocurre con las impares.

En la resolución de este problema pueden utilizarse los procesos JuntarFlores y JuntarPapeles definidos anteriormente. Además se necesitarán algunos otros módulos: DejarPapeles, DejarFlores, RealizarAvenidaImpar y RealizarAvenidaPar.

A continuación se presenta el programa completo que resuelve el ejemplo 6.4.

Programación estructurada

programa Cap6Ejemplo procesos proceso DejarPapeles comenzar mientras HayPapelEnLaBolsa depositarPapel fin proceso DejarFlores comenzar mientras HayFlorEnLaBolsa depositarFlor fin proceso JuntarFlores comenzar mientras HayFlorEnLaEsquina tomarFlor fin proceso JuntarPapeles comenzar mientras HayPapelEnLaEsquina tomarPapel fin proceso RealizarAvenidaPar comenzar repetir 99 JuntarPapeles mover DejarPapeles fin proceso RealizarAvenidaImpar comenzar repetir 99 JuntarFlores mover DejarFlores fin comenzar repetir 99 JuntarFlores JuntarPapeles mover {última esquina} JuntarFlores JuntarPapeles fin

Programación estructurada

módulos, para hallar la solución, es una tarea posterior. Por este motivo, tampoco se repiten los módulos dentro de la descomposición planteada.

Todas las tareas indicadas en la descomposición anterior son lo suficientemente simples como para ser implementadas directamente. Una solución al problema podría ser la siguiente:

programa Cap6Ejemplo6. variables vacias : numero comenzar iniciar derecha vacias := 0 repetir 4 {Analizar el vértice y registrar si esta vacío} si ~ HayFlorEnLaEsquina & ~HayPapelEnLaEsquina vacias := vacias + 1 mover {Girar a la izquierda} repetir 3 derecha Informar (vacias) fin

Sin embargo, sería importante contar con un proceso que permitiera indicar al robot girar izquierda con la misma facilidad con que se indica que gire a derecha. Esto haría más legible los programas ya que el programa anterior podría escribirse de la siguiente forma:

programa Cap6Ejemplo6. procesos {Inserte aquí la definición del proceso izquierda} variables vacias : numero comenzar iniciar derecha vacias := 0 repetir 4 {Analizar el vértice y registrar si está vacío} si ~HayFlorEnLaEsquina & ~HayPapelEnLaEsquina vacias := vacias + 1 mover izquierda Informar (vacias) fin

Introducción a la Informática

 Queda como ejercicio para el lector la definición del proceso izquierda.  Una vez que haya incorporado a la solución anterior el proceso izquierda, indique la cantidad de veces que el robot gira a la derecha para completar el recorrido.

Ejemplo 6.6 : Dados los recorridos de la figura 6.6 ¿Cuál es el módulo que sería conveniente tener definido?

Figura 6.6: Recorridos

Como podemos observar todos los cuadrados tienen lado 2, entonces convendría tener definido un módulo que permita realizar un cuadrado de lado 2 ya que puede utilizarse en los cuatro recorridos. Como muestra la figura 6.6 cada recorrido consiste en realizar varios cuadrados de lado 2 con el robot posicionado en lugares diferentes.

El módulo a utilizar puede escribirse de la siguiente forma:

proceso cuadrado{encabezado del proceso} comenzar repetir 4 {el cuadrado tiene 4 lados} repetir 2 mover derecha fin

En este momento puede apreciarse una de las principales ventajas de la modularización. Esta implementación del proceso cuadrado es independiente del recorrido en el cual será utilizado. Es más, este proceso puede ser verificado de manera totalmente independiente de la aplicación final.

Introducción a la Informática

Una de las diferencias entre estas soluciones es que el programa RecorridoA-version utiliza solo la secuencia mientras que RecorridoA version2 utiliza la estructura de control repetir.

En ambos casos aparecen tres invocaciones al proceso cuadrado con el robot ubicado en una esquina distinta.

El módulo Cuadrado tiene las siguientes características:

  1. El cuadrado tiene como vértice inferior izquierdo la esquina donde el robot esta posicionado al momento de la invocación.
  2. Una vez terminado el cuadrado, el robot vuelve a quedar parado en la misma esquina y orientado en el mismo sentido que cuando se comenzó la ejecución del módulo.

Justifique las siguientes afirmaciones:  Para que el programa RecorridoA-version1 funcione correctamente sólo es preciso conocer la primera de estas características.  En cambio, para que el programa RecorridoA-version2 funcione correctamente se requieren las dos.

A continuación se presentan dos soluciones para el recorrido de la figura 6.6 b), una de ellas utiliza el modulo cuadrado y la otra no.

programa RecorridoB version procesos comenzar { proceso cuadrado} iniciar repetir 3 cuadrado Pos(PosAv+1, PosCa+2) fin

programa RecorridoB version comenzar iniciar repetir 3 {aquí comienza el cuadrado} repetir 4 mover mover derecha Pos(PosAv+1,PosCa+2) fin

El programa RecorridoB version1 utiliza el proceso que realiza el cuadrado de lado 2, mientras que el programa RecorridoB version2 ha sido implementado igual que los ejercicios de los capítulos anteriores, es decir, sin utilizar ningún proceso.

Estos dos programas muestran algunos aspectos importantes:

  1. El uso de la modularización no es obligatorio. En los capítulos anteriores se han resuelto problemas similares al del recorrido b) sin utilizar procesos. La metodología

Programación estructurada

Top-Down no pretende afirmar que aquellas soluciones fueron incorrectas. Sólo muestra una forma alternativa que debería facilitar el diseño y desarrollo de los programas.

  1. Si se presta atención al programa RecorridoB version1, puede verse que su implemen- tación sólo se preocupa por posicionar al robot para formar el recorrido pedido. Mientras tanto, el programa RecorridoB version2 debe resolver ambos problemas: posicionar al robot y hacer el cuadrado.
  2. Al proceso RecorridoB version1 no le preocupa cómo se hace el cuadrado. Da lo mismo que lo haga girando en el sentido de las agujas del reloj o girando en sentido contrario. En cambio el otro programa debe indicar claramente cómo hacer todo el recorrido.
  3. Si en el futuro el robot contara con nuevas habilidades que le permitieran hacer el cuadrado de forma más eficiente (por ejemplo, algún día podría aprender a correr) los programas que utilizan el módulo cuadrado sólo tendrán que hacer referencia a la nueva implementación. Mientras tanto, los programas que hayan implementado explícitamente, en su interior, el recorrido para hacer el cuadrado de lado 2 deberán ser modificados uno por uno.

Quedan a cargo del lector las implementaciones de los programas que permitan al robot realizar los recorridos c y d.

Ejemplo 6.7 : Programe al robot para realizar el recorrido de la figura 6.7. Como puede apreciarse en el dibujo, el problema consiste en programar al robot para que de la vuelta a cada una de las manzanas indicadas. Como se explicó anteriormente, el uso de la metodología Top-Down no es obligatorio pero, si se opta por no utilizarla, habrá que enfrentar la solución del problema como un todo y el recorrido a realizar ya no es tan simple.

Figura 6.7: Recorrido del Ejemplo 6.

Programación estructurada

Como puede verse en el código anterior, el proceso HacerTorre realiza los cinco cuadrados a partir de la posición donde el robot se encuentra parado. Cada cuadrado de lado 1 tendrá su esquina inferior izquierda apoyada sobre la misma avenida. Notemos que para usar el proceso HacerCuadrado sólo importa saber que se realiza tomando como esquina inferior izquierda del cuadrado de lado 1, la esquina donde el robot está parado al momento de la invocación. A continuación se muestra el programa implementado en Visual Da Vinci:

programa Cap6Ejemplo6. procesos proceso HacerCuadrado comenzar repetir 4 mover derecha fin proceso HacerTorre comenzar repetir 5 HacerCuadrado (3) Pos(PosAv, PosCa+2) fin comenzar iniciar (1) repetir 5 HacerTorre (2) Pos(PosAv+2,1) fin

Es importante destacar que la ejecución del algoritmo comienza en el punto indicado con el número (1). Cuando el control llega a la invocación del proceso HacerTorre, indicada por (2), el algoritmo continúa ejecutándose en dicho proceso. Cuando llega al punto (3), es decir la invocación de HacerCuadrado , se suspende la ejecución del proceso HacerTorre y se realiza la primera vuelta a la manzana a partir de (1,1). Luego retorna a la instrucción siguiente de (3), posicionándose en la esquina (1,3), listo para hacer el próximo cuadrado. Esto se repite cinco veces. Una vez terminada la torre, el robot queda parado en (1,11). En ese momento el proceso HacerTorre termina y retorna a la instrucción siguiente de (2), posicionándose en la próxima avenida impar, listo para comenzar la segunda torre. Esto se repite cuatro veces más y el recorrido finaliza.

 ¿Dónde queda parado el robot al final del recorrido?

Ejemplo 6.8 : Escriba el proceso Evaluar para que el robot recoja todos los papeles y las flores de la esquina donde se encuentra y deje una flor en caso de haber más flores que papeles; un papel, si hay más papeles que flores ó uno de cada uno en caso contrario.

Introducción a la Informática

Los pasos a seguir para implementar este proceso son los siguientes:

proceso Evaluar {contar la cantidad de flores} { contar la cantidad de papeles} si {hay más flores que papeles} {depositar una flor (si es que hay en la bolsa)} sino si {la cantidad de flores y papeles es la misma } {depositar uno de cada uno (si es que hay en la bolsa)} sino {depositar una flor (si es que hay en la bolsa)}

La implementación del proceso Evaluar en Visual Da Vinci será:

proceso Evaluar variables CantF: numero CantP: numero comenzar {cuenta las flores} CantF := 0 mientras HayFlorEnLaEsquina tomarFlor CantF := CantF + 1 {cuenta los papeles} CantP := 0 mientras HayPapelEnLaEsquina tomarPapel CantP := CantP + 1 {decide que depositar} si CantF > CantP si HayFlorEnLaBolsa depositarFlor sino si cantF = cantP si HayFlorEnLaBolsa & HayPapelEnLaBolsa depositarPapel depositarFlor sino si HayPapelEnLaBolsa depositarPapel fin

Como se puede observar en el ejemplo planteado, el módulo Evaluar utiliza dos variables propias para representar la cantidad de flores y papeles que hay en una esquina de la ciudad.