Resumen: Entrega nº15 del curso Bases de la programación Nivel I.
Codificación aprenderaprogramar.com: CU00116A

 

 

PROBLEMA CON  RESOLUCIÓN INTUIDA PERO MÉTODO "PASO A PASO" A  DETERMINAR

Se trataría, junto a lo que hemos llamado “problemas con iteración para búsqueda de soluciones”, de un tipo de problemas que invitan a pensar y a desarrollar nuestra creatividad como programadores.
 
En estos casos, no sólo tenemos que trasladar al ordenador instrucciones para que ejecute un proceso conocido, sino que, como paso previo, hemos nosotros de determinar cuál es el proceso “paso a paso”. Nos referimos, en general, a problemas que sabemos responden a premisas matemáticas, mecánicas, lógicas, ... muchas veces de apariencia trivial pero de los que se nos escapan cuáles son los procesos intermedios.

 

Vamos a relacionar múltiples problemas indicando cómo los clasificaríamos:

a)   Cerrar una puerta --> resolución directa.
b)   Clavar un clavo --> resolución con iteraciones.
c)   Calcular volumen de un cilindro --> resolución directa.
d)   Hablar --> resolución intuida.
e)   Preparar una bechamel --> resolución documentada.
f)   Pintar una casa --> resolución directa.
g)   Ordenar una serie de números --> resolución intuida.
h)   Facturar a un cliente en una agencia de viajes, existiendo múltiples condicionantes para determinar el precio --> resolución con tabla de decisión.
i)   Realizar la declaración de la renta --> resolución documentada.
j)   Elegir el color para pintar una casa --> subjetivo, no programable.
k)   Conducir un coche --> resolución intuida.
l)   Recoger a una persona que ha entrado a un cajero si llevamos un coche y nos vemos obligados a dar vueltas a la manzana --> resolución con iteración.
m)   Calcular pérdidas de carga en tuberías --> resolución documentada.
n)   Calcular nóminas de los empleados de una empresa, existiendo múltiples condicionantes (pluses, sanciones, niveles, etc.) --> resolución con tabla de decisión.
o)   Determinar los números primos entre uno y mil --> resolución intuida.
p)   ¿Qué hacer si nos encontramos a 100 Km del lugar donde tenemos una reunión dentro de 30 minutos? --> subjetivo, no programable.

 

Como ya se expuso, nos basamos en una clasificación práctica (o de base subjetiva): lo que para algunos es resolución directa, para otros puede ser resolución documentada. Igualmente la resolución intuida para algunas personas puede ser resolución directa o documentada para otras... No se trata de acotar de qué tipo es un problema desde el punto de vista científico: el objetivo es que cada uno sepamos identificar los problemas, conocerlos, y saber establecer estrategias para su resolución.
 
En cuanto a los problemas de resolución intuida, observamos que tienen en común lo siguiente:
 
a)   Sabemos resolverlos o sabemos que existe una vía matemática, lógica o de encadenamiento de acciones que dan lugar a la solución.
b)   No sabemos, o hay necesidad de reflexionar para determinarlos, cuáles son los pasos intermedios para llegar a la solución.
 
 
 
Ilustración: El indígena sabe construir el puente, pero no es capaz de describir el proceso paso a paso o   las leyes o métodos en que se basa.
 
 
Veamos algunos ejemplos. ¿Sabemos hablar? ¿Cuáles son los pasos intermedios para construir frases? Obviamente sabemos hablar, pero ¿cuál es el paso a paso de hablar? Esto ya no es tan trivial, aunque hablar sí lo sea para nosotros. Podríamos pensar en hablar como:
 

 

Las letras (o fonemas) serían las unidades que se conjuntan para crear vocablos con significación. Las convenciones, el acuerdo entre todos los hablantes de un lenguaje para que ciertas letras unidas signifiquen algo. Por ejemplo: barco se asocia a nave flotante en el agua, pero podría asociarse a objeto muy brillante en el firmamento que da lugar al día y la noche, si ese fuera el convenio. Las normas de construcción del lenguaje rigen las formas verbales, la sintaxis. No decimos, por ejemplo, “Azul allí barco hay un” sino “Allí hay un barco azul”. Por último, las excepciones a las normas constituirían circunstancias a conocer específicamente, tal es el caso de los verbos irregulares y las frases hechas, etc.

 
A partir de aquí, empezaríamos a estudiar detalladamente cómo hablamos para pasarlo a esquemas lógicos y éstos a su vez trasladarlos al ordenador, lo cual podemos asegurar no es nada sencillo dada la complejidad de una lengua, y menos aún si programamos solos. No es de nuestro interés extendernos reflexionando sobre el habla humana o la inteligencia artificial. Veamos cosas más de andar por casa. Por ejemplo, ordenar una serie de números. Supongamos lo siguiente: tenemos una serie de números y queremos ordenarla (de menor a mayor).
 
 
 
La hemos ordenado mentalmente sin necesidad de operaciones o anotaciones, pero ¿Cuál ha sido el proceso paso a paso? Los lenguajes de programación no nos van a entender si les decimos “ordéname esta serie de números”, pero serán capaces de comparar números, lo cual creemos que es “la base” para ordenar.
 
Debemos tener en cuenta que ya existen programas que permiten realizar estas tareas y muchas otras. Y no sólo programas para utilizar, sino programas para insertar dentro de nuestros programas. Éstos circulan en los ambientes informáticos así como en revistas especializadas, internet, etc. No recomendamos ni desaconsejamos su uso. En algunas circunstancias pueden ser de interés y en otras no. De cualquier forma, lo que resulta de interés para cualquiera que aspire a defenderse programando es saber enfrentarse a un problema como el de ordenar números y resolverlo. Por un lado, nos aportará capacidad de resolución como programadores. Por otro, una vez se tiene “desglosado” el proceso, lo normal es aprovechar lo que hemos escrito en un programa para insertarlo en otro, con la particularidad de que el código es nuestro y “sabemos lo que hacemos”.
 
Volvamos a nuestro problema de ordenar números. En cuanto al método es muy probable que existan varias vías para llegar a un objetivo. A la hora de programar, pensando que el ordenador es una máquina, debemos buscar los métodos más mecánicos posibles. Empezaremos tratando de responder a las preguntas de “Conocer el problema” como si de un caso normal se tratara.
 
1. ¿Cuál es mi objetivo? Conocemos el objetivo genérico: ordenar una serie de números. Debemos acotarlo todo lo posible. Por ello plantearemos como objetivo ”Ordenar una serie de números de mayor a menor”
 
2. ¿Cuáles son los condicionantes que afectan al problema? Quizás no los conozcamos todos ahora y haya que volver a este punto más adelante, pero vamos a tratar de determinarlos. Nos plantearemos:
  • La cantidad de números a ordenar: el problema sería inmediato si se tratara de dos o tres números. Pero nos plantearemos el problema para un número indeterminado, esto es, n números.
  • La existencia de ceros: dado que pensamos basarnos en comparaciones de números, el cero no tiene por qué darnos ningún problema.
  • La existencia de números negativos: ídem al caso del cero.
  • La necesidad o no de conservar la lista inicial de números: habrá de considerarse en función de para qué queremos el programa. Suponemos que queremos conservarla.
3. ¿Cuáles son los datos de partida? Una serie de n números. Trataremos de trabajar con letras. Así la serie estará compuesta por valor 1, valor 2, valor 3, valor 4, ..., valor n o abreviadamente v(1), v(2), v(3), v(4),..., v(n).
 
4. ¿Qué método o estrategia de resolución voy a aplicar? De ello nos ocuparemos a continuación.
 
5. ¿Qué resultados quiero obtener? Dado que queremos conservar la lista inicial, vamos a tratar de obtener una lista ordenada del tipo: orden 1 = ... , orden 2 = ... , orden 3 = ... , orden 4 = ... , ..., orden n = ... , o abreviadamente o(1), o(2), o(3), o(4), ..., o(n)

 

 

 

 

 

 

Para acceder a la información general sobre este curso y al listado completo de entregas pulsa en este link: Ver curso completo.

 

Para  hacer un comentario o consulta utiliza los foros aprenderaprogramar.com, abiertos a cualquier persona independientemente de su nivel de conocimiento.

 

Descargar archivo: