Estructuras Repetitivas
Requisitos de finalización
6. Ciclo "while"
6.3. Ejemplos de usos de "while" controlado por evento
Consigna 1:
Calcular el promedio de notas que se ingresa, el proceso finaliza al ingresar un valor no válido de nota , es decir nota fuera de [0,10].
Para simplificar el código, se asume que no se van a ingresar valores
que puedan producir un error de excepción (ingreso de carácter)
promedio, total, contador = 0.0, 0.0, 0 #asignación múltiple
print("Vamos a ingresar las notas de un parcial")
print("Para finalizar el programa ingrese un valor fuera de [0,10]")
nota = float(input("Ingrese la nota del estudiante: "))#ver que con esto
#garantizo el ingreso al while!!!
while nota>=0 and nota<=10: #mientras la nota no sea -1 continuo!
total =total + nota
contador +=1
nota = float(input("Ingrese la nota del estudiante: "))
print("Salimos del while")
try:
promedio=total/contador
except ZeroDivisionError:
print("Error, no ingresaron valores")
else:
print("El promedio de los {} valores ingresados es: {:.2f}.".format(contador,promedio))
Aqui tenemos otra versión sin el try/except/else.
promedio, total, contador = 0.0, 0.0, 0 #asignación múltiple
print("Vamos a ingresar las notas de un parcial")
print("Para finalizar el programa ingrese un valor fuera de [0,10]")
nota = float(input("Ingrese la nota del estudiante: "))#ver que con esto
#garantizo el ingreso al while!!!
while nota>=0 and nota<=10: #mientras la nota no sea -1 continuo!
total =total + nota
contador +=1
nota = float(input("Ingrese la nota del estudiante: "))
print("Salimos del while")
if contador==0:
print("No se ingresaron valores ")
else:
print("El promedio de los {} valores ingresados es: {:.2f}.".format(contador,total/contador))
- ¿Qué evento debe pasar para que el bucle se termine?.
- ¿Qué sucede si el primer valor que se ingresa es -1?.
- ¿Que sucede si en ambos casos se ingresa un caracter o enter en lugar de un número?.¿puede proponer una solución a ese tipo de error?
- Se dice que el ingreso de notas termina por un EVENTO, porque la condición que aborta el ciclo, es un ingreso no válido (no una excepción)
Consigna 2:
Se quiere calcular el promedio de notas que se van ingresado, el proceso finaliza al ingresar un string que no sean números.
promedio, total, contador = 0.0, 0.0, 0 #asignación múltiple
print("Vamos a ingresar las notas de un parcial")
print("Para finalizar el programa ingrese una letra.")
calculando= True
while calculando:
try:
nota = float(input("Ingrese la nota del estudiante: "))
except ValueError:
print("Saliendo del While..")
calculando = False
else:
total =total + nota
contador +=1
if contador==0:
print("No se ingresaron valores ")
else:
print("El promedio de los {} valores ingresados es: {:.2f}.".format(contador,total/contador))
- Se establece calculando = True para que la condición del "while" sea verdadera e ingrese al bucle de nuestro programa.
- Defino un bloque try, para que intente ingresar un valro real, si lo consigue NO hay excepción, y puede acumular y contar.
- Si se genera una excepción, si se ingresa un valor que crea una excepción... como un caracter por ejemplo.
- En el bloque de excepción se cambia el valor de calculando = False para que se aborte el bucle "while".
- Fuera del "while", cálculo el promedio y muestro.
- Ver si si contador es cero, pordría genera un error de excepción por ZeroDivisionError, el cual evito con el if
- ¿Qué diferencias observa en los scripts mostrados para garantizar el ingreso al bucle?.
- ¿Qué tipo de dato es "calculando" en el segundo script?.
- ¿Cree que el código es correcto?.
- ¿Qué sucede si se ingresan valores negativos para las notas? ¿Funciona?.
- ¿Qué sucede si las notas ingresadas no pertenecen a [0,10]? ¿Funciona?.
- ¿Qué pasa si el primer valor ingresado es una letra?.
A continuación, se deja otra posible solución a la Consigna 2 para que lo analice.
promedio, total, contador = 0.0, 0.0, 0 #asignación múltiple
print("Vamos a ingresar las notas de un parcial")
print("Para finalizar el programa ingrese una letra.")
calculando= True
while calculando:
try:
nota = float(input("Ingrese la nota del estudiante: "))
except ValueError:
print("Saliendo del While..")
calculando = False
else:
if nota>=0 and nota <=10:
total =total + nota
contador +=1
else:
print("El valor ingresado de nota no pertenece al [0,10]")
print("Reingrese..")
if contador==0:
print("No se ingresaron valores ")
else:
print("El promedio de los {} valores ingresados es: {:.2f}.".format(contador,total/contador))
- Vemos que a medida que avanzamos en el materia, los programas se vuelven mas largos y complejos.
- Vemos que considerar TODAS las alternativas y prevenirse de ingresos no válidos hace mas complejo el código.
- Vemos que hay muchas soluciones, para una consigna tan sencilla, no necesariamente infinitas pero si muchas.
- En la materia resulta SUGESTIVO que dos alumnos tengan la misma solución (copiar --> 😡).
- Notar que cambiar el nombre de las variables sería un cambio cosmético y no un programa distinto, esto suelen hacer algunos alumnos que copian para DISFRAZAR el código que hizo otro y hacerlo pasar como propio.
- En este caso es tan culpable el que copia como el que facilita el código para que otro lo copie, en los casos que se detectaron ambos alumnos han sido REPROBADOS 😳.