IWI-131 Programación¶
Ciclos¶
Permiten repetir un conjunto de instrucciones.
Hay dos tipos de ciclos:
- Los que se ejecutan una determinada cantidad de veces, conocida previamente.
- Los que se ejecutan mientras una condición se cumple.
Nota: En realidad el segundo tipo puede utilizarse para modelar el primero.
Instrucción while¶
Una instrucción while
ejecuta una secuencia de instrucciones mientras una condición sea verdadera.
Las instrucciones que se repiten son las que se encuentran indentadas a la derecha, dentro de la instrucción while
.
Sintaxis¶
while condición:
instrucciones mientras la condición sea verdadera
Notas adicionales:¶
- A una ejecución de las instrucciones que componen el ciclo se le llama iteración.
- La condición de un
while
es evaluada antes de cada iteración. - Por lo anterior, es posible que un
while
no ejecute ninguna iteración, si la condición esFalse
al inicio.
¿Entendemos while
?¶
- ¿Qué realiza el siguiente ejemplo?
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: 5 n: 4 El producto de m y n es: 20
- ¿Entiendes cómo se lleva a cabo el cálculo del producto?
- ¿Por qué estamos seguros de que en algún momento terminará el ciclo?
Uso de Ciclos¶
1a. Escriba un programa que calcule el promedio de las notas del certamen 1 de un paralelo de IWI131. (Nótese que generalmente los paralelos no tienen la misma cantidad de alumnos)
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(cont)
print("El promedio del paralelo es:", int(round(suma/cont)))
Ingrese la cantidad de alumnos: 3 Ingrese nota: 10 Ingrese nota: 20 Ingrese nota: 30 3 El promedio del paralelo es: 20
1b. Escriba un programa que calcule el promedio las notas de varios alumnos. Se ingresarán notas hasta que se ingrese el valor $-1$.
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: 3 Ingrese nota: 10 Ingrese nota: 20 Ingrese nota: -1 El promedio es: 11
1c. Escriba un programa que calcule el promedio las notas de varios alumnos. Se ingresarán notas hasta que se ingrese el valor $-1$.
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: 10 Ingrese nota: 20 Ingrese nota: -1 El promedio es: 15
Patrones Comunes¶
Un patrón es una solución que puede ser aplicada a distintos problemas o situaciones, con ligeros cambios.
- Patrón de acumulación con suma.
- Patrón de acumulación con multiplicación.
- Patrón de conteo.
- Patrón de encontrar el mayor (máximo).
- Patrón de encontrar el menor (mínimo).
1. Patrón de acumulación con suma.¶
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 $$
n = int(input("Ingrese n: "))
suma = 0
cont = 1
while cont <= n:
d = cont**2
suma = suma + d
cont += 1
print("La suma de los numeros al cuadrado es:", suma)
Ingrese n: 4 La suma de los numeros al cuadrado es: 30
Estructura del patrón de acumulación con suma:¶
suma = 0
while (condición_del_ciclo):
n = ... #calcular lo que se quiere acumular
suma = suma + n
¿Cuáles son los elementos de este patrón?
2. Patrón de acumulación con multiplicación¶
Escriba una programa que calcule el factorial de un número $n$ ingresada como entrada: $3! = 1\cdot 2 \cdot 3$
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: 3 El factorial de 3 es: 6
Estructura del patrón de acumulación con multiplicación:¶
producto = 1
while (condición_del_ciclo):
n = ... #calcular lo que se quiere acumular
producto = producto * n
¿Cuáles son los elementos de este patrón?
¿Ves las diferencias con el patrón de acumulación con suma?
3. Patrón de conteo¶
Escriba un programa que solicite el ingreso de $n$ números, luego entregue la cantidad de números pares ingresados.
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: 3 Ingrese numero: 4 pares = 1 Ingrese numero: 5 pares = 1 Ingrese numero: 6 pares = 2 La cantidad de pares ingresados es: 2
Estructura del patrón de conteo:¶
contador = 0
while (condición_del_ciclo):
if (condición_para_contar):
contador = contador + 1
¿Cuáles son los elementos de este patrón?
4. Patrón de encontrar el mayor (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.
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: 3 Ingrese numero: 1 mayor temp = 1.0 Ingrese numero: 2 mayor temp = 2.0 Ingrese numero: 3 mayor temp = 3.0 El numero mayor es: 3.0
Opción 2: sin usar número muy pequeño para comparar.
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: 3 Ingrese numero: 1 Ingrese numero: 2 Ingrese numero: 3 El numero mayor es 3.0
Estructura del patrón de encontrar el mayor:¶
mayor = numero_muy_chico
while (condición_del_ciclo):
n = ... #determinar lo que se quiere comparar
if n > mayor:
mayor = n
¿Cuáles son los elementos de este patrón?
5. Patrón de encontrar el menor (mínimo)¶
¿Cómo cambia el patrón anterior si ahora se quiere encontrar el mínimo?
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: 3 Ingrese numero: 1 Ingrese numero: 2 Ingrese numero: 3 El numero menor es: 1.0
Estructura del patrón de encontrar el menor:¶
menor = numero_muy_grande
while (condición_del_ciclo):
n = ... #determinar lo que se quiere comparar
if n < menor:
menor = n
Ciclos anidados¶
Dentro de un ciclo es posible incluir cualquier tipo de instrucción, incluso otros ciclos.
Cuando un ciclo se encuentra dentro de otro ciclo, el ciclo interno se ejecutará completo en cada iteración del ciclo externo.
Ejemplo 1:¶
Escribir un programa que imprima en la pantalla un rectángulo de asteriscos como el siguiente, que tiene 4 filas con 10 asteriscos cada una:
**********
**********
**********
**********
fila = 0
while fila < 4:
columna = 0
linea = ""
while columna < 10:
linea = linea + "*"
columna += 1
print(linea)
fila += 1
********** ********** ********** **********
El ciclo interno ejecuta sus 10 iteraciones para cada iteración del ciclo externo.
Entonces, ¿cuántas veces en total se ejecuta la instrucción linea = linea + "*"
?
¿Cuáles son todos los valores por los que pasa la variable columna durante la ejecución del programa?
Ejercicio:¶
Modificar el programa anterior para que la cantidad de filas y columnas sean entradas, pudiendo dibujar así rectángulos de diferentes dimensiones.
cantidad_filas = int(input("Ingrese la cantidad de filas: "))
cantidad_columnas = int(input("Ingrese la cantidad de columnas: "))
fila = 0
while fila < cantidad_filas:
columna = 0
linea = ""
while columna < cantidad_columnas:
linea = linea + "*"
columna += 1
print(linea)
fila += 1
Ingrese la cantidad de filas: 4 Ingrese la cantidad de columnas: 5 ***** ***** ***** *****
Ejemplo 2:¶
Escribir un programa que muestre todas las combinaciones posibles al lanzar $2$ dados.
i = 1
while i <= 6:
j = 1
while j <= 6:
print(i,j)
j += 1
i += 1
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
Ejercicios¶
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$.
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: 3 3 10 5 16 8 4 2 1
Ejercicio 2¶
Escriba un programa que determine si un número es primo o compuesto.
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: 5 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
n | es_primo | d |
5 | ||
True | ||
2 | ||
3 | ||
4 | ||
5 |
Pantalla: |
Es primo |