In [4]:
"""
IPython Notebook v4.0 para python 2.7
Librerías adicionales: Ninguna.
Contenido bajo licencia CC-BY 4.0. Código bajo licencia MIT. (c) Sebastian Flores.
"""

# Configuracion para recargar módulos y librerías 
%reload_ext autoreload
%autoreload 2

from IPython.core.display import HTML

HTML(open("style/iwi131.css", "r").read())


Out[4]:






IWI131

Programación de Computadores

Sebastián Flores

http://progra.usm.cl/

https://www.github.com/sebastiandres/iwi131

Clase anterior

  • Ejercicios de funciones, ruteo y condicionales.

¿Preguntas?

Próximamente...

  • 16 Nov: Actividad 2.
  • 20 Nov: Tarea 1.
  • 23 Nov: Certamen 1.

¿Qué aprenderemos hoy?

  • Ciclo while

¿Porqué aprenderemos eso?

  • Ciclo while

Porque resulta natural en un programa ejecutar acciones de manera repetitiva.

¿Recuerdan la actividad 1?

Revisión de la actividad 1

En la actividad 1 hay 5 bloques condicionales:

Promedio v.0

Escriba un programa que pida al usuario ingresar sus tres notas, calcule el promedio (redondeado a entero) y lo felicite solamente si su promedio es mayor a 80, pero siempre le indique su promedio.

Nota 1: 45
Nota 2: 78
Nota 3: 68
Su promedio es 64

Nota 1: 79
Nota 2: 91
Nota 3: 74
Felicitaciones!
Su promedio es 81

Promedio v.0

Escriba un programa que pida al usuario ingresar sus tres notas, calcule el promedio (redondeado a entero) y lo felicite solamente si su promedio es mayor a 80, pero siempre le indique su promedio.


In [ ]:
def prom(n1, n2, n3):
    suma = n1 + n2 + n3
    return int(round(suma / 3.0))

n1 = float(raw_input('Nota 1: '))
n2 = float(raw_input('Nota 2: '))
n3 = float(raw_input('Nota 3: '))

promedio = prom(n1, n2, n3)

print 'Su promedio es', promedio

if promedio > 80:
    print 'Felicitaciones!'

Promedio v.1

Escriba un programa que pida al usuario ingresar todas sus notas hasta obtener un número negativo, calcule el promedio (redondeado a entero) y le indique su promedio.

Nota: 60
Nota: 100
Nota: -1
El promedio de sus 2 notas es 80

Nota: 80
Nota: 60
Nota: 70
Nota: 55
Nota: 100
Nota: -10000
El promedio de sus 5 notas es 73

Promedio v.1

Escriba un programa que pida al usuario ingresar todas sus notas hasta obtener un número negativo, calcule el promedio (redondeado a entero) y le indique su promedio.


In [9]:
# Inicialización
suma = 0
n_notas = 0
# Leer todas las notas
print "Ingrese sus notas para calcular el promedio."
print "Ingrese un valor negativo para detener la ejecucion."
nota = float(raw_input('Nota: '))
# Inicio del ciclo while
while nota>=0 and nota<=100:
    print "nota es:", nota
    suma += nota  # Shorthand for suma = suma + nota
    n_notas += 1  # Shorthand for n_notas = n_notas + 1 
    nota = float(raw_input('Nota: '))
#Fin de ciclo while
    
# Calcular el promedio
promedio = suma / n_notas
promedio_int = int(round(promedio))
print 'El promedio de sus', n_notas, 'notas es', promedio_int


Ingrese sus notas para calcular el promedio.
Ingrese un valor negativo para detener la ejecucion.
Nota: -1
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-9-063d2ee94a3c> in <module>()
     15 
     16 # Calcular el promedio
---> 17 promedio = suma / n_notas
     18 promedio_int = int(round(promedio))
     19 print 'El promedio de sus', n_notas, 'notas es', promedio_int

ZeroDivisionError: integer division or modulo by zero

Promedio v.1

  • La implementación anterior tiene como problema que sólo sirve si todos los números son positivos.
  • Cálculo del promedio falla si primer número es negativo.

Promedio v.2

Escriba un programa que pida al usuario cuántas notas desea ingresar, luego le permita ingresar sus notas, calcule el promedio (redondeado a entero) y le indique su promedio.

Numero de Notas: 2
Nota:60
Nota:100
El promedio de sus 2 notas es 80

Numero de Notas: 5
Nota:80
Nota:60
Nota:70
Nota:55
Nota:100
El promedio de sus 5 notas es 73

Promedio v.2a

Escriba un programa que pida al usuario cuántas notas desea ingresar, luego le permita ingresar sus notas, calcule el promedio (redondeado a entero) y le indique su promedio.

Utilizando un contador incremental:


In [12]:
# Leer cuantas notas se necesitan promediar y aumentar un contador
n_notas = int(raw_input('Numero de Notas: '))
# Inicialización
suma = 0
j = 1
# Leer todas las notas
while j<=n_notas:
    nota = float(raw_input('Nota:'))
    suma += nota  
    # Shorthand for suma = suma + n 
    j += 1  # Shorthand for j = j + 1 
# Calcular el promedio
promedio = suma / n_notas
promedio_int = int(round(promedio))
print 'El promedio de sus', n_notas, 'notas es', promedio_int


Numero de Notas: 0
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
<ipython-input-12-bf2982e780e8> in <module>()
     11     j += 1  # Shorthand for j = j + 1
     12 # Calcular el promedio
---> 13 promedio = suma / n_notas
     14 promedio_int = int(round(promedio))
     15 print 'El promedio de sus', n_notas, 'notas es', promedio_int

ZeroDivisionError: integer division or modulo by zero

OBS

Podemos inicializar $j=0$ y controlar $j<n_{notas}$ o también $j=1$ y controlar $j<=n_{notas}$.

Promedio v.2b

Escriba un programa que pida al usuario cuántas notas desea ingresar, luego le permita ingresar sus notas, calcule el promedio (redondeado a entero) y le indique su promedio.

Utilizando un contador decremental:


In [15]:
# Leer cuantas notas se necesitan promediar y disminuir un contador
n_notas = int(raw_input('Numero de Notas: '))
# Inicialización
suma = 0
j = n_notas
# Leer todas las notas
while j>0:
    nota = float(raw_input('Nota:'))
    suma += nota  # Shorthand for suma = suma + n 
    j -= 1  # Shorthand for j = j - 1 
# Calcular el promedio
promedio = suma / n_notas
promedio_int = int(round(promedio))
print 'El promedio de sus', n_notas, 'notas es', promedio_int


Numero de Notas: -10
El promedio de sus -10 notas es 0

Promedio v.3

Escriba un programa que le permita ingresar todas sus notas separadas por un espacio, calcule el promedio (redondeado a entero) y le indique su promedio.

Ingrese notas separadas con espacio
Notas: 100 80 60 40
El promedio de sus 4 notas es 70

Ingrese notas separadas con espacio
Notas: 55 55 40 100 100 100 10 100 100 10 100 10
El promedio de sus 12 notas es 65

Promedio v.3

Escriba un programa que le permita ingresar todas sus notas separadas por un espacio, calcule el promedio (redondeado a entero) y le indique su promedio.

OBS: Esto utiliza listas (que no hemos visto todavía).


In [16]:
# Leer cuantas notas se necesitan promediar y aumentar un contador
print "Ingrese notas separadas con espacio"
notas_str = raw_input('Notas: ') # string con todas las notas "100 10 55 100"
notas_list = notas_str.split(" ") # Crear lista separando por notas espacios
n_notas = len(notas_list)
suma = 0.0
j = 0
while j<n_notas:
    suma += float(notas_list[j])
    j += 1
# Calcular el promedio
promedio = suma / n_notas
promedio_int = int(round(promedio))
print 'El promedio de sus', n_notas, 'notas es', promedio_int


Ingrese notas separadas con espacio
Notas: 55 100 55 100 55 100
El promedio de sus 6 notas es 78

Problema 1

Realice un programa computacional que calcule el factorial de un entero positivo provisto por el usuario.

Ingrese un entero positivo: 3
El factorial de 3 es 6


Ingrese un entero positivo: 4
El factorial de 4 es 24

Ingrese un entero positivo: 5
El factorial de 5 es 120

Ingrese un entero positivo: 20
El factorial de 20 es 2432902008176640000

Problema 1 - Solución estudiantes

Realice un programa computacional que calcule el factorial de un entero positivo provisto por el usuario.


In [19]:
# Solucion estudiantes
N = int(raw_input("Ingrese un entero positivo: "))
j = 1 # contador
N_factorial = 1 # resultado
while j<=N:
    N_factorial=N_factorial*j
    j+=1
print "El factorial de", N, "es", N_factorial


Ingrese un entero positivo: 0
El factorial de 0 es 1

Problema 1 - Solución

Realice un programa computacional que calcule el factorial de un entero positivo provisto por el usuario.


In [ ]:
N = int(raw_input("Ingrese un entero positivo: "))
j = 1 # contador
N_factorial = 1 # resultado
while j<=N:
    N_factorial = N_factorial * j
    j = j +1
print "El factorial de", N, "es", N_factorial

Problema 1 - Ruteo


In [ ]:
N = int(raw_input("Ingrese un entero positivo: "))
j = 1 # contador
N_factorial = 1 # resultado
while j<=N:
    N_factorial = N_factorial * j
    j = j +1
print "El factorial de", N, "es", N_factorial
Globales Locales

Problema 2

Implemente una función que imprima los $n$ primeros números de fibonacci.

fibonacci(12)
1 1 2 3 5 8 13 21 34 55 89 144

In [ ]:
# Solucion estudiantes








fibonacci(12)

Problema 2 - Solución

Implemente una función que imprima los $n$ primeros números de fibonacci.


In [25]:
def fibonacci(n):
    a = 1
    print a, 
    b = 1
    print b,
    count = 2
    while count < n:
        aux = a
        a = b
        b = aux + b
        count += 1
        print b,
    print ""
        
fibonacci(5)
fibonacci(10)
fibonacci(20)
fibonacci(-1)


1
1
2
3
5

1
1
2
3
5
8
13
21
34
55

1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765

1
1

Problema 2 - Ruteo


In [26]:
def fibonacci(n):
    a = 1
    b = 1
    fib = str(a) + " " + str(b) 
    count = 2
    while count < n:
        aux = a
        a = b
        b = aux + b
        count += 1
        fib += " " + str(b)
    return fib
        
n = 5
print fibonacci(n)


1 1 2 3 5
Globales Locales

Problema 3

Implemente la función suma_cuadrados que sume los primeros cuadrados perfectos menores a un número $n$.

Ejemplo de output

print suma_cuadrados(6)
91

print suma_cuadrados(100)
385

print suma_cuadrados(500)
3795

Forma de cálculo

suma_cuadrados(0):   0 = 0
suma_cuadrados(1):   1 = 0 + 1
suma_cuadrados(2):   5 = 0 + 1 + 4
suma_cuadrados(3):   14 = 0 + 1 + 4 + 9
suma_cuadrados(4):   30 = 0 + 1 + 4 + 9 + 16
suma_cuadrados(5):   55 = 0 + 1 + 4 + 9 + 16 + 25
suma_cuadrados(6):   91 = 0 + 1 + 4 + 9 + 16 + 25 + 36

Problema 3 - Solución Estudiantes

Implemente la función suma_cuadrados que sume los primeros cuadrados perfectos menores a un número $n$.


In [ ]:
# FIX ME

Problema 3 - Solución

Implemente una función suma_cuadrados que sume los primeros cuadrados perfectos menores a un número $n$.


In [ ]:
def suma_cuadrados(n):
    j = 0
    suma = 0
    while j**2 <= n:
        suma = suma + j**2
        j += 1
    return suma

print suma_cuadrados(5)
print suma_cuadrados(10)
print suma_cuadrados(100)
print suma_cuadrados(500)

Problema 3 - Ruteo


In [ ]:
def suma_cuadrados(n):
    j = 0
    suma = 0
    while j**2 <= n:
        suma = suma + j**2
        j += 1
    return suma

print suma_cuadrados(5)
Globales Locales

In [ ]:
def suma_cuadrados_explained(n):
    j = 0
    suma = 0
    while j**2 <= n:
        suma = suma + j**2
        print str(suma) + " = " + " + ".join([str(i**2) for i in range(j+1)]) 
        j += 1
    return suma

suma_cuadrados_explained(100)

Minitarea 2

Elegir al menos uno de los ejercicios propuestos en http://progra.usm.cl/apunte/ejercicios/1/index.html en la sección de Ciclos:

  • Múltiplos
  • Potencias de dos
  • Suma entre números
  • Tabla de multiplicar
  • Divisores
  • Tiempo de viaje
  • Dibujos de asteriscos
  • Calcular $\pi$
  • Suma de fracciones
  • Calcular $e$
  • Secuencia de Collatz