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

In [ ]:






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.

Grupos para la Actividad 2

  • CANTILLANA, CASTRO, ARÉVALO
  • GALLARDO, MORALES, ZEGERS
  • ALMEIDA, ARRATIA, CANALES
  • ALVARADO, BAHAMONDE, CASTILLO
  • CARRIEL, CODDOU, ESTRADA
  • CATALAN, COLLAO, ETEROVIC
  • CHAURA, CURIHUAL, FLORES
  • ESTAY, DURÁN, GRUNERT
  • KANZUA, HERRERA, LÓPEZ C.
  • LOBOS, OGALDE, PÉREZ
  • LOPEZ, PROBOSTE, REQUENA
  • SALAS, SANTELICES, TORREBLANCA
  • MEDIANO, REYES
  • SCHWERTER, SANDOVAL

Consejos para la Actividad 2

  • Revisar funciones y ciclo while.
  • Juntarse a practicar como grupo.
  • Inventar e intentar problemas nuevos.

Desafío

Desarrolle una función que pregunte nombre, rol y promedio de estudiantes, hasta que se ingresa el texto "STOP" en alguna de las preguntas anteriores. Luego, debe imprimir en pantalla:

  • Número de estudiantes válidamente ingresados.
  • Promedio de los estudiantes válidamente ingresados.
  • Alumno y rol con el menor promedio.
  • Alumno y rol con el mayor promedio.

¿Qué contenido aprenderemos?

  • Patrones comunes de ciclo while

¿Porqué aprenderemos ese contenido?

  • Patrones comunes de ciclo while

Porque sólo existen unos pocos tipos de ejercicios.

Aprender los distintos patrones ayudan a identificar el tipo de problema y solucionarlo más fácilmente.

Patrones Comunes de Ciclo While

  1. Patrón para sumar.
  2. Patrón para multiplicar.
  3. Patrón para contar.
  4. Patrón para máximos y mínimos
  5. Patrón para pares de cosas.

1. Patrón para sumar

El patrón común para sumar cosas:

suma = 0
ciclo:
    x = calcular()
    suma = suma + x

1. Patrón para sumar

Ejemplo 1.1

Calcule la suma de los primeros $M$ enteros positivos: $$1 + 2 + ... + M$$


In [15]:
M = int(raw_input("Ingrese número: "))
suma = 0
j = 1
while (j<=M):
    x = j
    suma = suma + x
    j = j +1
print suma


Ingrese número: 10
55

1. Patrón para sumar

Ejemplo 1.2

Calcule la suma de los primeros $M$ enteros positivos al cubo: $$1^3 + 2^3 + ... + M^3$$


In [16]:
M = int(raw_input("Ingrese número: "))
suma = 0
j = 1
while (j<=M):
    x = j**3
    suma = suma + x
    j = j +1
print suma


Ingrese número: 3
36

1. Patrón para sumar

Ejemplo 1.3

Calcule la suma de los recíprocos de los primeros $M$ enteros: $$ \frac{1}{1} + \frac{1}{2} + ... + \frac{1}{M}$$


In [19]:
M = int(raw_input("Ingrese número: "))
suma = 0
j = 1
while (j<=M):
    x = 1./j
    suma = suma + x
    j = j +1
print suma


Ingrese número: 10
2.92896825397

1. Patrón para sumar

Ejemplo 1.4

Calcule $\pi$ mediante la siguente fórmula: $$ \pi = 4 \Big(\frac{1}{1} - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + ... \Big)$$ Utilice M términos en la aproximación.


In [26]:
M = int(raw_input("Ingrese número de términos: "))
suma = 0
j = 1
while (j<=M):
    n = 2*j-1
    signo = (-1)**(j+1)
    x = 4*float(signo)/float(n)
    #print signo, n
    suma = suma + x
    j = j +1
print suma


Ingrese número de términos: 100
3.13159290356

2. Patrón para multiplicar

El patrón común para sumar cosas:

prod = 1
ciclo:
    x = calcular()
    prod = prod * x

1. Patrón para multiplicar

Ejemplo 2.1

Calcule el factorial de $M$: $$ M! = 1 \cdot 2 \cdot 3 \cdot \ \dots\ \cdot (M-1) \cdot M = M \cdot (M-1) \cdot \ \dots \ \cdot 3 \cdot 2 \cdot 1$$


In [31]:
M = int(raw_input("Ingrese número M: "))
prod = 1
j = 1
while (j<=M):
    x = j
    prod = prod * x
    j = j + 1
print prod


Ingrese número M: 5
120

In [32]:
M = int(raw_input("Ingrese número M: "))
prod = 1
j = M
while (j>0):
    x = j
    prod = prod * x
    j = j - 1
print prod


Ingrese número M: 5
120

2. Patrón para multiplicar

Ejemplo 2.1

Calcule el factorial de $M$: $$ M! = 1 \cdot 2 \cdot 3 \cdot \ \dots\ \cdot (M-1) \cdot M = M \cdot (M-1) \cdot \ \dots \ \cdot 3 \cdot 2 \cdot 1$$

3. Patrón para contar

El patrón común para contar cosas:

cuenta = 0
ciclo:
    if algo:
        cuenta = cuenta + 1

3. Patrón para contar

Ejemplo 3.1

Cuente los números pares en el intervalo [N,M], con N y M números enteros positivos


In [6]:
print("Ingrese 2 números N y M, con N<M")
N = int(raw_input("Ingrese numero N: "))
M = int(raw_input("Ingrese numero M: "))
j = N
count = 0
while j<=M:
    if j%2==0:
        count = count + 1
    j = j +1
print "Hay", count, "numeros pares entre ", N, "y", M


Ingrese 2 números N y M, con N<M
Ingrese numero N: 6
Ingrese numero M: 8
Hay 2 numeros pares entre  6 y 8

3. Patrón para contar

Ejemplo 3.1

Cuente los números primos entre 2 y el entero positivo $M$.


In [49]:
def es_primo(n):
    j = 2
    while (j<n):
        if n%j==0:
            return False
        j = j+1
    return True

M = int(raw_input("Ingrese numero M: "))
j = 2
count = 0
while j<=M:
    if es_primo(j):
        count = count + 1
    j = j +1
print "Hay", count, "numeros primos entre 2 y", M


Ingrese numero M: 10
Hay 4 numeros primos entre 2 y 10

4. Patrón para máximos

El patrón común para hallar máximos:

mayor = numero_muy_pequeño
ciclo:
    n = calcular()
    mayor = max(mayor, n)

o equivalentemente

mayor = numero_muy_pequeño
ciclo:
    x = calcular()
    if x>mayor:
        mayor = x

4. Patrón para mínimos

El patrón común para hallar mínimos:

menor = numero_muy_GRANDE
ciclo:
    x = calcular()
    menor = min(menor, x)

o equivalentemente

menor = numero_muy_GRANDE
ciclo:
    x = calcular()
    if x<menor:
        menor = x

4. Patrón para máximos o mínimos

Ejemplo 4.1

Escriba una función que reciba como parámetro la cantidad de números a ingresar, luego solicite los números enteros positivos y retorne el número mayor ingresado.


In [7]:
def mayor(n):
    print "Ingrese los números"
    mayor = -1
    c = 1
    while c <= n:
        a = int(raw_input())
        if a > mayor:
            mayor = a
        c = c + 1
    return mayor

M = int(raw_input('Cuantos datos: '))
mm = mayor(M)
print "El mayor es", mm


Cuantos datos: 4
Ingrese los números
10
100
25
1
El mayor es 100

In [67]:
def mayor(n):
    print "Ingrese los números"
    mayor = -1
    c = 1
    while c <= n:
        a = int(raw_input())
        mayor = max(mayor, a)
        c = c + 1
    return mayor

M = int(raw_input('Cuantos datos: '))
mm = mayor(M)
print "El mayor es", mm


Cuantos datos: 4
Ingrese los números
10
20
30
1000
El mayor es 1000

4. Patrón para máximos o mínimos

Ejemplo 4.2

Escriba una función que pida al usuario ingresar varios números reales hasta que se ingrese "STOP", la función no recibe parámetro y retorna cuál fue el valor menor ingresado.


In [12]:
def menor():
    print "Ingrese números"
    num_menor = float('inf')
    while True:
        input_str = raw_input()
        if input_str == "STOP":
            break
        else:
            x = float(input_str)
            num_menor = min(num_menor, x)
            #continue
            #print 1/0
    return num_menor 

m = menor()
print 'El menor es', m


Ingrese números
0
STOP
El menor es 0.0

4. Patrón para máximos o mínimos

Ejemplo 4.3

Escriba una función que pida al usuario ingresar varios números reales hasta que se ingrese "STOP". La función retorna el número con el mayor valor absoluto ingresado:


In [13]:
def mayor_en_abs():
    print "Ingrese números"
    mayor_en_abs = 0
    continuar = True
    while continuar:
        input_str = raw_input()
        if input_str == "STOP":
            continuar = False
        else:
            x = float(input_str)
            if abs(x) >  abs(mayor_en_abs):
                mayor_en_abs = x
    return mayor_en_abs

m = mayor_en_abs()
print 'El numero de mayor valor absoluto fue', m


Ingrese números
-100
100
-223
322
stop
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-13-9fb36d7b1a2b> in <module>()
     13     return mayor_en_abs
     14 
---> 15 m = mayor_en_abs()
     16 print 'El numero de mayor valor absoluto fue', m

<ipython-input-13-9fb36d7b1a2b> in mayor_en_abs()
      8             continuar = False
      9         else:
---> 10             x = float(input_str)
     11             if abs(x) >  abs(mayor_en_abs):
     12                 mayor_en_abs = x

ValueError: could not convert string to float: stop

5. Patrón para operar en pares de cosas

El patrón común para operar en pares de cosas es:

inicializar i
while i<N:
    inicializar j
    while j<M:
        x = hacer algo con i y j
        hacer algo con x
        j = j +1
    i = i+1

5.1 Patrón para operar en pares de cosas

Ejemplo 5.1

Escriba un programa que muestre todas las combinaciones de dos dados que entreguen un puntaje mayor que siete.


In [15]:
i=1
puntaje = 1
while i<=6:
    j=1
    while j<=6:
        if i + j > puntaje:
            print i, "+", j, "=", i+j, "> ", puntaje
        j+=1
    i+=1


1 + 1 = 2 >  1
1 + 2 = 3 >  1
1 + 3 = 4 >  1
1 + 4 = 5 >  1
1 + 5 = 6 >  1
1 + 6 = 7 >  1
2 + 1 = 3 >  1
2 + 2 = 4 >  1
2 + 3 = 5 >  1
2 + 4 = 6 >  1
2 + 5 = 7 >  1
2 + 6 = 8 >  1
3 + 1 = 4 >  1
3 + 2 = 5 >  1
3 + 3 = 6 >  1
3 + 4 = 7 >  1
3 + 5 = 8 >  1
3 + 6 = 9 >  1
4 + 1 = 5 >  1
4 + 2 = 6 >  1
4 + 3 = 7 >  1
4 + 4 = 8 >  1
4 + 5 = 9 >  1
4 + 6 = 10 >  1
5 + 1 = 6 >  1
5 + 2 = 7 >  1
5 + 3 = 8 >  1
5 + 4 = 9 >  1
5 + 5 = 10 >  1
5 + 6 = 11 >  1
6 + 1 = 7 >  1
6 + 2 = 8 >  1
6 + 3 = 9 >  1
6 + 4 = 10 >  1
6 + 5 = 11 >  1
6 + 6 = 12 >  1

5. Patrón para operar en pares de cosas

Ejemplo 5.2

Escriba un programa que dibuje un rectangulo de altura $N\geq 2$ y lado $M\geq 2$, con el patrón indicado:

Para N = 4 y M = 10

*---------*
|         |
|         |
*---------*

In [17]:
print("Ingrese 2 números altura>1 y ancho>1")
N = int(raw_input("Ingrese altura: "))
M = int(raw_input("Ingrese ancho: "))
i = 1
print ""
while i<=N:
    j = 1
    while j<=M:
        # End of ascii art
        if i==1 or i==N:
            if j==1 or j==M:
                print "*",
            else:
                print "-",
        else:
            if j==1 or j==M:
                print "|",
            else:
                print " ",
        # End of ascii art
        j = j +1
    print ""
    i = i + 1


Ingrese 2 números altura>1 y ancho>1
Ingrese altura: 10
Ingrese ancho: 10

* - - - - - - - - * 
|                 | 
|                 | 
|                 | 
|                 | 
|                 | 
|                 | 
|                 | 
|                 | 
* - - - - - - - - * 

5. Patrón para operar en pares de cosas

Ejemplo 5.1

Escriba un programa que dibuje un rectangulo de altura $N\geq 2$ y lado $M\geq 2$, con el patrón indicado:

Para N = 4 y M = 10

*---------*
|         |
|         |
*---------*

In [18]:
# Solucion 2
print("Ingrese 2 números N>1 y M>1")
N = int(raw_input("Ingrese altura: "))
M = int(raw_input("Ingrese ancho: "))
i = 1
while i<=N:
    if (i==1) or (i==N):
        print "*" + "-"*(M-2) + "*"
    else:
        print "|" + " "*(M-2) + "|"
    i = i + 1


Ingrese 2 números N>1 y M>1
Ingrese altura: 5
Ingrese ancho: 5
*---*
|   |
|   |
|   |
*---*

Desafío

Desarrolle una función que pregunte nombre, rol y promedio de estudiantes, hasta que se ingresa el texto "STOP" en alguna de las preguntas anteriores. Luego, debe imprimir en pantalla:

  • Número de estudiantes validamente ingresados.
  • Promedio de los estudiantes validamente ingresados.
  • Alumno y rol con el menor promedio.
  • Alumno y rol con el mayor promedio.

Análisis

  • ¿Cantidad de input? ¿Tipos de los inputs?
  • ¿Cantidad de outputs? ¿Tipos de los outputs?
  • ¿Requerimientos especiales?
  • ¿Cómo estructuramos el problema?

In [ ]:
# BORRADOR

# Inicializacion variables

# CICLO WHILE
while ALGO:
    LEER
    ACTUALIZAR VARIABLES
    
# IMPRIMIR RESULTADOS

In [19]:
# Inicializacion
cantidad_notas = 0
suma_notas = 0
peor_alumno = ""
peor_rol = ""
peor_nota = 101
mejor_alumno = ""
mejor_rol = ""
mejor_nota = -1

while True:
    alumno = raw_input("Nombre del alumno :")
    if alumno == "STOP":
        break
    rol = raw_input("Rol del alumno :")
    if rol == "STOP":
        break
    nota = raw_input("Nota del alumno :")
    if nota == "STOP":
        break
    else:
        nota = float(nota)
    # Si llegamos aqui, alumno, rol y nota estan bien definidos
    # Actualizar cantidad de notas
    cantidad_notas += 1
    # Actualizar suma de notas
    suma_notas += nota
    # Actualizar peor alumno
    if nota < peor_nota:
        peor_alumno = alumno
        peor_rol = rol
        peor_nota = nota
    # Actualizar peor alumno
    if nota > mejor_nota:
        mejor_alumno = alumno
        mejor_rol = rol
        mejor_nota = nota

# Imprimir resultado
print ""
print "RESULTADOS:"
print "Se ingresaron", cantidad_notas, "alumnos"
print "El promedio de notas es ", suma_notas/cantidad_notas
print "El peor alumno es", peor_alumno, peor_rol, "con nota", peor_nota
print "El mejor alumno es", mejor_alumno, mejor_rol, "con nota", mejor_nota


Nombre del alumno :Mel
Rol del alumno :2001555-6
Nota del alumno :100
Nombre del alumno :Pericles
Rol del alumno :adssoj1ioiiodaj200
Nota del alumno :5
Nombre del alumno :Don Fede
Rol del alumno :1-1
Nota del alumno :99
Nombre del alumno :Jose
Rol del alumno :STOP

RESULTADOS:
Se ingresaron 3 alumnos
El promedio de notas es  68.0
El peor alumno es Pericles adssoj1ioiiodaj200 con nota 5.0
El mejor alumno es Mel 2001555-6 con nota 100.0