Download Sin título de diapositiva

Document related concepts
Transcript
Problema
Escribir un programa que muestre la siguiente tabla de raíces
cuadradas
2 Nº
3 Nº
...
30 Nº
Algoritmo
1. inicializar variable n con valor 2
2. repetir hasta que n > 30:
 escribir n y n
 sumar 1 a n
alternativamente
1.inicializar variable n con valor 2
2. repetir mientras n  30:
 escribir n y n
 sumar 1 a n
Programa
import math
#inicializar variable n con valor 2
n=2
#repetir mientras n<=30
while n<=30:
#escribir n y n
print n,math.sqrt(n)
#sumar 1 a n
n=n+1
Nota.
n=n+1#inst de asignación: variable=expresión;
1º evalúa (calcula) expresión.
Ej: calcula n+1 (1ªvez 2+1=3, 2ªvez 3+1=4,…)
2º guarda resultado en variable.
Ej. en variable n (1ªvez 3, 2ªvez 4,…)
Instrucción while
Sintaxis
while condición:
instrucciones
Semántica
Mientras condición se cumpla (sea True) ejecutar instrucción(es)
graficamente:
condición
True
instrucciones
False
Ejecución del programa
1º
2º
3º
4º
5º
6º
7º
instrucción
n=2
while n<=30:
print n,…
n=n+1
while n<=30:
print n,…
n=n+1
efecto
n: 2
True
2 1.4
n: 3
True
3 1.7
n: 4
…
85º
86º
87º
88º
89º
90º
instrucción
efecto
n=n+1
while n<=30:
print n,…
n=n+1
while n<=30:
n: 30
True
30 5.4
n: 31
False
fin
¿Qué sucede si la condición es falsa la primera vez?
Ejemplo:
maximo=input(“nº máximo?”)
n = 2
while n<=maximo:
print n,math.sqrt(n)
n=n+1
Si maximo<2, las instrucciones no se repiten nunca.
Nota. Esta propiedad permite diseñar ciclos que eventualmente no
se repiten nunca.
Problema. Función que sume números enteros entre x e y
Ejs de Uso:
suma(3,5) entrega 3+4+5=12,
suma(3,3) entrega 3
suma(3,2) entrega 0
#suma(x,y): entrega x + (x+1) + (x+2) + … + y
def suma(x,y):
s=0
n=x
while n<=y:
s=s+n
n=n+1
return s
¿Qué sucede si la condición es siempre verdadera?
Ejemplo:
print"Nº raiz"
n=2
while n<=30:
print n,math.sqrt(n)
Las instrucciones se repiten indefinidamente (“loop”)
error: no se incrementa variable n
Corolario. El programador debe preocuparse de incluir instrucciones
que influyan en la condición, de modo que eventualmente sea falsa.
Problema. Escribir un programa que calcule el promedio de una
cantidad indeterminada de números reales siguiendo el diálogo:
número?4.5
cuenta=1 promedio=4.5
número?5.5
cuenta=2 promedio=5.0
. . .
número?0
Nota. El número 0 se usa como indicador de fin de datos
Programa:
#acumulador(sumatoria) y contador de números
suma=0.0 #real por si se ingresan sólo enteros
n=0
#obtener primer número
numero=input("número?")
#repetir hasta fin de datos
while numero!=0 :
#procesar numero
suma=suma+numero
n=n+1
print "cuenta=",n,“promedio=”,suma/n
#obtener siguiente número
numero=input("número?")
Ejecución del programa
1º
suma=0
suma: 0
2º
n=0
n: 0
3º
numero=input(“…”);
numero: 4.5
4º
while numero!=0:
True
5º
suma=suma+numero
suma: 4.5
6º
n=n+1
n: 1
7º
print …,n,…,suma/n
cuenta=1 promedio=4.5
8º
numero=input(“…”)
numero: 5.5
Ejecución del programa
9º
while numero!=0:
True
10º
suma=suma+numero
suma: 10.0
11º
n=n+1
n: 2
12º
print …,n,…,suma/n
cuenta=2 promedio=5.0
13º
numero=input(“…”)
numero: 0
14º
while numero!=0:
False
15º
fin
Ejercicio. Escribir la función y el programa siguiente
#factorial(x): entrega 1*2*…*x
#ejs: factorial(3)=1*2*3=6, factorial(0)=1
def factorial(x):#x>=0
…
#programa: muestra factorial de c/nº de una lista
…
Diálogo (ejemplo)
nº?4
4!=24
nº?0
0!=1
…
nº?-1 (nº negativo indica fin de los datos)
Solución 1 : x! = 1 * 2 * ... * (x-1) * x
def factorial(x):
producto=1
i=1
while i<=x:
producto=producto*i
i=i+1
return producto
(0!=1)
Solución 2 : x! = x * (x-1) * … * 1
def factorial(x):
producto=1
while x>0:
producto=producto*x
x=x-1
return producto
Nota.
 x termina con el valor 0
 argumento en la llamada no se modifica
 ejemplo: factorial(n) no modifica n
(0!=1)
Solución 3(recursiva): x! = x * (x-1)!
def factorial(x):
if x==0:
return 1
else:
return x * factorial(x-1)
Notas
 más simple
 4 líneas
 sin iteración (while)
 sólo uso de parámetro
 sin variables adicionales
(0!=1)
#programa: muestra factorial de c/nº de una lista
n=input(“nº?”)
while n>=0:
print n,”!=”,factorial(n)
n=input(“nº?”)
Solución 2. usando patrón while True:..break
#programa: muestra factorial de c/nº de una lista
while True:
n=input(“nº?”)
if n<0: break
print n,”!=”,factorial(n)
Explicaciones
while True:
 condición siempre verdadera
 instrucciones se ejecutan siempre (“loop”)
if n<0: break
 si condición se cumple, salir del ciclo (“loop”)
 break “salta” a instrucción siguiente a while (la que está después de la
última instrucción debajo y subordinada a while)