capÍtulo 1 resoluciÓn de problemascybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la...

20
INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 1 CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAS Resolver problemas no es trivial, pues es necesario comprender qué se quiere resolver, encontrar las herramientas adecuadas para resolver el problema, y luego implementar la solución con las herramientas disponibles. Pasos en la resolución de problemas

Upload: others

Post on 07-Jul-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 1

CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAS

Resolver problemas no es trivial, pues es necesario comprender qué se quiere resolver, encontrar las herramientas adecuadas para resolver el problema, y luego implementar la solución con las herramientas disponibles.

Pasos en la resolución de problemas

Page 2: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 2

Problemas, Datos, Variables

¿Qué es un Problema?

Un problema es una abstracción de la realidad para la cual nos interesa conocer una solución. Una solución es un procedimiento o método para establecer el mecanismo de transformación del mundo que nos lleve a satisfacer ciertos requerimientos.

Los problemas de los problemas

Page 3: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 3

¿Qué es un Dato?

El mundo está compuesto de objetos físicos y simbólicos. Los datos son objetos simbólicos que representan objetos físicos del mundo real.

¿Qué es una Variable?

Una variable es un objeto simbólico que no hace referencia explícita a un objeto físico. Las variables se usan para representar datos.

La relación entre datos y variables

¿Qué es un Modelo?

Toda estructura que se utiliza para dar razón y abstraer de la realidad a un conjunto de acciones o fenómenos que guardan entre sí ciertas relaciones.

El ejemplo más simple de un modelo es una variable, la que no tiene relación alguna mas que la de ella misma con su dato.

Modelos más complejos son los arreglos, registros, TDAs, archivos y combinaciones de éstos. Los lenguajes de programación normalmente proveen varias combinaciones (no todas) de modelos más complejos.

El diseño e implementación de un modelo son fundamentales para la solución de un problema computacional.

Page 4: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 4

Algoritmos

¿Qué es un Algoritmo?

Un algoritmo es un procedimiento detallado y preciso para resolver un problema en pasos (o etapas), cada uno de los cuales toma un tiempo finito.

Los algoritmos se especifican en términos de un conjunto de operaciones básicas que permiten manipular las variables del algoritmo y, en general, cambiar el mundo en que se desarrolla el problema. Algunas de estas operaciones permiten también controlar el flujo de ejecución del algoritmo. Llevando a cabo las operaciones que componen el algoritmo, según su estructura de control, obtendremos la solución para el problema en cuestión.

El flujo de las operaciones especifica la secuencia en que se llevan a cabo las actividades:

• Toma de decisiones

La secuencia se decide de acuerdo a ciertas condiciones que dependen de los datos del algoritmo.

• Iteración

Permite especificar la repetición de operaciones, también en forma controlada por condiciones que dependen de los datos.

Al describir un algoritmo es necesario ser lo más preciso posible, de modo que sea sencillo implementar el procedimiento especificado. En primera instancia, es necesario definir una serie de operaciones básicas con las cuales se hará la especificación.

Luego, a partir de las operaciones definidas, se procede a enumerar los pasos que componen el algoritmo. En esta etapa se puede emplear los componentes básicos de control de flujo (decisión e iteración).

La principal destreza que se debe desarrollar para escribir algoritmos consiste en poder abstraer un problema y conceptualizarlo de modo que se pueda expresar su solución en términos de las operaciones básicas que se definieron. Para esto nos apoyaremos en la descomposición en subproblemas más simples, las cuales también requieren de cierto grado de conceptualización.

Aún cuando muchos algoritmos resulten simples al final, el proceso para llegar a ellos puede ser muy complicado. Existen varios enfoques que se pueden seguir para elaborar un algoritmo a partir de la definición del problema:

• Buscar similitud con otros problemas

• Utilizar ejemplos conocidos

• Utilizar algoritmos genéricos conocidos

• Conceptualizar actividades

• Descomponer en subproblemas

La metodología presentada en este curso hace uso de los dos últimos, aunque en algunos casos recurriremos al resto como apoyo.

Page 5: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 5

¿Cómo se especifica o describe los algoritmos?

Para especificar un algoritmo puede utilizar el "lenguaje natural" y también el "pseudocódigo" (casi código).

El lenguaje natural debe utilizar una cantidad suficiente de palabras en frases cortas, pero con sentido completo como para que el algoritmo especificado quede claro.

El pseudocódigo suele ser muy utilizado cuando se está diseñando un algoritmo que resuelve algún problema computacional, abstrayendo varios detalles de la sintaxis rígida de algún código o lenguaje de programación, como es el caso del lenguaje C.

¿Existe un único algoritmo de solución?

Para cualquier problema, pueden existir varios algoritmos de solución, tantos como personas que quieran resolverlos. No existe un algoritmo "único" de solución para un problema dado. Ello de ninguna manera quiere decir que estos algoritmos distintos producen soluciones distintas. Aunque ellos sean distintos, todos ellos pueden ofrecer el mismo resultado de solución.

Inclusive un mismo algoritmo que quiere ser implementado mediante algún código de computadora puede ser implementado de distintas maneras, tantas como personas que lo implementen.

¿Qué es una metodología?

Aplicación coherente de un conjunto de operaciones ordenadas con que se pretende obtener un resultado.

Se puede decir que una metodología es como un algoritmo genérico.

Se aplicará entonces una metodología que empezando de un problema, llegue a la especificación de un algoritmo de solución:

Existen muchas metodologías para encontrar una solución a un problema. En este curso se adoptará la metodología descrita más adelante, para contar con un lenguaje común que pueda dar lugar a su entendimiento por todos aquellos que lo quieran analizar.

Page 6: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 6

Una especificación de un algoritmo de solución, puede presentar problemas: que el algoritmo resuelva más de lo que el problema pide (aunque esto por lo general no es perjudicial) o que el algoritmo no resuelva todo lo que el problema requiere.

Las soluciones también pueden tener problemas

Para resolver estos problemas es necesario entonces validar la solución y/o especificar limitaciones del algoritmo de solución. A veces esta tarea puede ser compleja, debido que para validar la solución y conocer sus limitaciones hay que ser exhaustivo con el análisis o seguimiento de la especificación del algoritmo, considerando todos los casos posibles.

Los casos posibles que generalmente no resuelven todas las partes del problema dado, son los casos extremos, como por ejemplo datos nulos si se trata de números, datos negativos si se trata de operaciones aritméticas con números positivos, o por ejemplo para la receta de cocina que se utilice "huevos" pasados en lugar de frescos, etc.

Tanto para el diseño de un algoritmo de solución a un problema dado, como para su validación se requiere experiencia. PARA TENER EXPERIENCIA ES NECESARIO TENER PRACTICA EN LA RESOLUCION DE PROBLEMAS. PARA TENER PRACTICA ES NECESARIO RESOLVER MUCHOS PROBLEMAS.

Page 7: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 7

Metodología para la Solución de Problemas

El proceso que permite obtener un algoritmo que soluciona un problema puede dividirse en las siguientes etapas:

1. Definición del problema (planteamiento original)

1.1. Conceptualización. Conceptualizar el mundo o contexto en que ocurre el problema. Cualquier suposición sobre el dominio del problema debe ser descrita aquí. Además, debe quedar claro cuál es la información que se conoce relativa al problema (entradas del algoritmo).

1.2. Objetivo. Determinar el objetivo que se quiere alcanzar, en forma cualitativa (descripción de lo que se desea) y cuantitativa (forma en que se medirá el logro alcanzado).

1.3. Elementos involucrados. Especificar los elementos activos (usuarios) y pasivos (recursos disponibles y/o modificables) que están involucrados en el problema.

2. Conceptualización de la solución

2.1. Descomposición. Dividir el problema en subproblemas hasta que cada subproblema forme una unidad lo suficientemente simple para ser descrita en forma concisa y utilizando únicamente operaciones elementales o referencias a otros subproblemas.

2.2. Tareas. A partir de la conceptualización lograda en (2.1), especificar las tareas que están involucradas en la resolución del problema. Cada tarea puede tener un conjunto de datos de entrada que le darán generalidad (parámetros). Asimismo, las tareas pueden retornar algunos datos como consecuencia de su ejecución (valores de retorno). Tanto los parámetros como los valores de retorno deben especificarse claramente, en la forma de variables de entrada/salida.

2.3. Variables. A partir de la conceptualización lograda en (2.1), determinar cuáles son los datos que se utilizan en la resolución del problema. Se deben especificar las variables (datos genéricos) que se emplearán para almacenar dichos datos. De esta forma, la solución del problema se podrá especificar en forma general, y no dependiente de datos particulares.

3. Especificación del algoritmo

Especificar la secuencia de actividades que conforman la solución del problema. Esta especificación debe ser autocontenida y debe estar dada en términos de las tareas y variables definidas en (2).

Dependiendo de la complejidad del algoritmo, cada subproblema podría tratarse separadamente empleando esta metodología. La funcionalidad de cada tarea (subalgoritmo) deberá especificarse en términos de las operaciones elementales disponibles en el contexto de solución del problema. Si la tarea es muy básica, la elección de un nombre apropiado evitará tener que hacer una descripción más detallada.

Page 8: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 8

4. Validación del algoritmo

4.1. Dominios. Especificar un conjunto de problemas tipo y sus soluciones, los cuales caracterizan el dominio del problema. Debe haber un problema para cada posible dominio.

4.2. Ejecución. Ejecutar el algoritmo obtenido en (3) para cada uno de los problemas que representan los distintos dominios, validando que se obtengan las soluciones especificadas, es decir, que se alcancen los objetivos propuestos en cada caso.

5. Limitaciones del algoritmo

Identificación de puntos débiles y escenarios en los cuales el algoritmo no funciona o tiene deficiencias (condiciones críticas).

Ejemplos:

Pie de limón

Cambio de neumático desinflado

Llamada telefónica

∼ Ejemplo: Simulando la preparación de un pie En este ejemplo se emplea la metodología de solución de problemas para definir e implementar los pasos necesarios para simular la solución a un problema simple: hornear y servir un pie de fruta.

1. Definición del problema

Conceptualización: El problema consiste en preparar un pie de alguna fruta específica, de acuerdo a cierta receta, y servirlo a cierta cantidad de comensales.

Se recibirá como entrada la receta para hornear, es decir, la cantidad de huevos, harina y mantequilla que se empleará, la fruta con que se cubrirá el pastel y la cantidad correspondiente, así como el tiempo que debe permanecer en el horno. Adicionalmente, se recibe el número de comensales que disfrutarán del producto final, para poder cortarlo y servirlo.

Objetivo: El objetivo es poder seguir la receta proporcionada de modo que podamos obtener como resultado un pie de fruta que podamos repartir a los comensales.

Elementos involucrados: El único elemento activo será la persona que llevará a cabo el proceso (el cocinero). Los elementos pasivos involucrados son la receta, sus ingredientes y cantidades (huevos, harina, mantequilla, fruta). En este caso, los comensales podrían considerarse como elementos pasivos, pues no participan de la solución (existen, pero simplemente esperan).

Page 9: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 9

2. Conceptualización de la solución

Descomposición: El proceso de hornear y servir el pie abarca varias etapas. En primera instancia se debe obtener la receta a emplear. Esto consiste en especificar la cantidad de huevos, mantequilla y harina, así como el tipo y la cantidad de fruta que se utilizará. El segundo paso consiste en preparar la base del pie, mezclando la cantidad especificada de huevos, harina y mantequilla. Luego, la base es horneada durante cierto tiempo (lo cual también es parte de la receta). El siguiente paso es preparar la fruta con la que se cubrirá la base. Finalmente, se procede a cortarlo y servirlo a todos los comensales.

Tareas: A continuación se presentan las tareas involucradas en la solución. Los parámetros de cada tarea se colocan entre paréntesis.

• mezclar_base(huevos, harina, mantequilla)

huevos, harina y mantequilla representan las cantidades apropiadas (en gramos) de cada ingrediente. Este proceso se encarga de mezclar los componentes para lograr la base del pie.

• hornear_base(tiempo_horno)

tiempo_horno representa la cantidad de minutos que deberá permanecer la base en el horno. Este proceso se encarga de hornear la base del pie durante el tiempo especificado en la receta.

• preparar_fruta(tipo_fruta, fruta)

tipo_fruta es el nombre de la fruta que se empleará para cubrir la base del pie, y fruta corresponde a la cantidad (en gramos) de dicha fruta que debe emplearse (según la receta). Este proceso prepara la cubierta del pie, a partir de la fruta elegida.

• cortar_servir(comensales, tipo_fruta)

tipo_fruta es la fruta con que se cubrió el pie y comensales corresponde con el número de invitados a disfrutar del pie. Este proceso se encarga de cortar el pie en tantos pedazos como comensales haya y lo sirve para que los invitados lo puedan comer. El tipo de fruta es necesario para que al servirlo a los comensales se les pueda indicar qué tipo de pie van a comer.

Variables: En el contexto de nuestro problema, será necesario representar como datos de entrada el tipo de fruta que se empleará, las cantidades de cada ingrediente de la receta (huevos, harina, mantequilla, fruta), el tiempo que debe permanecer el pie en el horno, y la cantidad de comensales que lo disfrutarán. Se emplearán nombres para las variables que ayuden a comprender su significado:

tipo_fruta, huevos, harina, mantequilla, fruta (cantidades en gramos) tiempo_horno, comensales

Page 10: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 10

3. Especificación del algoritmo

El algoritmo presentado a continuación emplea las operaciones (tareas) definidas anteriormente para resolver nuestro problema. En este caso no fue necesario emplear operaciones de control de flujo, pues el algoritmo se puede especificar en forma totalmente secuencial.

Algoritmo: 1. Obtener la receta (huevos, harina, mantequilla, tipo_fruta, fruta y

tiempo_horno) 2. Obtener la cantidad de comensales (comensales) 3. mezclar_base(huevos, harina, mantequilla) 4. hornear_base(tiempo_horno) 5. preparar_fruta(tipo_fruta, fruta) 6. Cortar_servir(comensales, tipo_fruta)

La implementación en C de este algoritmo resulta bastante simple. Basta con definir una función para cada una de las tareas involucradas. Esta función simulará el proceso que debe llevar a cabo la tarea. Las primeras dos líneas del algoritmo involucran entrada de datos por parte del usuario del programa (debe proporcionar los valores apropiados para las variables).

4. Validación del algoritmo

Dominios: Los posibles dominios que existen en el contexto de este problema se constituyen a partir de los distintos valores de entrada que pueden recibirse del usuario. Es decir, distintos tipos de fruta, distintas cantidades para cada ingrediente, distintos tiempos en el horno y distintas cantidades de comensales.

Validación: Debe ejecutarse el algoritmo para los dominios definidos, es decir, cambiando valores para cada dato de entrada, y verificando que se puede alcanzar el objetivo buscado.

NOTA: El código en C de este ejemplo está disponible en el sitio web del curso. La implementación en C de este ejemplo es una simulación de la preparación del pie. Algunas operaciones no hacen en realidad nada, sino que simplemente simulan la ocurrencia de acciones.

Page 11: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 11

∼ Ejemplo: Cambio de neumático desinflado Un auto queda en pana en la carretera al desinflársele un neumático. Para tratar este problema particular se aplicará la metodología para la solución de problemas presentada anteriormente.

1. Definición del problema

Conceptualización: El problema tiene lugar en una carretera, en donde un auto se ha quedado parado, pues uno de sus 4 neumáticos se ha desinflado. El auto cuenta con las herramientas necesarias para que el conductor pueda cambiar el neumático, así como también con un neumático de repuesto en buenas condiciones. El único dato de entrada con que se cuenta es la posición del neumático desinflado, es decir, en cuál de las cuatro ruedas ocurrió el percance.

Objetivo: Cualitativamente, el objetivo es cambiar el neumático desinflado por el de repuesto, de modo que el auto pueda andar. Cuantitativamente, el logro del objetivo puede medirse verificando que los 4 neumáticos estén inflados.

Elementos involucrados: Existe un único elemento activo que es el conductor del auto. Además, existen los siguientes elementos pasivos:

Maletero 4 Ruedas, una de las cuales tiene el neumático desinflado 4 Pernos que sujetan cada rueda Neumático de repuesto, en buenas condiciones, ubicado en maletero del auto Gata hidráulica en el maletero del auto Llave de cruz en el maletero del auto

2. Conceptualización de la solución

Descomposición: El problema global de cambiar el neumático puede descomponerse en las siguientes tareas simples:

Retirar y colocar cosas Aflojar y apretar pernos Subir y bajar el auto con la gata

Tareas: A partir de la división lograda en el punto anterior, puede definirse las siguientes tareas u operaciones elementales:

Retirar "algo" de un "lugar" Colocar "algo" en un "lugar" Aflojar "un determinado perno" Apretar "un determinado perno" Subir auto desde "una determinada posición" Bajar auto desde "una determinada posición"

Los términos resaltados en cursiva corresponden a variables de entrada (parámetros) que proporcionan generalidad a las operaciones. Por ejemplo, la primera operación puede emplearse para retirar el neumático de repuesto del maletero, pero también para retirar la llave de cruz del maletero y un perno de la rueda.

Una definición más formal involucra especificar claramente cuáles son los parámetros con los que trabaja cada operación. Así, la lista definitiva de operaciones será la

Page 12: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 12

siguiente:

• Retirar

Parámetros: Lo que se desea retirar y el lugar de dónde se retirará

• Colocar

Parámetros: Lo que se desea colocar y el lugar dónde se colocará

• Aflojar perno

Parámetros: La posición de la rueda, el número de perno que se desea aflojar, y la herramienta que se usará

• Apretar perno

Parámetros: La posición de la rueda, el número de perno que se desea apretar, y la herramienta que se usará

• Subir auto

Parámetros: La posición de la rueda en donde se desea subir el auto y la herramienta (gata) que se usará

• Bajar auto

Parámetros: La posición de la rueda en donde se desea bajar el auto y la herramienta (gata) que se usará

Variables: En el contexto del problema que se intenta resolver, será necesario representar como dato de entrada la posición de la rueda cuyo neumático está desinflado, pues podría ser cualquiera de los cuatro con que cuenta el auto. La variable que denotará este dato será N.

Por otra parte, también deben considerarse como datos los distintos elementos pasivos involucrados en el algoritmo, pues servirán de parámetros de entrada para las distintas tareas que componen la solución. Por esto, definiremos variables que representen los distintos elementos pasivos involucrados:

M: maletero G: gata hidráulica L: llave de cruz P: un perno (su número: 1, 2, 3, ó 4) D: neumático desinflado R: neumático de repuesto

3. Especificación del algoritmo

El algoritmo presentado a continuación emplea las operaciones (tareas) definidas anteriormente para resolver el problema de cambiar el neumático desinflado. Se resalta los argumentos de cada operación. La única operación elemental que se emplea para cambiar el flujo de control de las tareas es la iteración.

Page 13: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 13

Algoritmo:

Considere N como la posición del neumático desinflado (dato de entrada) 1. Retirar gata hidráulica G del maletero M 2. Retirar llave de cruz L del maletero M 3. Itere sobre cada perno P = 1,2,3,4

3.1. Aflojar con llave L, perno P en rueda N 4. Subir auto con gata hidráulica G en posición N 5. Itere sobre cada perno P = 1,2,3,4

5.1. Retirar perno P de rueda N 6. Retirar neumático D de rueda N 7. Retirar neumático R del maletero 8. Colocar neumático R en rueda N 9. Colocar neumático D en maletero M 10. Itere sobre cada perno P = 1,2,3,4

10.1. Colocar perno P en rueda N 11. Bajar auto con gata hidráulica G en posición N 12. Itere sobre cada perno P = 1,2,3,4 12.1. Apretar con llave L, perno P en rueda N 13. Colocar llave de cruz L en maletero 14. Colocar gata hidráulica G en maletero

4. Validación del algoritmo

Dominios: Los posibles dominios que existen en el contexto de este problema se constituyen a partir del neumático que se haya desinflado. Por ejemplo, un posible dominio será aquel en que el neumático desinflado es el de la rueda izquierda delantera.

Validación: Ejecutando el algoritmo para cualquiera de los cuatro neumáticos del auto puede verificarse que la parametrización de las operaciones elementales permite alcanzar el objetivo buscado.

Al final de la ejecución del algoritmo, para cualquier dominio (es decir, considerando cualquiera de los cuatro neumáticos), el auto contará con todos sus neumáticos inflados y por consiguiente podrá andar.

5. Limitaciones del algoritmo

El desarrollo del algoritmo se hizo para un auto que tuviera 4 pernos sujetando cada rueda. Sin embargo, puede modificarse para recibir este valor como un dato de entrada.

Por simplicidad se dejaron de lado algunas consideraciones, como por ejemplo, abrir y cerrar el maletero, transportar los neumáticos y las herramientas, etc. Además, la solución presentada se aplica únicamente a autos que cuenten con cuatro neumáticos.

Page 14: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 14

∼ Ejemplo: Llamada telefónica Se desea conceptualizar el problema de efectuar una llamada telefónica en un teléfono público que recibe monedas de $10, $50 y $100. El costo mínimo de la llamada es de $100 por 5 minutos. El proceso se inicia desde que se levanta el auricular y finaliza cuando se cuelga. Se aplicará la metodología para la solución de problemas presentada anteriormente.

1. Definición del problema

Conceptualización: El problema tiene lugar en cualquier teléfono público que acepta monedas de $10, $50 y $100, con un costo de llamada mínima de $100 por 5 minutos. Supondremos que el aparato funciona apropiadamente y que el usuario cuenta con suficientes monedas, de cualquier denominación, para completar su llamada. Los datos de entrada son: 1) el número de teléfono que se desea marcar, y 2) las monedas que lleva consigo la persona que hará la llamada.

Objetivo: Cualitativamente, el objetivo es que el usuario pueda completar su llamada. Cuantitativamente, el logro del objetivo puede verificarse si el tiempo de duración de la llamada del usuario es mayor que cero.

Elementos involucrados: Existe un único elemento activo que es el usuario que realiza la llamada. Además, existen los siguientes elementos pasivos:

Un teléfono público en buen estado, que funciona en la forma que se indicó. El teléfono tiene los siguientes componentes:

- Ranura para insertar monedas - Auricular - 10 teclas numéricas (una con cada dígito) - Ranura para devolución de monedas

Un conjunto de monedas de $10, que puede ser vacío Un conjunto de monedas de $50, que puede ser vacío Un conjunto de monedas de $100, que puede ser vacío

2. Conceptualización de la solución

Descomposición: El problema global de efectuar la llamada telefónica puede descomponerse en las siguientes tareas simples:

Manipular el auricular (levantarlo y colgarlo) Manipular las monedas (recolectarlas, ponerlas en la ranura, recuperarlas cuando son devueltas) Escuchar en el auricular (por el tono de marcar, de llamada en proceso, de conexión aceptada, o de ocupado) Marcar un número en el teclado del teléfono Hablar

Page 15: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 15

Tareas: A partir de la división lograda en el punto anterior, pueden definirse las siguientes tareas u operaciones elementales. Los argumentos que proporcionan generalidad a las tareas se indican claramente.

• Levantar auricular

Parámetros: el teléfono desde donde se está llamando (para que podamos hacer llamadas desde cualquier teléfono)

• Colgar auricular

Parámetros: el teléfono desde donde se está llamando

• Recolectar monedas

Parámetros: el monto que se desea recolectar y el conjunto de monedas del cual se sacan. Valor de retorno: Conjunto de monedas seleccionadas. Esta operación recolecta desde un conjunto de monedas el monto que se le indicó, en monedas de $10, $50 y $100. El conjunto de monedas seleccionadas es devuelto como resultado. Variables locales:

monto recolectado: almacena el valor de las monedas que se han seleccionado hasta el momento.

Algoritmo:

1. Al comienzo el monto recolectado es $0. 2. Iterar hasta que el monto recolectado sea el indicado

2.1 Seleccionar del bolsillo del usuario una moneda (una de las de mayor valor que tenga) y pasarla al conjunto de monedas seleccionadas 2.2 Sumar el monto de la nueva moneda con el monto recolectado

3. Devolver el conjunto de monedas seleccionadas.

• Depositar monedas

Parámetros: el teléfono desde donde se está llamando y las monedas que se desean depositar

• Recuperar monedas

Parámetros: el teléfono desde donde se está llamando

• Escuchar auricular

Parámetros: el teléfono desde donde se está llamando Valor de Retorno: lo que se está escuchando en el auricular.

Page 16: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 16

Esta operación devuelve lo que se está escuchando en el auricular en ese momento. Las posibilidades son: TONO, CONEXION EXITOSA y OCUPADO, DESCONEXION (este tono se escucha cuando se ha esperado por un tiempo determinado y nadie contesta el teléfono marcado).

• Marcar

Parámetros: el teléfono desde donde se está llamando y el número que se desea marcar. Esta operación marca en el teclado numérico cada uno los dígitos del número al que se desea llamar. Variables locales:

D: almacena los dígitos del número al que se desea hablar.

Algoritmo:

1. Iterar sobre cada una de los dígitos D del número que se desea marcar

1.1 Presionar en el teclado numérico el número correspondiente al dígito D

• Hablar

Parámetros: el teléfono desde donde se está llamando Esta operación permite que el usuario hable con la persona a la que llamó. Por cada segundo hablado se incrementa en 1 el tiempo de la llamada. Cuando se ha cumplido 5 minutos (300 seg.) se debe introducir $100 para seguir hablando. Variables propias

tiempo: almacena el tiempo que se ha hablado hasta el momento. MB: monedas en el bolsillo seleccionadas. Corresponde a las monedas que el usuario posee. MS: monedas seleccionadas. Corresponde a las monedas que el usuario utilizará para efectuar la llamada.

Algoritmo:

1. Al comienzo tiempo es 0 seg. 2. Iterar mientras se desee seguir hablando

2.1 Hablar un segundo. 2.2 Incrementar en 1 la variable tiempo. 2.3 Si tiempo tiene el valor 300 seg.

2.3.1 Recolectar monedas para una llamada de $100 desde conjunto de monedas MB y almacenarlas en el conjunto de monedas MS. 2.3.2 Depositar monedas del conjunto MS en el teléfono. 2.3.3 Devolver tiempo a 0 seg.

Page 17: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 17

Variables: En el contexto del problema que se intenta resolver, será necesario representar como dato el número de teléfono que se desea marcar. La variable que lo denotará será Num. Además, es necesario representar las monedas que lleva el usuario en el bolsillo. Esto se hará con la variable MB.

Por otra parte, también deben considerarse como datos los distintos elementos pasivos involucrados en el algoritmo, pues servirán de parámetros de entrada para las distintas tareas que componen la solución. Por esto, definiremos variables que representen los distintos elementos pasivos involucrados:

T: teléfono desde el cual se está llamando C: costo de la llamada, en este caso siempre valdrá $100, por lo que podría

manejarse como una constante. MS: monedas seleccionadas. Corresponde a las monedas que el usuario utilizará

para efectuar la llamada. tono: Corresponde al tono escuchado en el teléfono. tiempo: Corresponde al tiempo que el usuario ha hablado con al teléfono que

marcó. intentos: Corresponde al número de intentos que ha hecho el usuario.

3. Especificación del algoritmo

El algoritmo presentado a continuación emplea las tareas definidas anteriormente para resolver el problema de hacer una llamada telefónica. Se subraya los parámetros de las operaciones y los valores de retorno de éstas. En este caso, para controlar el flujo de las operaciones se emplea iteración y decisión.

Además, con el objetivo de que el usuario no se quede indefinidamente intentando hacer la llamada, en caso de ocupado o que no contesten, se harán únicamente 3 intentos y si no se logra la llamada se abandonará el proceso y el problema no podrá ser resuelto.

Page 18: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 18

Algoritmo:

Considere Num como el número que el usuario desea marcar, y MB como las monedas con que cuenta para hacer la llamada.

Inicialmente la variable intentos valdrá 0. Iterar los siguientes pasos mientras intentos sea menor que 3.

1. Recolectar monedas para una llamada de $100 desde el conjunto de monedas MB y almacenarlas en el conjunto de monedas MS. 2. Levantar auricular del teléfono T. 3. Depositar en teléfono T el conjunto de monedas MS. 4. Escuchar auricular del teléfono T hasta que devuelva TONO. 5. Marcar en teléfono T el número Num. 6. Escuchar auricular del teléfono T y almacenar el valor en tono. 7. Mientras tono no sea CONEXION EXITOSA o DESCONEXION.

7.1 Escuchar auricular del teléfono T y almacenar el valor en tono. 8. Si tono tiene el valor CONEXION EXITOSA entonces 8.1 Hablar en teléfono T. 8.2 Colgar auricular del teléfono T. 8.3 Terminar proceso de llamada. 9. Si tono tiene el valor DESCONEXION u OCUPADO entonces 9.1 Colgar auricular del teléfono T. 9.2 Recuperar monedas del teléfono T. 9.3 Incrementar variable intentos.

4. Validación del algoritmo

Dominios: Los posibles dominios que será necesario analizar se constituyen a partir de las siguientes caracterizaciones:

• Las distintas combinaciones de monedas que pueden formarse para llevar a cabo la llamada.

• El teléfono al que se llama está ocupado.

• No contestan en el teléfono al que se llama.

• Al hacer la llamada se obtiene una respuesta satisfactoria.

• Llamadas de menos de 5 minutos y llamadas de más de 5 minutos.

• Distinto número de intentos al hacer la llamada (1, 2, ó 3).

Validación: La validación debe llevarse a cabo tomando en consideración los dominios definidos en el punto anterior. Para cada uno de ellos debe probarse que el algoritmo es correcto, es decir, que funciona de acuerdo a las especificaciones originales.

Page 19: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 19

Árboles de Decisión

Los árboles de decisión son una herramienta gráfica muy útil para representar algoritmos en los que están involucradas una gran cantidad de decisiones a lo largo de su ejecución.

El objetivo es ilustrar la forma en que el algoritmo va evolucionando conforme se van tomando decisiones, normalmente sobre la base de información suministrada por el usuario. Cada punto de decisión se representa con una caja rectangular, en la cual se describe brevemente los aspectos a considerar para tomar dicha decisión.

Una vez que se conocen los criterios para tomar la decisión en uno de estos puntos, se señala con flechas las distintas posibilidades hacia donde evolucionaría el algoritmo, llevando el desarrollo de la ejecución hacia otro punto de decisión. Para identificar las posibles opciones, se etiquetan las flechas.

Las posibilidades pueden ser múltiples, produciéndose varias bifurcaciones en cada punto de decisión, o simplemente dos, en cuyo caso se obtendría un árbol binario. Este es el caso del ejemplo que se muestra a continuación.

Al llegar al último nivel, es decir, cuando ya no hay decisiones que tomar, se ha obtenido una solución y el algoritmo ha concluido. A estos nodos dentro del árbol se les conoce como hojas, o también como nodos terminales.

Page 20: CAPÍTULO 1 RESOLUCIÓN DE PROBLEMAScybernetsia.com.mx/cursos/programacion/capitulo1.pdf · que la de ella misma con su dato. Modelos más complejos son los arreglos, registros, TDAs,

INTRODUCCIÓN A LA PROGRAMACIÓN - IIC1102 Página: 20

∼ Ejemplo: Árbol de Decisión: ¿Qué hago el sábado por la noche?

Para ilustrar el uso de los árboles de decisión, se presenta un árbol que guía a un usuario a tomar una decisión sobre qué hacer el sábado por la noche. La profundización en el árbol se lleva a cabo de acuerdo a las respuestas que va dando el usuario a las interrogantes que se le plantean. Cuando se llega a un nodo terminal en el árbol (hoja), el usuario recibe una recomendación sustentada en el desarrollo de la interacción.