In [ ]:
"""
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())






IWI131

Programación de Computadores

Sebastián Flores

http://progra.usm.cl/

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

Clase anterior

  • Ejercicios de ciclo while.

¿Preguntas?

Próximamente...

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

¿Qué haremos?

  • Todos los ejercicios de while que sean posibles.

¿Porqué aprenderemos ese contenido?

  • Todos los ejercicios de while que sean posibles.

La práctica hace al maestro

Minitareas

  1. Múltiplos
  2. Potencias de dos
  3. Suma entre números
  4. Tabla de multiplicar
  5. Divisores
  6. Tiempo de viaje
  7. Dibujos de asteriscos
  8. $\pi$
  9. Suma de fracciones
  10. $e$
  11. Secuencia de Collatz

1. Múltiplos

Escriba un programa que muestre la tabla de multiplicar del 1 al 10 del número ingresado por el usuario:

Ingrese un numero: 9
9 x 1 = 9
9 x 2 = 18
9 x 3 = 27
9 x 4 = 36
9 x 5 = 45
9 x 6 = 54
9 x 7 = 63
9 x 8 = 72
9 x 9 = 81
9 x 10 = 90

1. Múltiplos

Escriba un programa que muestre la tabla de multiplicar del 1 al 10 del número ingresado por el usuario.

Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

1. Múltiplos

Escriba un programa que muestre la tabla de multiplicar del 1 al 10 del número ingresado por el usuario.


In [ ]:
c=int(raw_input("ingrese numero:"))
n=1
while n<=10:
    p=c*n
    print p,
    n=n+1

1. Múltiplos

Escriba un programa que muestre la tabla de multiplicar del 1 al 10 del número ingresado por el usuario.


In [ ]:
# Solución
N = int(raw_input("Ingrese un numero: "))
M = 20
j = 1
while j<=M:
    print N, "x", j, "=", N*j
    j += 1

2. Potencias de dos

Escriba un programa que genere todas las potencias de 2, desde la 0-ésima hasta la ingresada por el usuario:

Ingrese num: 10
1 2 4 8 16 32 64 128 256 512 1024

Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

2. Potencias de dos

Escriba un programa que genere todas las potencias de 2, desde la 0-ésima hasta la ingresada por el usuario.


In [ ]:
N=int(raw_input("ingrese un numero: "))
j=0
while j<=N:
    print 2**j,
    j+=1

2. Potencias de dos

Escriba un programa que genere todas las potencias de 2, desde la 0-ésima hasta la ingresada por el usuario.


In [ ]:
# Solución
N = int(raw_input("Ingrese num: "))
j = 0
while j<=N:
    print 2**j,
    j += 1

3. Suma entre números

Escriba un programa que pida al usuario dos números enteros, y luego entregue la suma de todos los números que están entre ellos. Por ejemplo, si los números son 1 y 7, debe entregar como resultado 2 + 3 + 4 + 5 + 6 = 20.

Ingrese num: 1
Ingrese num: 7
La suma es 20


Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

3. Suma entre números

Escriba un programa que pida al usuario dos números enteros, y luego entregue la suma de todos los números que están entre ellos.


In [ ]:
# Solucion estudiantes
n = int(raw_input("ingrese primer numero: "))
m = int(raw_input("ingrese segundo numero: "))
j = n + 1
suma = 0

while j < m:
    suma = suma + j
    j = j + 1
    
print "la suma entre los numeros", n, "y", m, "es", suma

3. Suma entre números

Escriba un programa que pida al usuario dos números enteros, y luego entregue la suma de todos los números que están entre ellos.


In [ ]:
# Solucion
def print_suma(N,M):
    j = N+1
    suma = 0
    while j<M:
        suma = suma + j
        j += 1
    print "La suma es ", suma
    return suma

n = int(raw_input("Ingrese num: "))
m = int(raw_input("Ingrese num: "))
print_suma(n,m)

4. Tabla de Multiplicar

Escriba un programa que muestre una tabla de multiplicar como la siguiente:

 1   2   3   4   5   6   7   8   9  10
 2   4   6   8  10  12  14  16  18  20
 3   6   9  12  15  18  21  24  27  30
 4   8  12  16  20  24  28  32  36  40
 5  10  15  20  25  30  35  40  45  50
 6  12  18  24  30  36  42  48  54  60
 7  14  21  28  35  42  49  56  63  70
 8  16  24  32  40  48  56  64  72  80
 9  18  27  36  45  54  63  72  81  90
10  20  30  40  50  60  70  80  90 100

Los números deben estar alineados a la derecha.

4. Tabla de Multiplicar

Escriba un programa que muestre una tabla de multiplicar.

Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

4. Tabla de Multiplicar

Escriba un programa que muestre una tabla de multiplicar.


In [ ]:
# Solución estudiantes

4. Tabla de Multiplicar

Escriba un programa que muestre una tabla de multiplicar.


In [ ]:
i = 1
while i<=10:
    j = 1
    while j<=10:
        print "%3d" %(i*j),
        #print i*j,
        j += 1
    print ""
    i += 1

5. Divisores

Escriba un programa que entregue todos los divisores del número entero ingresado:

Ingrese numero: 200
1 2 4 5 8 10 20 25 40 50 100 200


Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

5. Divisores

Escriba un programa que entregue todos los divisores del número entero ingresado.


In [ ]:
# Solución estudiantes
n=int(raw_input('Ingrese un numero: '))
i=1
while i<=n:
    if n%i==0:
        print i,
    i+=1

5. Divisores

Escriba un programa que entregue todos los divisores del número entero ingresado.


In [ ]:
# Solucion
N = int(raw_input("Ingrese numero: "))
j = 1
while j<=N:
    if (N%j==0):
        print j, 
    j += 1

6. Tiempo de viaje

Un viajero desea saber cuánto tiempo tomó un viaje que realizó. Él tiene la duración en minutos de cada uno de los tramos del viaje.

Desarrolle un programa que permita ingresar los tiempos de viaje de los tramos y entregue como resultado el tiempo total de viaje en formato horas:minutos.

El programa deja de pedir tiempos de viaje cuando se ingresa un 0.

6. Tiempo de viaje

Duracion tramo: 15
Duracion tramo: 30
Duracion tramo: 87
Duracion tramo: 0
Tiempo total de viaje: 2:12 horas

Duracion tramo: 51
Duracion tramo: 17
Duracion tramo: 0
Tiempo total de viaje: 1:08 horas

6. Tiempo de viaje

Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

6. Tiempo de viaje

Un viajero desea saber cuánto tiempo tomó un viaje que realizó. Él tiene la duración en minutos de cada uno de los tramos del viaje.

Desarrolle un programa que permita ingresar los tiempos de viaje de los tramos y entregue como resultado el tiempo total de viaje en formato horas:minutos.

El programa deja de pedir tiempos de viaje cuando se ingresa un 0.


In [ ]:
# Solucion estudiantes

6. Tiempo de viaje

Un viajero desea saber cuánto tiempo tomó un viaje que realizó. Él tiene la duración en minutos de cada uno de los tramos del viaje. Desarrolle un programa que permita ingresar los tiempos de viaje de los tramos y entregue como resultado el tiempo total de viaje en formato horas:minutos.


In [ ]:
duracion_tramo = -1
suma_tramos = 0
while duracion_tramo!=0:
    duracion_tramo = int(raw_input("Duracion tramo: "))
    suma_tramos += duracion_tramo
horas = suma_tramos/60
minutos = suma_tramos%60
print "Tiempo total de viaje: %d:%2d horas" %(horas, minutos)

7.1 Dibujos de asteriscos

Escriba un programa que pida al usuario ingresar la altura y el ancho de un rectángulo y lo dibuje utilizando asteriscos:

Altura: 3
Ancho: 5

*****
*****
*****

7.1 Dibujos de asteriscos

Escriba un programa que pida al usuario ingresar la altura y el ancho de un rectángulo y lo dibuje utilizando asteriscos.


In [ ]:
altura = int(raw_input("Altura: "))
ancho = int(raw_input("Ancho: "))
j = 1
while j<=altura:
    print "*"*ancho
    j += 1

7.2 Dibujos de asteriscos

Escriba un programa que dibuje el triángulo del tamaño indicado por el usuario de acuerdo al ejemplo:

Altura: 5

*
**
***
****
*****

7.2 Dibujos de asteriscos

Escriba un programa que dibuje el triángulo del tamaño indicado por el usuario de acuerdo al ejemplo.


In [ ]:
altura = int(raw_input("Altura: "))
# Mitad superior
j = 1
while j<=altura:
    print "*"*(j)
    j += 1

7.3 Dibujos de asteriscos

Escriba un programa que dibuje el hexágono del tamaño indicado por el usuario de acuerdo al ejemplo:

Lado: 4

   ****
  ******
 ********
**********
 ********
  ******
   **** 

7.3 Dibujos de asteriscos

Escriba un programa que dibuje el hexágono del tamaño indicado por el usuario de acuerdo al ejemplo.


In [ ]:
lado = int(raw_input("Lado: "))
# Calculos previos
ancho_max = lado + 2*(lado-1)
# Mitad superior
j = 1
while j<lado:
    ancho = lado + 2*j - 2
    espacio = (ancho_max - ancho)/2
    print " "*espacio + "*"*ancho
    j += 1
# Linea del medio
print "*" * ancho_max
# Mitad inferior
j = 1
while j<lado:
    espacio = j
    ancho = ancho_max - 2*j
    print " "*espacio + "*"*ancho
    j += 1

8. $\pi$

Desarrolle un programa para estimar el valor de π usando la siguiente suma infinita:

$$ \pi = 4 \Big(\frac{1}{1} - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ... \Big)$$

La entrada del programa debe ser un número entero n que indique cuántos términos de la suma se utilizará.

n: 3
3.466666666666667

n: 1000
3.140592653839794 

8. $\pi$

Desarrolle un programa para estimar el valor de π usando la siguiente suma infinita:

$$ \pi = 4 \Big(\frac{1}{1} - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ... \Big)$$

La entrada del programa debe ser un número entero n que indique cuántos términos de la suma se utilizará.

Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

8. $\pi$

Desarrolle un programa para estimar el valor de $\pi$ usando la siguiente suma infinita $ \pi = 4 \Big(\frac{1}{1} - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ... \Big)$.

La entrada del programa debe ser un número entero n que indique cuántos términos de la suma se utilizará.


In [ ]:
# Solución estudiantes
n = int(raw_input('Ingrese cantidad de terminos: '))
i = 0
suma = 0
termino = 1.0/()
while i < n:
    suma += ((-1)**i)*

8. $\pi$

Desarrolle un programa para estimar el valor de $\pi$ usando la siguiente suma infinita $ \pi = 4 \Big(\frac{1}{1} - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ... \Big)$.

La entrada del programa debe ser un número entero n que indique cuántos términos de la suma se utilizará.


In [ ]:
M = int(raw_input("n: "))
suma = 0
j = 0
while (j<M):
    n = 2*j+1
    signo = (-1)**j
    x = 4*float(signo)/float(n)
    #print signo, n
    suma = suma + x
    j = j +1
print suma

9. Suma de fracciones

Desarrolle un programa que permita trabajar con las potencias fraccionales de dos, es decir $ \frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \frac{1}{16}, \frac{1}{32}, \frac{1}{64}, ...$ en forma decimal $ 0.5$, $0.25$, $0.125$, $0.0625$, $0.03125$, $0.015625$, ...

El programa debe mostrar tres columnas que contengan la siguiente información:

Potencia  Fraccion  Suma
1         0.5       0.5
2         0.25      0.75
3         0.125     0.875
4         0.0625    0.9375
...       ...       ...

El programa debe terminar cuando la fracción decimal sea menor o igual a 0.000001.

9. Suma de fracciones

Desarrolle un programa que permita trabajar con las potencias fraccionales de dos, es decir $ \frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \frac{1}{16}, \frac{1}{32}, \frac{1}{64}, ...$ en forma decimal $ 0.5$, $0.25$, $0.125$, $0.0625$, $0.03125$, $0.015625$, ...

El programa debe mostrar tres columnas y debe terminar cuando la fracción decimal sea menor o igual a 0.000001.

Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

9. Suma de fracciones

Desarrolle un programa que permita trabajar con las potencias fraccionales de dos, es decir $ \frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \frac{1}{16}, \frac{1}{32}, \frac{1}{64}, ...$ en forma decimal $ 0.5$, $0.25$, $0.125$, $0.0625$, $0.03125$, $0.015625$, ...

El programa debe mostrar tres columnas y debe terminar cuando la fracción decimal sea menor o igual a 0.000001.


In [ ]:
# Solución estudiantes

9. Suma de fracciones

Desarrolle un programa que permita trabajar con las potencias fraccionales de dos, es decir $ \frac{1}{2}, \frac{1}{4}, \frac{1}{8}, \frac{1}{16}, \frac{1}{32}, \frac{1}{64}, ...$ en forma decimal $ 0.5$, $0.25$, $0.125$, $0.0625$, $0.03125$, $0.015625$, ...

El programa debe mostrar tres columnas y debe terminar cuando la fracción decimal sea menor o igual a 0.000001.


In [ ]:
print "Potencia  Fraccion  Suma"
j = 1
suma = 0
while (1./2**j)>0.00001:
    n = 2**j
    suma = suma + 1./n
    print j, "  ", 1./n, "  ", suma
    j += 1

10. Número de Euler

El número de Euler, $e ≈ 2,71828...$ puede ser representado como la siguiente suma infinita $e=\frac{1}{0!}+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+...$

Desarrolle un programa que entregue un valor aproximado de e, calculando esta suma hasta que la diferencia entre dos sumandos consecutivos sea menor que $0,0001$.

Recuerde que el factorial n! es el producto de los números de 1 a n.

Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

10. Número de Euler

El número de Euler, $e ≈ 2,71828...$ puede ser representado como la siguiente suma infinita $e=\frac{1}{0!}+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+\frac{1}{4!}+...$ Desarrolle un programa que entregue un valor aproximado de e, calculando esta suma hasta que la diferencia entre dos sumandos consecutivos sea menor que $0,0001$.


In [ ]:
# Solución estudiantes

10. Número de Euler

Desarrolle un programa que entregue un valor aproximado de e, calculando esta suma hasta que la diferencia entre dos sumandos consecutivos sea menor que $0,0001$.


In [ ]:
# Solucion
def factorial(n):
    j = 1
    prod = 1
    while j<=n:
        prod *= j
        j += 1
    return prod

e = 1./factorial(0) + 1./factorial(1) + 1./factorial(2)
i = 3
diff = 1.0 # differencia inicial es grande
while (diff > 0.0001):
    e += 1./factorial(i)
    diff = 1./factorial(i-1) - 1./factorial(i)
    i += 1
    
print e

11. Secuencia de Collatz (Parte 1)

Usando computadores, se ha verificado que la sucesión efectivamente llega a 1 partiendo desde cualquier número natural menor que $2^{58}$.

Desarrolle un programa que entregue la secuencia de Collatz de un número entero:

n: 18
18 9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
n: 19
19 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
n: 20
20 10 5 16 8 4 2 1

11. Secuencia de Collatz (Parte 1)

Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

11. Secuencia de Collatz (Parte 1)

Desarrolle un programa que entregue la secuencia de Collatz de un número entero.


In [ ]:
# Solucion estudiantes

11. Secuencia de Collatz (Parte 1)

Desarrolle un programa que entregue la secuencia de Collatz de un número entero.


In [ ]:
# Solución
n = int(raw_input("n: "))
print n,
while n!=1:
    if n%2==0:
        n = n/2
    else:
        n = 3*n + 1
    print n,

11. Secuencia de Collatz (Parte 2)

Desarrolle un programa que grafique los largos de las secuencias de Collatz de los números enteros positivos menores que el ingresado por el usuario:

n: 10
1 *
2 **
3 ********
4 ***
5 ******
6 *********
7 *****************
8 ****
9 ********************
10 *******

11. Secuencia de Collatz (Parte 2)

Análisis

  • ¿Cuántos inputs se necesitan? ¿De qué tipo?
  • ¿Cuántos outputs se necesitan? ¿De qué tipo?
  • ¿Se solicita algo extra (funcion/ruteo/print, etc.)?

11. Secuencia de Collatz (Parte 2)

Desarrolle un programa que grafique los largos de las secuencias de Collatz de los números enteros positivos menores que el ingresado por el usuario.


In [ ]:
# Solucion 1
def largo_secuencia_collatz(n):
    print "*",
    while n!=1:
        if n%2==0:
            n = n/2
        else:
            n = 3*n + 1
        print "*",
        
n = int(raw_input("n: "))
j = 1
while j<=n:
    print j,
    largo_secuencia_collatz(j)
    j += 1
    print ""

11. Secuencia de Collatz (Parte 2)

Desarrolle un programa que grafique los largos de las secuencias de Collatz de los números enteros positivos menores que el ingresado por el usuario.


In [ ]:
# Solucion 2
def largo_secuencia_collatz(n):
    largo = 1
    while n!=1:
        if n%2==0:
            n = n/2
        else:
            n = 3*n + 1
        largo += 1
    return largo
        
n = int(raw_input("n: "))
j = 1
while j<=n:
    print j, "*"*largo_secuencia_collatz(j)
    j += 1