Resolución de problemas IC-1800 Introducción a la programación I semestre, 2017 1
Algoritmo Una definición bastante usada: Una secuencia de pasos con los que se obtiene un resultado en una cantidad finita de tiempo. Cantidad finita de tiempo... por qué? Es una solución particular a un problema. khwarizmi Dominio Público (Wayiran @ Wikimedia Commons)
Algoritmo El término viene del nombre del matemático persa: Abu Abdallah Muḥammad ibn Mūsā al-jwārizmī (780 850) Algoritmo de Euclides Máximo común divisor de un par de números Viene del 300 a.c. khwarizmi Dominio Público (Wayiran @ Wikimedia Commons)
Algoritmo Una definición bastante usada: Una secuencia de pasos con los que se obtiene un resultado en una cantidad finita de tiempo. Cantidad finita de tiempo... por qué? Google Doodle Turing Machine for Alan Turing Centenary CC BY 2.0 (dulhunk @ flickr)
Algoritmo Una definición bastante usada: Una secuencia de pasos con los que se obtiene un resultado en una cantidad finita de tiempo. Representaciones de algoritmos: Lenguaje natural Diagramas de flujo Pseudocódigo Lenguaje de programación A manera de ejemplo cotidiano: las recetas de cocina son algoritmos que nos permiten solucionar el problema que surge cuando tenemos hambre.
Algoritmo: Diagramas de Flujo En inglés se les conoce como Flowchart Es una técnica visual para representar el flujo de las operaciones que se realizan para completar un algoritmo. LampFlowchart-es Dominio Público (Huhsunqu @ Wikipedia)
Algoritmo: Diagramas de Flujo Se utilizan cajas, símbolos y flechas para representar la secuencia de las instrucciones. Cuál es el problema que se está solucionando? Quien o qué resuelve el problema? LampFlowchart-es Dominio Público (Huhsunqu @ Wikipedia)
Algoritmo: Pseudocódigo Es una mezcla entre lenguaje natural y lenguaje de programación. Es muy flexible pues aprovecha las facilidades de expresión del lenguaje natural y las reglas de los lenguajes de programación de alto nivel. Pseudocódigo Diagrama de Flujo Si condición P es cierta instrucciones1 Si no entonces instrucciones2 Fin
Características de un Algoritmo Finito debe terminar después de una serie de pasos. Precisión cada operación o paso debe ser especificado de una forma clara (sin ambigüedad). Entradas Qué requiere el programa para su ejecución? (podría ser que nada )
Características de un Algoritmo Salidas Qué quiero al finalizar la ejecución?. Eficacia se deben poder seguir las operaciones de forma exacta y en un tiempo finito por una persona utilizando papel y lápiz. Características propuestas por Donald Knuth (The art of programming, 1968)
Suit up CC-BY-ND (JuditK @ flickr) Un Buen Algoritmo Idealmente los algoritmo buenos intentan: Minimizar el tiempo de ejecución (eficiencia de tiempo) Minimizar los recursos utilizados: menor cantidad de memoria y espacio en disco, etc. (eficiencia en consumo de recursos) Adaptable / Generalista: debe estar preparado para conjuntos de datos distintos. His Majesty With His People CC- BY-NC-SA (Bhutan-360 @ flickr)
Suit up CC-BY-ND (JuditK @ flickr) Un Buen Algoritmo Idealmente los algoritmo buenos intentan: Simple y Elegante: este punto es completamente subjetivo. Normalmente se define culturalmente y en programación se hace mediante estándares. Legibilidad: se desea que el algoritmo pueda ser leído y comprendido por otros programadores. His Majesty With His People CC- BY-NC-SA (Bhutan-360 @ flickr)
Ciclo de solución de problemas Una serie de pasos que se deben seguir para intentar solucionar un problema por medio de un algoritmo. Comprobable: se puede probar que los resultados son correctos? Eficaz: son los resultados esperados?, se resuelve el problema? Eficiente: cuantos recursos/tiempo consume? Jeff Schmidt Peralta
Cómo vamos a abordar los problemas? Paso 1: Entender el problema Fundamental! Y a la vez una de las principales causas de fallas en la creación de software. Las características de un programa son llamadas requerimientos, se obtienen de los usuarios, enunciados (examen) y de la observación de ejemplos. Jeff Schmidt Peralta
Cómo vamos a abordar los problemas? Paso 1: Entender el problema 3 Elementos vitales: entradas, salidas y restricciones (o limitaciones). La identificación correcta de los elementos involucrados en el programa es una forma de asegurarnos de estar comprendiendo el problema. Jeff Schmidt Peralta
Entradas, salidas y restricciones? Coffe Machine and Grinder CC BY-NC-ND 2.0 (SkeenaValleyGirl @ flickr)
Cómo vamos a abordar los problemas? Paso 2: Pensar un algoritmo Modelar mentalmente o utilizando alguna herramienta, el problema a solucionar. Es una destreza que se fortalece con la práctica y el estudio de soluciones a problemas clásicos. Jeff Schmidt Peralta
Cómo vamos a abordar los problemas? Se puede utilizar el análisis por casos: buscar todos los posibles casos y sus soluciones y determinar una solución general. Normalmente este proceso requiere pensamiento abstracto, creatividad e ingenio. Jeff Schmidt Peralta
Cómo vamos a abordar los problemas? Paso 3: Formular algoritmo Escribir la solución en algún lenguaje de programación. También se le llama proceso de codificación. Los algoritmos deben ser independientes del lenguaje de programación, sin embargo según el algoritmo algunos lenguajes son más aptos. Jeff Schmidt Peralta
Cómo vamos a abordar los problemas? Paso 4: Pruebas y evaluación del programa En caso de que las pruebas o la evaluación no sea satisfactoria entonces se debe regresar a algún paso anterior para corregir los problemas. Jeff Schmidt Peralta
Cómo vamos a abordar los problemas? Como probar: De forma manual (papel y lápiz) En el computador (vía práctica, pruebas automatizadas) Pruebas matemáticas (inducción) Aspectos a tomar en cuenta: Eficiencia tiempo, CPU, RAM Jeff Schmidt Peralta
Mantenimiento Una vez que los programas están listos y se ha comprobado su funcionalidad, se dice que éstos son puestos en producción o sea se ponen en el ambiente real de uso. Mantenimiento: Lo normal en el ciclo de vida de los programas es que sea necesario realizar cambios ya sea por un cambio en los requerimientos o por errores que no se detectaron a tiempo. Fundamental: las buenas prácticas de programación y la documentación determinarán en gran medida el éxito del proceso de mantenimiento.
Ejercicios: ciclo de solución de problemas En parejas: se le presenta como problema ir a la soda de la universidad a comprar un refresco natural. Desarrolle la solución y asegúrese de que la solución funciona. Individual: describa de forma algorítmica (secuencial) las actividades que usted realiza para ubicar latitud y longitud en un mapa. Tarea: Haga un diagrama de flujo para la solución al problema retirar dinero de un cajero automático, además enumere cada uno de los pasos. Hágalo desde la perspectiva de la persona primero y luego desde la perspectiva de la aplicación de software (No olvide las validaciones que debe realizar).
Ejemplo: calcule el área de un círculo Comprenda el problema. qué se requiere? Determinar: Entradas Salidas Limitaciones (restricciones) Piense en el algoritmo. Diseñe pruebas Corrobore que el algoritmo funciona.
Referencias y Lecturas Complementarias Material suministrado por el profesor Jeff Schmidt, Instituto Tecnológico de Costa Rica. I semestre 2011.
Las presentaciones para el curso IC-1800: "Introducción a la Programación" por Ing. En Computación Alajuela se distribuyen bajo una Licencia Creative Commons Atribución-Compartir Igual 3.0 Costa Rica. 27 http://creativecommons.org/licenses/by-sa/3.0/cr/ http://creativecommons.org/licenses/by-sa/3.0/cr/ *La licencia de la presentación no cubre las imágenes utilizadas*
Resolución de problemas IC-1800 Introducción a la programación I semestre, 2017 1
Algoritmo Una definición bastante usada: Una secuencia de pasos con los que se obtiene un resultado en una cantidad finita de tiempo. Cantidad finita de tiempo... por qué? Es una solución particular a un problema. khwarizmi Dominio Público (Wayiran @ Wikimedia Commons) El término algoritmo proviene del matemático Muhammad ibn Musa al-khwarizmi (Abu Abdallah Muḥ ammad ibn Mūsā al-jwārizmī), que vivió aproximadamente entre los años 780 y 850 d.c., en la actual nación Irán y que describió la realización de operaciones elementales en el sistema de numeración decimal. De al-khwarizmi se obtuvo la derivación algoritmo. Algoritmo de euclides (300 a.c): utiliza el algoritmo de la división junto al hecho que el MCD de dos números también divide al resto obtenido de dividir el mayor entre el más pequeño. Por ejemplo, si se divide 60 entre 48 dando un cociente de 1 y un resto de 12, el m.c.d. será por tanto divisor de 12. Después se divide 48 entre 12 dando un resto de 0,
Algoritmo El término viene del nombre del matemático persa: Abu Abdallah Muḥammad ibn Mūsā al-jwārizmī (780 850) Algoritmo de Euclides Máximo común divisor de un par de números Viene del 300 a.c. khwarizmi Dominio Público (Wayiran @ Wikimedia Commons) El término algoritmo proviene del matemático Muhammad ibn Musa al-khwarizmi (Abu Abdallah Muḥ ammad ibn Mūsā al-jwārizmī), que vivió aproximadamente entre los años 780 y 850 d.c., en la actual nación Irán y que describió la realización de operaciones elementales en el sistema de numeración decimal. De al-khwarizmi se obtuvo la derivación algoritmo. Algoritmo de euclides (300 a.c): utiliza el algoritmo de la división junto al hecho que el MCD de dos números también divide al resto obtenido de dividir el mayor entre el más pequeño. Por ejemplo, si se divide 60 entre 48 dando un cociente de 1 y un resto de 12, el m.c.d. será por tanto divisor de 12. Después se divide 48 entre 12 dando un resto de 0,
Algoritmo Una definición bastante usada: Una secuencia de pasos con los que se obtiene un resultado en una cantidad finita de tiempo. Cantidad finita de tiempo... por qué? Google Doodle Turing Machine for Alan Turing Centenary CC BY 2.0 (dulhunk @ flickr) Un sistema computacional debe ser finito. - recursos computacionales son finitos (la espera de una solución también) - Problemas que no se pueden resolver en tiempo finito son de una complejidad desmedida Máquina de Turing: http://www.google.com/doodles/alan-turings-100th-bi rthday Ojo: la clase se refiere a algoritmos secuencias y NO paralelos.
Algoritmo Una definición bastante usada: Una secuencia de pasos con los que se obtiene un resultado en una cantidad finita de tiempo. Representaciones de algoritmos: Lenguaje natural Diagramas de flujo Pseudocódigo Lenguaje de programación A manera de ejemplo cotidiano: las recetas de cocina son algoritmos que nos permiten solucionar el problema que surge cuando tenemos hambre. Un sistema computacional debe ser finito. - recursos computacionales son finitos - Máquina de Turing: http://www.google.com/doodles/alan-turings-100th-bi rthday Ojo: la clase se refiere a algoritmos secuencias y NO paralelos.
Algoritmo: Diagramas de Flujo En inglés se les conoce como Flowchart Es una técnica visual para representar el flujo de las operaciones que se realizan para completar un algoritmo. LampFlowchart-es Dominio Público (Huhsunqu @ Wikipedia) Cuál es el problema que se está solucionando? - Problema: no tengo luz en una lámpara Quien o qué resuelve el problema? - Un ser humano, Cómo sabemos eso? Por el tipo de instrucciones que se le están dando ###Esto debo mejorarlo mucho más. El tema de los diagramas de flujo ayuda mucho a comprender como enfrentarse a un problema computacional. ### Hacer más ejercicios de diagramas de flujo y pseudocódigo. Poner énfasis al fin del algoritmo señalado con el círculo rosado.
Algoritmo: Diagramas de Flujo Se utilizan cajas, símbolos y flechas para representar la secuencia de las instrucciones. Cuál es el problema que se está solucionando? Quien o qué resuelve el problema? LampFlowchart-es Dominio Público (Huhsunqu @ Wikipedia) Cuál es el problema que se está solucionando? - Problema: no tengo luz en una lámpara Quien o qué resuelve el problema? - Un ser humano, Cómo sabemos eso? Por el tipo de instrucciones que se le están dando ###Esto debo mejorarlo mucho más. El tema de los diagramas de flujo ayuda mucho a comprender como enfrentarse a un problema computacional. ### Hacer más ejercicios de diagramas de flujo y pseudocódigo. Poner énfasis al fin del algoritmo señalado con el círculo rosado.
Algoritmo: Pseudocódigo Es una mezcla entre lenguaje natural y lenguaje de programación. Es muy flexible pues aprovecha las facilidades de expresión del lenguaje natural y las reglas de los lenguajes de programación de alto nivel. Pseudocódigo Diagrama de Flujo Si condición P es cierta instrucciones1 Si no entonces instrucciones2 Fin
Finito Características de un Algoritmo debe terminar después de una serie de pasos. Precisión cada operación o paso debe ser especificado de una forma clara (sin ambigüedad). Entradas Qué requiere el programa para su ejecución? (podría ser que nada ) Un algoritmo infinito no es una solución adecuada a ningún problema. La precisión: ejemplo de impreciso si hace frío póngase abrigo, algo preciso sería si hace 20 póngase abrigo. Acá es importante tener en cuanta quien o qué ejecuta el algoritmo. Un algoritmo eficaz es uno que hace lo que tiene que hacer. Un goleador eficaz
Salidas Características de un Algoritmo Qué quiero al finalizar la ejecución?. Eficacia se deben poder seguir las operaciones de forma exacta y en un tiempo finito por una persona utilizando papel y lápiz. Características propuestas por Donald Knuth (The art of programming, 1968) Un algoritmo infinito no es una solución adecuada a ningún problema. La precisión: ejemplo de impreciso si hace frío póngase abrigo, algo preciso sería si hace 20 póngase abrigo. Acá es importante tener en cuanta quien o qué ejecuta el algoritmo. Un algoritmo eficaz es uno que hace lo que tiene que hacer. Un goleador eficaz
Un Buen Algoritmo Idealmente los algoritmo buenos intentan: Minimizar el tiempo de ejecución (eficiencia de tiempo) Minimizar los recursos utilizados: menor cantidad de memoria y espacio en disco, etc. (eficiencia en consumo de recursos) Adaptable / Generalista: debe estar preparado para conjuntos de datos distintos. His Majesty With His People CC- BY-NC-SA (Bhutan-360 @ flickr) Suit up CC-BY-ND (JuditK @ flickr) Eficaz y eficiente son dos cosas distintas!!! En cuanto al tema de simple y elegante, utilizar las imágenes para ilustrar que es algo cultura. En la imagen superior está el rey de bhutan vestido de la forma más formal y elegante dentro de la cultura de ese país, abajo por otra parte tenemos el concepto de elegancia y formalidad para occidente. Hay otros factores que se evalúan: - funcionalidad, - modularidad, - mantenibilidad - el tiempo del programador.
Un Buen Algoritmo Idealmente los algoritmo buenos intentan: Simple y Elegante: este punto es completamente subjetivo. Normalmente se define culturalmente y en programación se hace mediante estándares. Legibilidad: se desea que el algoritmo pueda ser leído y comprendido por otros programadores. His Majesty With His People CC- BY-NC-SA (Bhutan-360 @ flickr) Suit up CC-BY-ND (JuditK @ flickr) Eficaz y eficiente son dos cosas distintas!!! En cuanto al tema de simple y elegante, utilizar las imágenes para ilustrar que es algo cultura. En la imagen superior está el rey de bhutan vestido de la forma más formal y elegante dentro de la cultura de ese país, abajo por otra parte tenemos el concepto de elegancia y formalidad para occidente. Hay otros factores que se evalúan: - funcionalidad, - modularidad, - mantenibilidad - el tiempo del programador.
Ciclo de solución de problemas Una serie de pasos que se deben seguir para intentar solucionar un problema por medio de un algoritmo. Comprobable: se puede probar que los resultados son correctos? Eficaz: son los resultados esperados?, se resuelve el problema? Eficiente: cuantos recursos/tiempo consume? Jeff Schmidt Peralta
Cómo vamos a abordar los problemas? Paso 1: Entender el problema Fundamental! Y a la vez una de las principales causas de fallas en la creación de software. Las características de un programa son llamadas requerimientos, se obtienen de los usuarios, enunciados (examen) y de la observación de ejemplos. Jeff Schmidt Peralta
Cómo vamos a abordar los problemas? Paso 1: Entender el problema 3 Elementos vitales: entradas, salidas y restricciones (o limitaciones). La identificación correcta de los elementos involucrados en el programa es una forma de asegurarnos de estar comprendiendo el problema. Jeff Schmidt Peralta
Entradas, salidas y restricciones? Coffe Machine and Grinder CC BY-NC-ND 2.0 (SkeenaValleyGirl @ flickr) Haga en listado de las entradas, salidas y restricciones necesarias para resolver el problema de hacer una taza de café Entradas: café, una taza, agua, corriente eléctrica Salidas: café vertido sobre una taza, mensaje indicado si se está haciendo el café o si hay un error y no se puede hacer el café Restricciones: debe haber café, agua y corriente eléctrica. La taza no la pongo entre las restricciones pues en principio una máquina de café hace el café indistintamente de si existe taza o no, pero evidentemente es deseable que exista la taza.
Cómo vamos a abordar los problemas? Paso 2: Pensar un algoritmo Modelar mentalmente o utilizando alguna herramienta, el problema a solucionar. Es una destreza que se fortalece con la práctica y el estudio de soluciones a problemas clásicos. Jeff Schmidt Peralta Análisis por casos una forma de divide y vencerás, se analizan casos particulares para una solución compleja. Muchos de los ejercicios al iniciar a programar están pensados específicamente en desarrollar estas destrezas (lo cual puede ser un poco doloroso )
Cómo vamos a abordar los problemas? Se puede utilizar el análisis por casos: buscar todos los posibles casos y sus soluciones y determinar una solución general. Normalmente este proceso requiere pensamiento abstracto, creatividad e ingenio. Jeff Schmidt Peralta Análisis por casos una forma de divide y vencerás, se analizan casos particulares para una solución compleja. Muchos de los ejercicios al iniciar a programar están pensados específicamente en desarrollar estas destrezas (lo cual puede ser un poco doloroso )
Cómo vamos a abordar los problemas? Paso 3: Formular algoritmo Escribir la solución en algún lenguaje de programación. También se le llama proceso de codificación. Los algoritmos deben ser independientes del lenguaje de programación, sin embargo según el algoritmo algunos lenguajes son más aptos. Jeff Schmidt Peralta Esta parte se puede decir que es mecánica porque lo fundamental es un diseño adecuado.
Cómo vamos a abordar los problemas? Paso 4: Pruebas y evaluación del programa En caso de que las pruebas o la evaluación no sea satisfactoria entonces se debe regresar a algún paso anterior para corregir los problemas. Jeff Schmidt Peralta Eficiencia en tiempo, la solución debe darse en un tiempo razonable. Por ejemplo si entramos al correo cuanto tiempo es el prudente para que un usuario espere antes de que se desespere.
Cómo vamos a abordar los problemas? Como probar: De forma manual (papel y lápiz) En el computador (vía práctica, pruebas automatizadas) Pruebas matemáticas (inducción) Aspectos a tomar en cuenta: Eficiencia tiempo, CPU, RAM Jeff Schmidt Peralta Eficiencia en tiempo, la solución debe darse en un tiempo razonable. Por ejemplo si entramos al correo cuanto tiempo es el prudente para que un usuario espere antes de que se desespere.
Mantenimiento Una vez que los programas están listos y se ha comprobado su funcionalidad, se dice que éstos son puestos en producción o sea se ponen en el ambiente real de uso. Mantenimiento: Lo normal en el ciclo de vida de los programas es que sea necesario realizar cambios ya sea por un cambio en los requerimientos o por errores que no se detectaron a tiempo. Fundamental: las buenas prácticas de programación y la documentación determinarán en gran medida el éxito del proceso de mantenimiento.
Ejercicios: ciclo de solución de problemas En parejas: se le presenta como problema ir a la soda de la universidad a comprar un refresco natural. Desarrolle la solución y asegúrese de que la solución funciona. Individual: describa de forma algorítmica (secuencial) las actividades que usted realiza para ubicar latitud y longitud en un mapa. Tarea: Haga un diagrama de flujo para la solución al problema retirar dinero de un cajero automático, además enumere cada uno de los pasos. Hágalo desde la perspectiva de la persona primero y luego desde la perspectiva de la aplicación de software (No olvide las validaciones que debe realizar).
En Python: Ejemplo: calcule el área de un círculo Comprenda el problema. qué se requiere? Determinar: Entradas Salidas Limitaciones (restricciones) Piense en el algoritmo. Diseñe pruebas Corrobore que el algoritmo funciona. Comprender el problema es sumamente sencillo, basta con buscar la fórmula para hacer el cálculo que nos están solicitando, área = π r 2 Entradas: radio del círculo, valor de PI (constante, pero debe darse al algoritmo) Salidas: área Restricciones: el radio debe ser mayor a cero. (y pi?) Algoritmo: 1. obtener radio y valor de PI 2. Revisar si los valores son mayores a cero. (si es así devolver un error) 3. aplicar la fórmula del área del círculo 4. mostrar el resultado. 5. Fin del problema
Referencias y Lecturas Complementarias Material suministrado por el profesor Jeff Schmidt, Instituto Tecnológico de Costa Rica. I semestre 2011.
Las presentaciones para el curso IC-1800: "Introducción a la Programación" por Ing. En Computación Alajuela se distribuyen bajo una Licencia Creative Commons Atribución-Compartir Igual 3.0 Costa Rica. 27 http://creativecommons.org/licenses/by-sa/3.0/cr/ *La licencia de la presentación no cubre las imágenes utilizadas*