IWI131 Programación


Estructuras Repetitivas y Ciclos



Departamento de Informática
Universidad Técnica Federico Santa María

Sentencias Cíclicas

Permiten realizar un conjunto instrucciones reiterativamente. Esta reiteración puede:

  • Ser una cantidad de terminada de veces.
  • Hasta que una condición se cumpla.

OJO: Notése que una cantidad finita de veces puede ser representada como condición.

Ciclo while

El ciclo while ejecuta una secuencia de instrucciones mientras una condición sea verdadera.

Sintaxis:

while cond:
    sentencias mientras la cond sea verdadera

La Indentación después de la instrucción while indica que cosas se realizarán reiterativamente si se cumple la condición.

Recordatorio/Reminder

La instrucción while equivalente al bloque repeat-while de trinket.

La indentación es equivalente a utilizar el espacio de rompecabezas interno en bloque repeat-while de Trinket (después de do).

In [23]:
from IPython.display import IFrame
IFrame('https://trinket.io/embed/blocks/773558e03a?hideGeneratedCode=true', width="75%", height=250)
Out[23]:

Ciclo while: Diagrama de flujo explicativo

Conceptos y detalles importantes

Sintaxis:

while cond:
    sentencias mientras la cond sea verdadera
  • Iteración: es una ejecución del cuerpo del ciclo. Cada vez que se ejecuten las sentencias del ciclo se habla de iteración.
  • La condición es evaluada antes de cada iteración.
  • Si la condición es inicialmente falsa, el ciclo no se ejecutará.

¿Entendemos while?

  • ¿Qué realiza el siguiente ejemplo?
In [2]:
m = int(input("m: "))
n = int(input("n: "))
k = 0

while m > 0:
    m = m - 1
    k = k + n

print("El producto de m y n es:",k)
m: 3
n: 4
El producto de m y n es: 12
  • ¿Cómo realiza la operación?
  • ¿Cómo se asegura que en algún momento se termine el ciclo?

Uso de Ciclos

¿Necesito usar un ciclo?

Evaluar si en la siguiente situación deberíamos usar un ciclo.

1. Escriba un programa que calcule el promedio de sus notas de certamenes de programación (IWI131).

In [3]:
n1 = int(input('Ingrese nota C1: '))
n2 = int(input('Ingrese nota C2: '))
n3 = int(input('Ingrese nota C3: '))
print("Su promedio es:", int(round((n1+n2+n3)/3)))
Ingrese nota C1: 70
Ingrese nota C2: 50
Ingrese nota C3: 60
Su promedio es: 60

1b. Escriba un programa que calcule el promedio las notas del certamen 1 de un paralelo de IWI131. (Nótese que generalmente los paralelos no tienen la misma cantidad de alumnos)

In [4]:
cant = int(input("Ingrese la cantidad de alumnos: "))

cont = 0 #contador de alumnos/notas ingresadas
suma = 0 #notas acumuladas

while cont < cant:
    nota = int(input("Ingrese nota: "))
    suma = suma + nota
    cont = cont + 1

print("El promedio del paralelo es:", int(round(suma/cont)))
Ingrese la cantidad de alumnos: 4
Ingrese nota: 70
Ingrese nota: 50
Ingrese nota: 60
Ingrese nota: 60
El promedio del paralelo es: 60

1c. Escriba un programa que calcule el promedio las notas de varios alumnos. Se ingresarán notas hasta que se ingrese el valor -1.

In [5]:
cont=0 #contador de cantidad notas ingresadas
suma=0 #notas acumuladas

nota = int(input("Ingrese nota: "))

while nota != -1:
    suma = suma + nota
    cont += 1 #cont = cont + 1
    nota = int(input("Ingrese nota: "))

print("El promedio es:", int(round(suma/cont)))
Ingrese nota: 40
Ingrese nota: 50
Ingrese nota: 60
Ingrese nota: -1
El promedio es: 50

1c. Escriba un programa que calcule el promedio las notas de varios alumnos. Se ingresarán notas hasta que se ingrese el valor -1.

In [6]:
flag = True # bandera que indica si condicion se cumple
cont=0 #contador de cantidad notas ingresadas
suma=0 #notas acumuladas

while flag: #flag==True
    nota = int(input("Ingrese nota: "))
    if nota==-1:
        flag=False
    else:
        suma += nota #suma = suma + nota
        cont += 1 #cont = cont + 1

print("El promedio es:", int(round(suma/cont)))
Ingrese nota: 40
Ingrese nota: 50
Ingrese nota: 60
Ingrese nota: -1
El promedio es: 50

Patrones Comunes

Patrón: Solución aplicable a un prolema que ocurre a menudo.

  1. Sumar cosas
  2. Multiplicar cosas
  3. Contar cosas
  4. Encontrar el máximo
  5. Encontrar el mínimo
  6. Generar pares de cosas

1. Sumar cosas

Escriba un programa que reciba como entrada un número entero. El programa debe mostrar el resultado de la suma de los números al cuadrado desde el 1 hasta el valor ingresado. $$ 1^2+2^2+\ldots+(n-1)^2+n^2 $$

In [7]:
n = int(input("Ingrese n: "))
suma = 0
cont = 1

while cont <= n:
    d = cont**2
    #print("d", d)
    suma = suma + d
    #print("suma", suma)
    cont += 1

print("La suma de los numeros al cuadrado es:", suma)
Ingrese n: 4
La suma de los numeros al cuadrado es: 30

Sintaxis sumar cosas:

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

¿Cuáles son los elementos de este patrón?

2. Multiplicar cosas

Escriba una programa que calcule el factorial de un número $n$ ingresada como entrada: $3! = 1\cdot 2 \cdot 3$

In [8]:
n = int(input("Ingrese n: "))

if n < 0:
    print("El factorial está definido sólo para números naturales mayores o igual que 0.")
else:
    prod = 1
    cont = 1

    while cont <= n:
        prod  = prod * cont #prod *= cont
        cont += 1 #cont = cont + 1

    print("El factorial de", n, "es:", prod)
Ingrese n: 4
El factorial de 4 es: 24

Sintaxis multiplicar cosas:

producto = 1
ciclo:
    n = calcular()
    producto = producto * n

¿Cuáles son los elementos de este patrón?

3. Contar cosas

Escriba un programa que solicite el ingreso de $n$ números, luego entregue la cantidad de números pares ingresados.

In [9]:
n = int(input("Ingrese n: "))
pares = 0 #contador de pares
cont = 0 #contador de numeros

while cont < n:
    num = int(input("Ingrese numero: "))

    if num % 2 == 0: #si es divisible por 2
        pares += 1 #pares = pares + 1

    print("pares =", pares)
    cont += 1 #cont = cont + 1 

print("La cantidad de pares ingresados es:", pares)
Ingrese n: 5
Ingrese numero: 1
pares = 0
Ingrese numero: 4
pares = 1
Ingrese numero: 2
pares = 2
Ingrese numero: 6
pares = 3
Ingrese numero: 3
pares = 3
La cantidad de pares ingresados es: 3

Sintaxis contar cosas:

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

¿Cuáles son los elementos de este patrón?

4. Encontrar el máximo

Escribir un programa que solicite n números y luego muestre el número mayor que haya sido ingresado.

Opción 1: usando un número muy pequeño para comparar.

In [13]:
n = int(input("Ingrese n: "))
i = 1
mayor = float("-inf")

while i <= n:
    mensaje = "Ingrese numero: "
    numero =  float(input(mensaje))

    if mayor < numero:
        mayor = numero

    print("mayor temp =", mayor)
    i += 1

print("El numero mayor es:", mayor)
Ingrese n: 6
Ingrese numero: 7.5
mayor temp = 7.5
Ingrese numero: 3.1
mayor temp = 7.5
Ingrese numero: 2
mayor temp = 7.5
Ingrese numero: 9.0
mayor temp = 9.0
Ingrese numero: 8.5
mayor temp = 9.0
Ingrese numero: 2.5
mayor temp = 9.0
El numero mayor es: 9.0

Opción 2: sin usar número muy pequeño para comparar.

In [14]:
n = int(input("Ingrese n: "))
i = 1

while i <= n:
    mensaje = "Ingrese numero: "
    numero =  float(input(mensaje))

    if i == 1:
        mayor = numero
    elif mayor < numero:
        mayor = numero
    i += 1

print("El numero mayor es", mayor)
Ingrese n: 5
Ingrese numero: 1.1
Ingrese numero: 3.5
Ingrese numero: 4.23
Ingrese numero: 2.5
Ingrese numero: 2.3
El numero mayor es 4.23

Sintaxis encontrar el máximo:

mayor = numero_muy_chico
ciclo:
    n = calcular()
    if n > mayor:
        mayor = n

¿Cuáles son los elementos de este patrón?

5. Encontrar el mínimo

¿Cómo cambia el patrón anterior si ahora se quiere encontrar el mínimo?

In [15]:
n = int(input("Ingrese n: "))
i = 1
menor = float("inf")

while i <= n:
    mensaje = "Ingrese numero: "
    numero =  float(input(mensaje))

    if menor > numero:
        menor = numero
    i += 1

print("El numero menor es:", menor)
Ingrese n: 6
Ingrese numero: 10
Ingrese numero: 4.3
Ingrese numero: 5.3
Ingrese numero: 6.3
Ingrese numero: 5.1
Ingrese numero: 1.5
El numero menor es: 1.5

Sintaxis encontrar el mínimo:

menor = numero_muy_grande
ciclo:
    n = calcular()
    if n < menor:
        menor = n

6. Generar Pares de cosas

Escribir un programa que muestre todas las combinaciones posibles al lanzar 2 dados.

In [17]:
n = 6
m = 6
i = 0
contador = 0
while i < n:
    j = 0
    i += 1
    while j < m:
        j += 1
        contador +=1
        print(i,j)
1 1
1 2
1 3
1 4
1 5
1 6
2 1
2 2
2 3
2 4
2 5
2 6
3 1
3 2
3 3
3 4
3 5
3 6
4 1
4 2
4 3
4 4
4 5
4 6
5 1
5 2
5 3
5 4
5 5
5 6
6 1
6 2
6 3
6 4
6 5
6 6

Conclusiones

  • Depende. A veces hay operaciones que se deben hacer muchas veces.
  • Un ciclo es recomendado cuando una misma operación se debe repetir, pero cambiando algo ligeramente.
  • Los ciclos son útiles, pero peligrosos si no se tiene cuidado de la condición

Ejercicio 1

Conjetura de Ulam

A partir de un número cualquiera (entrada) es posible hacer una sucesión de números que termina en 1.

  • Si el número es par, se debe dividir por 2.
  • Si el número es impar, se debe multiplicar por 3 y sumarle 1.

Con esto se obtiene el siguiente número de la sucesión, al cual se le deben aplicar las mismas operaciones. La sucesión de números termina cuando el número obtenido por medio de las operaciones es 1.

In [24]:
from IPython.display import IFrame
IFrame("https://trinket.io/embed/blocks/06947cd48d?hideGeneratedCode=true", width="100%", height=500)
Out[24]:
In [19]:
t= int(input('Inicio: '))

while t != 1:
    print(int(t))
    if t % 2 == 0:
        t = t/2
    else:
        t = (3*t) + 1

print(int(t))
Inicio: 120
120
60
30
15
46
23
70
35
106
53
160
80
40
20
10
5
16
8
4
2
1

Ejercicio 2

Escriba un programa que determine si un número es primo o compuesto.

In [25]:
from IPython.display import IFrame
IFrame('https://trinket.io/embed/blocks/f1d62613e6?hideGeneratedCode=true', width="100%", height=500)
Out[25]:
In [21]:
n=int(input("n: "))
es_primo = True
d = 2

while d<n and es_primo:
    if n%d == 0:
        es_primo = False
    d = d+1

if es_primo:
    print("Es primo")
else:
    print("Es compuesto")
n: 37
Es primo

Ejercicio 3

Utilizando el programa diseñado anteriormente para determinar si un número es primo o compuesto. Realice el ruteo para los siguientes valores:

  • 5
  • 9
In [ ]: