Download Introducción a algoritmos con python
Document related concepts
no text concepts found
Transcript
Universidad de Oviedo Departamento de Fı́sica Grado en Fı́sica Curso 2014–15 Introducción a la Fı́sica Computacional Introducción a algoritmos con python Resolución de problemas en un ordenador Algoritmos Lenguajes de programación Bases de la programación imperativa Resolución de problemas en un ordenador Proceso en varios pasos Se necesitan resolver varios sub-problemas: Modelo fı́sico Modelo matemático Modelo informático (algoritmo) Programa de ordenador Modelo fı́sico Se plantea el problema desde el punto de vista fı́sico (o quı́mico, biológico, sociológico, etc., dependiendo de la disciplina de que se trate). Se aplica la teorı́a correspondiente, teniendo en cuenta sus limitaciones y realizando las simplificaciones pertinentes. Modelo matemático Se describen las fórmulas algebraicas necesarias, si hay que resolver sistemas de ecuaciones, si se necesitan integrales, etc. Se debe plantear el problema usando la matemática adecuada. Por ejemplo, la fı́sica cuántica necesita el uso de números complejos, pero la dinámica clásica usa números reales. Modelo informático Los ordenadores no pueden (de momento) codificar directamente el modelo matemático. Se necesita desarrollar un algoritmo, que consiste en una descripción de las instrucciones necesarias para luego codificar la resolución del problema en un ordenador. Un algoritmo es básicamente una ‘receta’. Programa informático Consiste en la traducción del algoritmo a un lenguaje concreto de programación, que realiza realmente la computación. La computacion puede ser algo matemático (solucionar un sistema de ecuaciones), pero también puede ser una computación simbólica (buscar y reemplazar el texto de un documento, o realizar una traducción de una lengua a otra). Problema ejemplo Se deja caer una piedra desde el brocal de un pozo y queremos conocer la distancia al brocal de la piedra según cae para diferentes instantes de tiempo. (Aunque de momento algunas partes en la resolución de este ejemplo no las hemos visto, no es difı́cil entender el método. Ya volveremos sobre ellas luego.) Modelo fı́sico La piedra sufre una caı́da libre (aproximadamente). La caı́da libre es el movimiento de un cuerpo bajo la acción de la gravedad. Existen simplificaciones fı́sicas: • en las cercanı́as de la superficie terrestre se puede suponer la intensidad del campo gravitatorio, g, constante; • se desprecia el rozamiento del aire; • se supone el cuerpo puntual. Modelo matemático Definición de algunas variables: profundidad respecto a la superficie terrestre, y; tiempo, t; intensidad del campo gravitatorio (aceleración de la gravedad), g. Tomando y = 0, cuando t = 0, se tiene y = 12 gt2 . Algoritmo informático Instante inicial ti = 0, instante final tf, con n pasos temporales. definición de datos: g, ti, tf, ti, t : número real n, i : número entero parte ejecutable: leer g, tf, n asignar t = 0, dt = tf/n para i = 1 hasta n hacer asignar t = t + dt asignar y = 0.5gt2 imprimir t, y fin para Programa de ordenador (en python) g = input("g ? ") tf = input("tf ? ") n = input("n ? ") dt = tf/float(n) t = 0 for i in range(n): t = t+dt y = 0.5*g*t**2 print("t = %10.5f y = %10.5f" % (t, y)) Salida del programa (por pantalla) g ? 9.8 tf ? 2 n ? 10 t = 0.20000 t = 0.40000 t = 0.60000 t = 0.80000 t = 1.00000 t = 1.20000 t = 1.40000 t = 1.60000 t = 1.80000 t = 2.00000 y y y y y y y y y y = = = = = = = = = = 0.19600 0.78400 1.76400 3.13600 4.90000 7.05600 9.60400 12.54400 15.87600 19.60000 Algoritmos Qué es un algoritmo Es un conjunto de instrucciones a aplicar a unos datos de entrada, y que termina en un número finito de pasos, proporcionándonos resultados. Los algoritmos resuelven clases de problemas, o sea, problemas generales. Ejemplo: diseñe un algoritmo para calcular el área de un cı́rculo de radio cualquiera. Algoritmo para calcular el área de un cı́rculo Se debe conocer el radio r del cı́rculo. Tendrı́amos, por ejemplo: definición de datos: r, a : número real π : número real, constante : 3.1415926535897932 parte ejecutable: leer r asignar a = πr 2 imprimir a Ejercicio A1 (para resolver en clase) Describa un algoritmo para pasar de coordenadas polares (r, θ) a coordenadas cartesianas (x, y). r θ y x Nota: suponga que el cálculo de las funciones matemáticas clásicas es conocido y que su uso es el habitual. Solución al ejercicio A1 definición de datos: r, θ : número real x, y : número real parte ejecutable: leer r, θ asignar x = r cos θ asignar y = r sin θ imprimir x, y Ejercicio propuesto A2 Prepare un algoritmo para calcular el área de una corona circular a partir del radio interno, r, y del radio externo, R. Lenguajes de programación Qué es un lenguaje de programación Es un lenguaje formal diseñado para expresar procesos que pueden ser llevados a cabo por máquinas como las computadoras. Está formado por un conjunto de sı́mbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Qué es un lenguaje informático Es un término que engloba a los lenguajes de programación y a otros más, como por ejemplo HTML (lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación, sino un conjunto de instrucciones que permiten estructurar el contenido de los documentos). Qué es código fuente El código fuente de un programa informático (o software) es un conjunto de lı́neas de texto que son las instrucciones que debe seguir la computadora para ejecutar dicho programa. Por tanto, en el código fuente de un programa está escrito por completo su funcionamiento. Qué es código máquina El código máquina consiste en instrucciones ejecutables, conocidas por el procesador sobre el que está diseñado el ordenador. Cada procesador conoce sólo su lenguaje propio, por lo que el código máquina debe ser preparado para su funcionamiento en cada ordenador concreto. La traducción del código fuente a código máquina se realiza mediante ciertos programas denominados compiladores e intérpretes. Compiladores e intérpretes Los compiladores traducen de una vez el código fuente a lenguaje de máquina. Esto da rapidez de ejecución pero el desarrollo del programa es lento. Los intérpretes traducen el código fuente instrucción por instrucción a lenguaje de máquina. Esto permite desarrollos más rápidos pero ejecuciones lentas. No obstante, se puede ir modificando continuamente el código fuente, de tal manera que el código puede escribirse a sı́ mismo. Qué es programar Es el proceso por el cual se escribe, se prueba, se depura, se compila (o interpreta) y se mantiene el código fuente de un programa informático. Los errores en programación (bugs en inglés) son casi inevitables. Por ello, es muy importante el mantenimiento de las aplicaciones informáticas. Lenguajes amigables, como python, facilitan ese mantenimiento. Qué lenguaje usar Existen miles de lenguajes de programación, cada uno apropiado a una tarea concreta (generalmente), aunque existen lenguajes de propósito general como python, que usaremos nosotros. El uso del lenguaje adecuado a cada problema es relevante: en una disciplina los algoritmos necesarios son muy diferentes a los de otra disciplina y es probable que las rutinas pertinentes estén pre-programadas en un lenguaje y no en el otro. Tipos de lenguajes de programación Principalmente existen estos (aunque hay lenguajes ‘mixtos’): Declarativos Imperativos Orientados a objetos En todos ellos se utilizan sentencias, instrucciones o comandos en modo texto (normalmente) para escribir los programas. Programación declarativa (I/II) En ella las sentencias que se utilizan describen el problema que se quiere solucionar, pero no las instrucciones necesarias para solucionarlo. Esto último se realiza mediante mecanismos internos de inferencia de información a partir de la descripción realizada. No existen asignaciones. Programación declarativa (II/II) Existen tres subtipos de lenguajes declarativos: Lógico, ejemplo de lenguaje: Prolog. Algebraico, ejemplo de lenguaje: SQL. Funcional, ejemplo de lenguaje: Haskell. Programación imperativa En ella se describe paso a paso un conjunto de instrucciones que deben ejecutarse para variar el estado del programa y hallar la solución. Ejemplos de lenguaje: Fortran, C, Python. Nos centraremos en este tipo de programación, usando python como lenguaje. Programación orientada a objetos (I/II) La programación orientada a objetos (POO) utiliza objetos como elementos fundamentales en la construcción de la solución. Un objeto es una abstracción de algún hecho o ente del mundo real, con atributos que representan sus caracterı́sticas o propiedades, y métodos que emulan su comportamiento o actividad. Programación orientada a objetos (II/II) Todas las propiedades y métodos comunes a los objetos se encapsulan o agrupan en clases. Una clase es una plantilla, un prototipo para crear objetos; en general, se dice que cada objeto es una instancia o ejemplar de una clase. Ejemplos de lenguaje: C++, Java, Python. (No usaremos las caracterı́sticas OO de python.) Bases de la programación imperativa Comandos en programación imperativa Las instrucciones tienen una apariencia distinta en lenguajes de programación diferentes, pero existen algunas funcionalidades básicas que se presentan en casi todo lenguaje: Declaración de tipos de dato. Entrada y salida. Operaciones con datos. Subrutinas y funciones. Condicionales. Bucles. Cálculo secuencial y cálculo paralelo Existen computadores donde se pueden realizar cálculos en paralelo (por ejemplo, los clusters de procesadores para cálculo masivo). No obstante, nosotros abordaremos sólo el cálculo en serie o secuencial, más sencillo y adecuado al nivel de nuestro curso. Algoritmos con estructura secuencial En cálculo en serie, cada instrucción se ejecuta completamente antes de pasar a ejecutarse la siguiente. Los algoritmos diseñados de esta manera se denominan en serie. Por tanto, los programas preparados para este tipo de algoritmos tienen estructura secuencial. Constantes y variables (I/II) A veces, al manejar números fijos como π ≈ 3.14159, se necesitan constantes. Algunos lenguajes de programación permiten declarar explı́citamente constantes. Otras veces su uso es interno. Sin embargo, lo normal es que los datos que se manejan sean modificados de acuerdo al algoritmo. Para ello se utilizan variables. La acción de modificar los datos contenidos en una variable se denomina asignación. Constantes y variables (II/II) En programación una variable es un espacio en memoria al que se accede mediante un identificador, que tiene asociado el tipo de dato, su manejo, etc. En el espacio de memoria está almacenado un valor (posiblemente con más información interna asociada el tipo de dato). En python se asigna una variable usando el signo igual: a = dato Ejemplo de algoritmo secuencial (en python) # Esta lı́nea es un comentario # Además, las lı́neas en blanco se saltan pi = 3.1415926535897932 # El radio, r, es conocido previamente # Cálculo del área del cı́rculo a = pi*r*r # Cálc. de la longitud de la circunferencia l = 2*pi*r Ejercicio A3 (para resolver en clase) Prepare un trozo de código en python, para calcular el semiperı́metro, p, y el área, a, de un triángulo mediante la fórmula de Herón a partir de las longitudes de los lados a, b y c: p p = (a+b+c)/2, a = p(p − a)(p − b)(p − c). Suponga que los lados del triángulo son conocidos previamente. (En python la potenciación se calcula usando el operaror **.) Solución al ejercicio A3 # a, b y c son conocidos previamente # Cálculo del semiperı́metro del triángulo p = (a+b+c)/2.0 # Cálculo del área del triángulo a = (p*(p-a)*(p-b)*(p-c))**0.5 Comandos en programación imperativa Declaración de tipos de dato. Entrada y salida. Operaciones con datos. Subrutinas y funciones. Condicionales. Bucles. Declaración de tipos de dato (I/II) Los computadores manejan muchos tipos de datos: números enteros y reales, tiras de caracteres, agrupaciones de datos homogéneas y heterogéneas, etc. En muchos lenguajes, se necesita declarar qué tipo tiene un dato. Por ejemplo, en C, un entero se define anteponiendo int a la variable o constante a la que afecte. Declaración de tipos de dato (II/II) En python no es necesario declarar las variables: cuando se realiza la asignación de un dato a una variable, a, mediante: a = dato El tipo de dato de la variable coincide con el tipo de lo que hay a la derecha del signo igual. Comandos en programación imperativa Declaración de tipos de dato. Entrada y salida. Operaciones con datos. Subrutinas y funciones. Condicionales. Bucles. Instrucciones de entrada y salida Estas instrucciones suelen conllevar el uso de ficheros (o archivos), que se pueden manejar en modo lectura y/o escritura. Por ejemplo, en python, leer de un fichero, f, serı́a: x = f.read() También existen otras instrucciones ligadas a obtener información adicional sobre los ficheros, abrirlos y cerrarlos, etc. Entrada y salida simples en python De momento, para su uso en lo que sigue, en python la lectura simple de una variable (con un mensaje explicativo) se puede hacer por teclado: v = input("Introduzca velocidad ") La salida por pantalla de varias variables, a, b y c, se hace mediante: print(a, b, c) Comandos en programación imperativa Declaración de tipos de dato. Entrada y salida. Operaciones con datos. Subrutinas y funciones. Condicionales. Bucles. Operaciones con datos (I/II) Con los datos, ya sean expresados directamente (como el número 33) o a través de una variable, se pueden hacer operaciones. Las operaciones permitidas dependen del tipo de dato. Por ejemplo, con los números se pueden hacer las operaciones aritméticas conocidas en matemáticas. Operaciones con datos (II/II) Se denominan operadores a sı́mbolos (como *, +) que indican que con los datos se debe realizar cierta operación. En python los operadores son infijos, esto es, se colocan entre los datos sobre los que opera. Ejemplo: 3 * 4 En algunos lenguajes se puede extender el uso de operadores a tipos de datos definidos por el usuario. Precedencia de las operaciones Las operaciones se escriben en una sola lı́nea, y se realizan generalmente de izquierda a derecha (excepto las potenciaciones en la mayorı́a de los lenguajes). Existe una precedencia de unos operadores sobre otros. Cada lenguaje tiene sus reglas de precedencia, pero en general se realizan primero la potenciación (**), luego las multiplicaciones (*) y divisiones (/), y luego las sumas (+) y restas (-). Uso de los paréntesis Las operaciones se pueden agrupar usando paréntesis (como en las operaciones aritméticas). Esto sirve para indicar qué operaciones se realizan primero (se van quitando los paréntesis más interiores al realizarse esas operaciones). En una expresión el número de paréntesis de abrir ( debe ser igual al número de paréntesis de cerrar ). (Los editores de texto suelen tener un destacado de paréntesis.) Ejemplos de operaciones Por ejemplo: 3a se puede codificar 7b 3*a/7/b y NO: 3*a/7*b Otros ejemplos (con llamadas a funciones): 13*log(x)+sin(y) 24+12+6*7*z y0+v0*t+0.5*g*t**2 Ejemplos de operaciones con paréntesis La expresión: 2 sin x + cos y 4 3 cos x − sin y p ab(c + d) log(a + log b) f g+h x 2 sin 2+y se codifica: ((2*sin(x)+cos(y))/(3*cos(x)-sin(y)))**4 sqrt(a*b*(c+d))/log(a + log (b)) f/(g+h)/(2 *sin(x/(2+y))) Comandos en programación imperativa Declaración de tipos de dato. Entrada y salida. Operaciones con datos. Subrutinas y funciones. Condicionales. Bucles. Subrutinas y funciones Una subrutina o subprograma (también llamada procedimiento o función), codifica un subalgoritmo que permite resolver una tarea especı́fica. Esto permite modularizar el código, haciéndolo más fácil de entender. Además, se usan subrutinas previamente desarrolladas por otros programadores, que están bien diseñadas y probadas. Pueden devolver o no un valor de retorno. Definiendo subrutinas y funciones Para definir una subrutina se necesita: Un identificador que le da nombre. Tipo(s) de dato(s) de retorno que se devuelve(n) al terminar su ejecución. Una lista de parámetros: conjunto de argumentos (pueden ser cero, uno o más) que la función debe recibir para realizar su tarea. El código: conjunto de órdenes y sentencias que se deben ejecutar. Algunas consideraciones sobre subrutinas Existe diversidad en la definición de funciones y subrutinas en los diversos lenguajes de programación. Por ejemplo, los argumentos (parámetros) pueden ser accedidos por valor, por referencia o por nombre. Además, las variables que se usan en las funciones y subrutinas pueden tener carácter local o global. Glosaremos el tema con python. Ejemplo de función (en python) (Nótese el indentado y el carácter :) def circunferencia (r): # El radio, r, es un argumento pi = 3.1415926535897932 a = pi*r*r l = 2*pi*r return a, l Ejercicio A4 (para resolver en clase) Prepare una función en python que transforme las coordenadas polares en coordenadas cartesianas y que devuelve esta últimas. Solución al ejercicio A4 def pol a rect (r, th): # El radio, r, y el ángulo, th, # son argumentos (números reales) x = r*cos(th) y = r*sin(th) return x, y Ejercicio propuesto A5 (Este ejercicio se propone como tarea a entregar por el estudiante.) Prepare una función en python que utilice la fórmula de Stirling para aproximar el factorial de un número entero n (que se pasa como argumento). La función debe retornar el logaritmo neperiano del factorial de n. Bibliotecas de subrutinas y funciones Aparte de las funciones definidas por el usuario, existen bibliotecas (a veces denominadas “librerı́as”, mala traducción del inglés library ). Contienen funciones y subrutinas predefinidas previamente, con el objeto de realizar cálculos o tareas de interés para muchos usuarios del lenguaje. Ejemplos: funciones matemáticas, para manejar grandes cantidades de texto, para comunicar ordenadores a distancia, etc. Comandos en programación imperativa Declaración de tipos de dato. Entrada y salida. Operaciones con datos. Subrutinas y funciones. Condicionales. Bucles. Cambiando la ejecución secuencial La estructura secuencial sólo permite codificar algoritmos simples pues no se puede cambiar la ejecución del código en base a valores concretos de las variables. Por eso mismo los lenguajes poseen instrucciones condicionales, que permiten bifurcar la ejecución dependiendo del valor de alguna variable. Instrucciones condicionales Este tipo de instrucciones trabajan con datos de tipo lógico (también llamado booleano). Existen diversas instrucciones condicionales, como if (presente en casi todos los lenguajes), y case (o switch...case) que está en muchos lenguajes (pero no en python, pero puede simularse fácilmente con condicionales múltiples). Necesidad de las instrucciones condicionales Ejemplo: si llueve entonces vamos al cine en caso contrario vamos a dar un paseo fin si ‘llueve’ es una condición lógica (verdadero si está lloviendo y falso si no). Instrucciones condicionales en python (I/II) En el caso más simple, se chequea un valor lógico: si es verdadero se ejecuta una parte del código y si es falso no (a veces se ejecuta otra parte del código). si ... entonces se codifica en python: if ... : Instrucciones condicionales en python (II/II) en caso contrario se codifica en python (y otros lenguajes) usando else (no olvidarse del carácter : después en python). fin si no hace falta codificarlo en python: acaba el fragmento de código desindentando. En python el indentado de las lı́neas es parte de la sintaxis. Condicional simple (Nótese el indentado y el carácter :) if condicion: # código que se ejecuta # si condicion es verdadera ... ... ... # código que se ejecuta después Condicional doble if condicion: # código que se ejecuta # si condicion es verdadera ... else: # código que se ejecuta # si condicion es falsa ... # código que se ejecuta después Ejemplo de condicional (en python) Convierte un número en 0.0 si es negativo, multiplicándolo por 2.0 en otro caso: if x < 0.0: x = 0.0 else: x = 2.0*x Ejercicio A6 (para resolver en clase) Prepare una función en python que devuelva el signo de un número: −1.0 si es negativo, 0.0 si es nulo, y 1.0 si es positivo. Solución al ejercicio A6 def signo (x): # devuelve el signo de x if x == 0.0: return 0.0 if x < 0.0: return -1.0 else: return 1.0 Condicional múltiple if condicion1: # código que se ejecuta # si condicion1 es verdadera ... elif condicion2: # se ejecuta si condicion1 es falsa # y condicion2 es verdadera ... else: # código que se ejecuta # si ambas condiciones son falsas ... # código que se ejecuta después Ejercicio A7 (para resolver en clase) Prepare un fragmento de código en python con la función definida a trozos siguiente: 0, x ≤ a, x−a , a < x ≤ b, b−a f (x, a, b, c) = c−x , b < x ≤ c, c−b 1, c < x. Solución al ejercicio A7 def f (x, a, b, c): # Debe ser a < b < c if x <= a: return 0 elif x <= b: return (x-a)/(b-a) elif x <= c: return (c-x)/(c-b) else: return 1 Ejercicio propuesto A8 (I/III) (Este ejercicio se propone como tarea a entregar por el estudiante.) Despreciando el rozamiento del aire, la velocidad de escape de un cuerpo lanzado desde la superficie terrestre es: p vE = 2gR, donde g es la aceleración de la gravedad en la superficie y R el radio terrestre. Ejercicio propuesto A8 (II/III) Cuando lanzamos un cuerpo con velocidad inicial v < vE desde la superficie (despreciando el rozamiento del aire) alcanza una altura máxima: R h= . 1 − (v/vE )2 Cuando v ≥ vE , entonces a una gran distancia de la Tierra su velocidad final es: q 2. vf = v 2 − vE Ejercicio propuesto A8 (III/III) Prepare un program en python que, tomando como datos conocidos g y R (asignados directamente), nos pida v por teclado, que calcule la velocidad de escape (y la imprima), y que si la velocidad es menor que la de escape imprima la altura máxima que alcanza; si la velocidad es igual a la de escape que lo diga; si la velocidad es mayor que la de escape, que diga que el cuerpo escapa de la Tierra y que imprima la velocidad final. Comandos en programación imperativa Declaración de tipos de dato. Entrada y salida. Operaciones con datos. Subrutinas y funciones. Condicionales. Bucles. Repitiendo la ejecución de código (bucles) En ocasiones debe repetirse parte del código un número de veces (conocido a priori o no). Para ello se utilizan los bucles. Necesidad de los bucles (I/II) Ejemplo, para ir al cine se necesita: nos ponemos en la cola hacer (cola) si llegamos a la ventanilla entonces compramos la entrada salimos de hacer (cola) fin si fin hacer entramos al cine Necesidad de los bucles (II/II) Como vemos, existe la necesidad de verificar una condición lógica (en el ejemplo, ‘si llegamos a la ventanilla’) para salir del bucle. (En otro caso el bucle serı́a infinito.) Cada repetición del bucle se denomina iteración. Tipos de bucles Existen dos tipos (principalmente) de bucles: los que se repiten un número indeterminado de veces: while y repeat. . . until (o en su forma equivalente do. . . while). de los que se conoce previamente el número de iteraciones, o bucle con contador: for. Saliendo la ejecución de un bucle A veces, la salida del bucle no se realiza al principio o final del bucle (depende evidentemente del algoritmo codificado). En esas ocasiones se necesita usar otras instrucciones, como break (salida del bucle directamente) y continue (continua con la siguiente iteración, saltándose el código que falta hasta el final del bucle). Bucle while (I/II) El bucle con un número indeterminado de iteraciones más utilizado codifica: mientras condición hacer código del interior del bucle fin hacer En python es: while condición : código del interior del bucle Bucle while (II/II) El chequeo de la condición se realiza al principio: si la condición es falsa ya no se ejecuta el bucle, y se salta al código que está después del bucle. Lo habitual es que la condición dependa de una variable que va modificándose en el interior de bucle, pues sino el bucle serı́a infinito (no acaba nunca). Ejemplo de bucle while (en python) # imprime los números enteros # cuyo cubo es menor que un lı́mite dado n3max = input("Introduzca el lı́mite ") n, n3 = 1, 1 while n3 < n3max: print(n) n = n+1 n3 = n**3 Ejercicio A9 (para resolver en clase) Prepare un fragmento de código en python que imprima las diez primeras longitudes de la serie de Balmer del hidrógeno (en nanómetros): λ = 364.6 n2 , n2 − 4 n > 2. Solución al ejercicio A9 # Serie de Balmer del hidrógeno n, nt = 3, 10 while n <= nt: n2 = n**2 # n2 es una variable auxiliar print(364.6*n2/(n2-4)) n = n+1 Ejercicio propuesto A10 Prepare un programa en python que repita un bucle para simular una evolución temporal, variando el tiempo t desde un instante inicial, ti , con un intervalo dt, mientras que el tiempo sea menor o igual que tf . Dentro del bucle se imprimirá el valor de t. Bucle repeat ... until (repetir ... hasta que) Este bucle chequea la condición al final, y se ejecuta al menos una vez: repetir código del interior del bucle hasta que condición (fin repetir) En python se puede codificar usando un bucle infinito: while True : código del interior del bucle if condición : break Ejercicio A11 (para resolver en clase) Prepare un programa que imprima los números cuyo cubo es menor que un lı́mite dado usando un bucle con chequeo de condición al final. Solución al ejercicio A11 # imprime los números enteros # cuyo cubo es menor que un lı́mite dado n3max = input("Introduzca el lı́mite ") n = 1 while True: print(n) n = n+1 if n**3 > n3max: break Bucle con salida intermedia En un bucle con salida intermedia existe una condición por el medio que saca la ejecución del bucle (y la pasa a la instrucción que sigue al final del bucle). Ejemplo: while cond1 : código del bucle primera parte if cond2 : break código del bucle segunda parte Ejercicio propuesto A12 P∞ −n Se quiere sumar la serie: S = , |z| > 1, n=0 z −n tomando un número de términos n tal que |z | < EPS, siendo este último un valor pequeño, pongamos 10−10 . Prepare un programa en python que nos pida z por teclado y que imprima la suma obtenida mediante el criterio anterior. Use un bucle infinito con una condición intermedia para salir de él. Uso de continue El comando continue nos permite saltarnos desde un punto dado de un bucle hasta el final y empezar otra iteración nueva del bucle. while cond1 : código del bucle primera parte if cond2 : continue código del bucle segunda parte Si la condición cond2 es verdadera se salta la segunda parte. Si es false se continua con la segunda parte. Ejercicio A13 (para resolver en clase) Prepare un programa en python que nos pida por teclado un número lı́mite, nmax, y que imprima los números que son múltiplos de 7 entre 1 y nmax. Use el comando continue. (En python la operación a %b devuelve el resto de dividir a entre b.) Solución al ejercicio A13 # múltiplos de 7 nmax = input("nmax ") n = 0 while n < nmax: n = n+1 if n %7 != 0: continue print(n) Bucle con contador (I/III) Este bucle está controlado por una variable que se va cambiando según un patrón y se chequea frente a un valor final. En algunos lenguajes, como C, el cambio en la variable en el bucle for puede ser realizado de la manera en que desee el programador. Realmente, en C no existe el bucle controlado por variable con un número conocido a priori de iteraciones. Bucle con contador (II/III) En muchos lenguajes existe un tipo de bucle cuyo número de iteraciones es conocido a priori. Las iteraciones están controladas por una variable que no se debe (en algunos lenguajes no se puede) modificar en el interior del bucle, sino sólo al final del bucle de manera automática. Un ejemplo de este bucle es el DO de las últimas versiones de Fortran, y el bucle FOR...NEXT del lenguaje Basic. Bucle con contador (III/III) Tendrı́amos (NO es código python): para i = inicio hasta final incremento delta hacer código del bucle fin hacer La variable i toma los valores: inicio, inicio + delta, inicio + 2delta, . . . , mientras que su valor sea i ≤ final . Por defecto delta = 1. Si delta > 0 e inicio > final , o si delta < 0 e inicio < final , no se realizan las iteraciones. Bucle con contador en python En python se puede ‘simular’ este bucle con contador clásico mediante una función que nos devuelve una lista fija de valores que cumple un patrón. La función es range(inicio, final , delta), teniendo en cuenta que en este caso no se llega a final . Se usa for i in range(inicio, final , delta): interior del bucle La variable i toma los valores: inicio, inicio + delta, inicio + 2delta, . . . , mientras que su valor sea i < final . Por defecto inicio = 0, delta = 1. Ejercicio A14 (para resolver en clase) Repita el ejercicio A9 pero usando un bucle for. Prepare un fragmento de código en python que imprima las diez primeras longitudes de la serie de Balmer del hidrógeno (en nanómetros): λ = 364.6 n2 , n2 − 4 n > 2. Solución al ejercicio A14 # Serie de Balmer del hidrógeno nt = 10 for n in range(3, nt+1): n2 = n**2 print(364.6*n2/(n2-4)) Ejercicio propuesto A15 Pida por teclado un número entero postivo, n. Luego imprima los números n, n − 1, n − 2,. . . , 1 usando un bucle for y range de la manera adecuada. Bucle for genérico en python En python el bucle for está preparado para que una variable tome, en cada iteración, los valores de los elementos de una lista: for x in L: interior del bucle En la primera iteración x toma el valor de L[0] (primer elemento), en la segunda x toma el valor de L[1], . . . , hasta que se acabe la lista. Ejercicio A16 (para resolver en clase) Determine la suma de los elementos positivos de una lista de números, L. Tome, por ejemplo, la lista: L = [12, -3.0, 1, 0.0, -6.8] Solución al ejercicio A16 # L es una lista conocida L = [12, -3.0, 1, 0.0, -6.8] suma = 0.0 for x in L: if x > 0: suma = suma+x print(suma) Ejercicio propuesto A17 (Este ejercicio se propone como tarea a entregar por el estudiante.) Sea una progresión geométrica, de razon r, con primer término a, con n términos (incluyendo el primero). Estos datos se piden por teclado. Prepare un programa que calcule e imprima la suma de los términos de la progresión. Ejercicio propuesto A18 (I/II) (Este ejercicio se propone como tarea a entregar por el estudiante.) Un método de resolución de ecuaciones de la forma f (x) = 0, mediante iteraciones a partir de un valor aproximado x0 de la raı́z, se obtiene poniendo la función en la forma x = g(x) e iterando: xn+1 = g(xn ) hasta que |xn+1 − xn | < EPS, siendo este último un valor pequeño, pongamos 10−10 . Ejercicio propuesto A18 (II/II) El método no siempre converge (y hay que despejar la x de otra forma). Diseñe un programa en python que nos resuelva x3 = sin x, partiendo de un valor x0 = 1.0 usando el método iterativo propuesto. El programa debe imprimir la raı́z por pantalla. Para evitar bucles infinitos haga como mucho n = 100 iteraciones y si se llega a ellas sin convergencia, que imprima un aviso de falta de convergencia.