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 😳.