1.15 Máximos y Mínimos

Supongamos que nos piden buscar el máximo o el mínimo  de una serie de valores. Por ejemplo, en el siguente enunciado:

Se desea ingresar los números de padrón y calificaciones en un examen de los alumnos de un curso. Realizar un programa que permita cargar esta información e indique al finalizar qué alumno ha obtenido la nota más alta y su calificación.

Lo primero que podemos ver es que debemos realizar un ciclo en el que se vayan cargando los datos de entrada. No se sabe la cantidad de alumnos, así que será un ciclo con valor centinela. Como valor centinela podría usarse un valor de cero en el padrón, pero vamos a preguntar al usuario luego de cada carga si desea agregar otro dato, con una variable específica.

En cada vuelta del ciclo, se va a compara la nota ingresada con la mayor nota hasta ahora (que está en la variable notamax). Si la nota ingresada es mayor, se reemplaza la nota máxima y el padrón correspondiente. Así, al terminar el ciclo habremos comparado todas las notas con la mayor nota hasta ese momento. Luego de la última comparación, la "mayor hasta ahora" es la máxima de todas.
Para que esto funcione, la variable notamax se debe inicializar con un valor menor que cualquier valor posible de nota (En este ejemplo, -1). Así cuando se ingrese la primer nota, se reemplazará dicho valor.

def maximo():
    notamax =  -1
    otra = input("¿Desea ingresar otra nota (s/n)?")
    while otra == 'S' or otra =='s':
        padron = int(input("Ingrese el padrón:"))
        nota = int(input("Ingrese la nota:"))
        if nota > notamax:
            notamax = nota
            padronmax = padron
        otra = input("¿Desea ingresar otra nota (s/n)?")
    print("La mejor nota es ",notamax," y corresponde al alumno ",padronmax)

maximo()


Si en lugar de un máximo se busca un mínimo, sólo se debe dar vuelta el signo de la comparación y cambiar el valor inicial de notamax a un valor mayor que cualquier nota posible (por ejemplo, 11 ó 101).

Noten que si hay varios alumnos que empatan en la calificación máxima, el programa sólo guarda el padrón del primero. Reemplazando la condición nota>notamax por nota>=notamax   se consigue guardar el padrón del último.

Modificando un poco el programa, se puede obtener la cantidad de alumnos que tienen dicha nota:

def maximo():
    notamax =  -1
    otra = input("¿Desea ingresar otra nota (s/n)?")
    while otra == 'S' or otra =='s':
        padron = int(input("Ingrese el padrón:"))
        nota = int(input("Ingrese la nota:"))
        if nota == notamax:
            cantmax=cantmax + 1
        elif nota > notamax:
            notamax = nota
            padronmax = padron
            cantmax=1
        otra = input("¿Desea ingresar otra nota (s/n)?")
    print("La mejor nota es ",notamax," y corresponde al alumno ",padronmax)
    print("Un total de ",cantmax," alumnos obtuvieron la nota máxima")
maximo()


El cambio realizado consiste en agregar otra pregunta: si la nota actual es igual al máximo hasta ahora, sumar el contador. Si la nota actual es mayor, por lo tanto es un nuevo máximo y el contador vuelve a 1;
No se pueden guardar las notas de todos los máximos, porque se necesitarían tantas variables como datos vamos a ingresar (potencialmente, todos podrían se máximos) . Para resolver este problema guardando los padrones de todos los máximos, se deben usar vectores o listas.

Por último, otra variante posible es que no se pueda saber qué valor inicial darle a notamax. Por ejemplo si se quieren comparar los saldos de cuentas bancarias sin límites de descubierto; teóricamente dichos valores pueden ser muy altos o muy bajos, sin un límite marcado de antemano.
En esos casos, se puede modificar un poco el programa, leyendo el primer dato fuera del ciclo, guardándolo como máximo y entrando al ciclo a partir del segundo elemento:

def maximo():
    notamax =  -1
    padron = int(input("Ingrese el padrón:"))
    nota = int(input("Ingrese la nota:"))
    notamax=nota
    padronmax=padron
    otra = input("¿Desea ingresar otra nota (s/n)?")
    while otra == 'S' or otra =='s':
        padron = int(input("Ingrese el padrón:"))
        nota = int(input("Ingrese la nota:"))
        if nota > notamax:
            notamax = nota
            padronmax = padron
        otra = input("¿Desea ingresar otra nota (s/n)?")
    print("La mejor nota es ",notamax," y corresponde al alumno ",padronmax)
maximo()


No hay comentarios:

Publicar un comentario