Sei sulla pagina 1di 117

Universidad de Oviedo Departamento de Fı́sica

Grado en Fı́sica
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 computación 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, tf, 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 y = 0.19600
t = 0.40000 y = 0.78400
t = 0.60000 y = 1.76400
t = 0.80000 y = 3.13600
t = 1.00000 y = 4.90000
t = 1.20000 y = 7.05600
t = 1.40000 y = 9.60400
t = 1.60000 y = 12.54400
t = 1.80000 y = 15.87600
t = 2.00000 y = 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).

Nota: suponga que el


r cálculo de las funciones
y
θ matemáticas clásicas es
x
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: se codifica:

2 sin x + cos y 4
 
((2*sin(x)+cos(y))/(3*cos(x)-sin(y)))**4
3 cos x − sin y
p
ab(c + d)
sqrt(a*b*(c+d))/log(a + log (b))
log(a + log b)
f
g+h
x f/(g+h)/(2 *sin(x/(2+y)))
2 sin
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
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 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
elif x < 0.0:
return -1.0
else:
return 1.0
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,

f (x, a, b, c) = b−a
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 programa 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.
Ejercicio complementario 1

¿Cuál es el resultado final de la variable z?

x=2
if x != 3:
if x==1:
z=10
else:
z=x
else:
z=0
Ejercicio complementario 2

Para la ecuación ax2 + bx + c = 0 de segundo


grado, prepare un algoritmo en el que dados los
tres parámetros a, b y c nos determine el signo
del discriminante ∆ = b2 − 4ac y según el mismo
calcule las raı́ces reales o complejas conjugadas de la
ecuación y las imprima.
Ejercicio complementario 3

Defina una función en python que lea los centros


(x1 , y1 ) y (x2 , y2 ) y los radios r1 y r2 de dos
circunferencias, e indique el número de puntos
en común que tienen ambas. Para ello calcule la
distancia entre los centros. La función deberá retornar
0 para cero puntos, 1 para un punto, 2 para dos
puntos y -1 para infinitos puntos.
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):

n2
λ = 364.6 , n > 2.
n2 − 4
Solución al ejercicio A9

# Serie de Balmer del hidrógeno


n, nt = 3, 12

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 = n=0 z , |z| > 1,
tomando un número de términos n tal que |z | < EPS,
−n

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):

n2
λ = 364.6 , n > 2.
n2 − 4
Solución al ejercicio A14

# Serie de Balmer del hidrógeno


nt = 12

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.

Potrebbero piacerti anche