Estructuras de control. Secuencial, condicional y repetitivas. 1 Estructuras de control. Hemos visto en los diagramas de flujo y pseudo-código que: 1) Se piden datos de entrada (al usuario) → Asiganción de valores a las variables 2) Se hacen cálculos con los datos introducidos por el usuario, guardando el resultado deseado en una variables → asignaciones. 3) Devolver al usuario los resultados almacenados en variables → En pantalla → sentencia print. La programación Top-Down (Paradigma estructural) → serie de líneas que se ejecutan una 2 tras otra Estructuras de control. El flujo de ejecución del programa es estrictamente secuencial. No obstante a esta linealidad, es posible alterar este flujo de ejecución de órdenes para conseguir: 1) tomar decisiones a partir de los datos y/o resultados intermedios y, en función de éstas, ejecuten ciertas sentencias y otras no; 2) tomen decisiones a partir de los datos y/o resultados intermedios y, en función de éstas, ejecuten ciertas sentencias más de una vez. 3 Estructuras de control. El primer tipo de alteración se efectúa con sentencias condicionales o de selección. El segundo tipo con sentencias iterativas o de repetición. Las sentencias que permiten alterar el flujo de ejecución se engloban en las denominadas estructuras de control de flujo → estructuras de control. 4 Estructuras de control: Sentencias condicionales Ejemplo, resolver cualquier ecuación de primer grado ax + b = 0, Empezamos contestando: 1. ¿Cuáles son los datos del problema? Se piden al usuario, los coeficientes a y b son los datos del problema y son conocidos. 2. ¿Qué deseamos calcular? → será mostrado al usuario mediante un print. En este caso es el valor de x. 5 Estructuras de control: Sentencias condicionales Conociendo los datos de entrada y el resultado que hemos de calcular (datos de salida), ¿Cómo calcular la salida a partir de la entrada? En el ejemplo: basta con despejar x de la ecuación: x se obtiene calculando −b/a. Pasos: 1. Pediremos el valor de a y el valor de b (que supondremos de tipo flotante). 2. Calcularemos el valor de x como −b/a. 3. Mostraremos por pantalla el valor de x. 6 Estructuras de control: Sentencias condicionales Nuestro procedimiento presenta un punto débil: cuando a vale 0, se produce un error de división b/0=? → NAN, INF, sistema colgado etc En la medida de lo posible se debe tratar de evitar los errores en tiempo de ejecución, ya que: detienen la ejecución del programa y muestran mensajes de error poco comprensibles para el usuario. 7 La sentencia condicional if En el ejemplo, se deberá detectar si a vale cero para, en ese caso, no continuar con la ejecución del cálculo, para prevenir un error de ejecución La sentencia condicional o de selección quiere decir: <<Al llegar a este punto, ejecuta esta(s) acción(es) sólo si esta(s) condición(es) es (son) cierta(s)>> Este es el condicional IF (Si) 8 La sentencia condicional if if a != 0: x = -b/a print ’Solución: ’, x Si introducimos a=0, b=1, no pasará nada, no ocurre error, pero el procedimento no producirá salida 9 La sentencia condicional if if a != 0: x = -b/a print ’Solución: ’, x if a == 0: print ’La ecuación no tiene solución.’ 10 Sentencias condicionales anidadas IF (Condición) THEN IF (Condición) THEN IF (Condición) THEN 11 La sentencia condicional if Ejemplo: Un capital de C euros a un interés del x por ciento anual durante n años se convierte en en C · (1 + x/100)n euros. Diseñar el pseudo código que solicite la cantidad C y el interés x y n y calcule el capital final sólo si x es una cantidad positiva. 12 ELSE En caso contrario (else): if condición: acciones if condición contraria: otras acciones 13 ELSE Este tipo de combinación es muy frecuente, hasta el punto de que se ha incorporado al lenguaje de programación una forma abreviada que significa lo mismo: if condición: acciones else: otras acciones Else → Si no, en caso contrario, además 14 Una estrategia de diseño: refinamientos sucesivos Construir mentalmente un programa tan complicado es muy dificil, pero posiblemente sea porque sigues una aproximación equivocada: no debes intentar construir mentalmente todo el programa de una vez. Es recomendable: a) Primero haz una versión sobre papel que resuelva el problema de forma directa ( tosca) Utilizar datos concretos y hacer un esquema con el orden de las operaciones a realiza y las desiciones tomada 15 Una estrategia de diseño: refinamientos sucesivos b) Analiza tu diseño y considera si realmente resuelve el problema planteado: ¿es posible que se cometan errores en tiempo de ejecución?, ¿hay configuraciones de los datos que son especiales y, para ellas, el cálculo debe ser diferente? → CASOS PARTICULARES c) Cada vez que te plantees una de estas preguntas y tengas una respuesta, modifica el procedimiento en consecuencia. No hagas más de un cambio cada vez. 16 Una estrategia de diseño: refinamientos sucesivos d) Si el procedimiento funciona correctamente para todas las entradas posibles y eres capaz de anticiparte a los posibles errores de ejecución, ¡Felcidades!, Si no es el caso, regresa al paso b) e)Asegurando que todo funciona correctamente, al teclear en el programa el mayor número de pruebas posibles, comprobando cuidadosamente que el resultado calculado es correcto. 17 Una estrategia de diseño: refinamientos sucesivos e) Presta especial atención a configuraciones extremas o o singulares de los datos (los que pueden provocar divisiones por cero o valores muy grandes, o muy pequeños, o negativos, etc.). Si el programa calcula algo diferente de lo esperado o si se aborta la ejecución del programa por los errores detectados, vuelve a paso b). 18 Una estrategia de diseño: refinamientos sucesivos Un error frecuente es tratar de diseñar el programa directamente sobre el ordenador, escribiéndolo a bote pronto. Es más, hay estudiantes que se atreven a empezar con la escritura de un programa sin haber entendido bien el enunciado del problema que se pretende resolver. Es fácil descubrirlos en falta: no saben resolver a mano un caso particular del problema. Una buena práctica, pues, es solucionar manualmente unos pocos ejemplos concretos para estar seguros de que conocemos bien lo que se nos pide y cómo 19 calcularlo. Ejemplo Diseña un programa que, dados cinco números enteros, determine cual de los cuatro ultimos números es más cercano al primero. (Por ejemplo, si el usuario introduce los números 2, 6, 4, 1 y 10, el programa responderá que el número más cercano al 2 es el 1 Diseñelo para un número indetermidado de números 20 Estructuras de control: Sentencias condicionales Evaluación con cortocircuitos: La evaluación de expresiones lógicas es algo especial. Observa la condición de este if : if a == 0 or 1/a > 1: ¿Puede provocar una división por cero? NO 21 Evaluación con cortocircuitos: ● if a == 0 or 1/a > 1: Si a vale cero, el primer término del or es 1. Como la evaluación de una or lógica de 1 con cualquier otro valor, es necesariamente 1, El programa no evaluará el segundo término y se ahorra así un esfuerzo innecesario. 22 Evaluación con cortocircuitos: ● Algo similar ocurre en este otro caso: if a != 0 and 1/a > 1: Si a es nulo, el valor de a != 0 es 0, así que ya no se procede a evaluar la segunda parte de la expresión. Al calcular el resultado de una expresión lógica, se evalúa (siguiendo las reglas de asociatividad y precedencia oportunas) lo justo hasta conocer el resultado: 23 Evaluación con cortocircuitos: ● cuando el primer término de un or es cierto, se acaba y devuelve directamente cierto y cuando el primer término de un and es falso, se acaba y devuelve directamente falso. Este modo de evaluación se conoce como evaluación con cortocircuitos. 24 Método de la iteración simple II: Segundo ejemplo: g(x)=5x-exp(x) ¿Cúantas raices tiene? ¿cuáles aboramos directamente con el método de la iteración simple? ¿Cómo solucionamos las demás? 25 Pseudocódigo de la iteración simple 26 iteración simple II: primera raiz 27 Método de la iteración simple: Valor de la primera raiz: 28 iteración simple: Convergencia Divergencia 29