Saltar a contenido

Asignaturas

Dado un string con el siguiente formato, pero del que desconocemos la cantidad de asignaturas: "Progra=78;Mate=83;Física=68;Química=65". Escriba un programa que lea el string como entrada y calcule el promedio de calificaciones, indicando además la materia con mejor promedio. En caso de empate puede mostrar cualquiera de las que empatan.

Ejemplo

Ingrese string: Progra=78;Mate=83;Física=68;Química=65
Promedio: 74
Mejor asignatura: Mate
Solución 1
texto = input("Ingrese string: ") # Para el string con las notas
texto += ";" # Agregamos un punto y coma al final para que la última asignatura sea contada
info_asignatura = "" # Variable para guardar la información de la asignatura
mejor_asignatura = "" # Variable para guardar el nombre de la mejor nota
mejor_nota = -1 # Variable para guardar la mejor nota
suma = 0 # Variable para la sumatoria de notas 
contador = 0 # Contador de notas 
for c in texto: # Recorremos cada caracter del texto
    if c != ";": # Si no es un punto y coma, guardamos la información de la asignatura
        info_asignatura += c 
    else: # Si es un punto y coma, procesamos la información de la asignatura
        # Buscamos la posición del signo igual para separar el nombre de la asignatura de la nota
        pos_igual = 0  # Variable para guardar la posición del signo igual
        i = 0 # Variable para recorrer la información de la asignatura
        while i < len(info_asignatura): # Recorremos la información de la asignatura
            if info_asignatura[i] == "=": # Si encontramos el signo igual
                pos_igual = i # Guardamos la posición del signo igual
                i = len(info_asignatura) # Salimos del ciclo para evitar seguir buscando
            i += 1 # Aumentamos el contador para recorrer la información de la asignatura
        # Obtenemos el nombre de la asignatura y la nota
        nombre = info_asignatura[:pos_igual] 
        nota = int(info_asignatura[pos_igual+1:])
        info_asignatura = "" # Reiniciamos la información de la asignatura
        contador += 1 # Aumentamos el contador de notas
        suma += nota # Sumamos la nota a la sumatoria
        # Buscamos la mejor nota
        if nota > mejor_nota:
            mejor_nota = nota
            mejor_asignatura = nombre
# Calculamos el promedio
promedio = round(suma / contador)
# Mostramos lo solicitado
print("Promedio:", promedio)
print("Mejor asignatura:", mejor_asignatura)
Solución 2
entrada = input("Ingrese string: ") # Para el string con las notas
suma = 0 # Variable para la sumatoria de notas
mejor_materia = "" # Variable para guardar el nombre de la mejor nota
mejor_nota = -1 # Mejor nota
n_notas = 0 # Contador de notas
# La logica del programa es obtener la materia y nota e ir removiendola de la entrada
# Por lo tanto repetiremos el proceso hasta que se quiten todaslas materias y notas de la entrada
while len(entrada) > 0: 
    if ";" in entrada: # Si hay ';' en nuestra entrada podemos utilizar el metodo index para localizarlo
        i = entrada.index(";") # Indice para separar materia
        materia_nota = entrada[:i] # Obtenemos la materia con su nota
        # Removemos la materia y nota que ya procesamos. 
        # Se incluye el ';' para que no nos moleste en el procesamiento
        entrada = entrada.replace(materia_nota + ";", "")
    else: # Cuando a entrada no le queden ';', estamos en la materia del final
        materia_nota = entrada # La informacion de la materia se encuentra en la ultima parte de la entrada
        entrada = entrada.replace(materia_nota, "") # Se remueve la informacion (aqui entrada deberia quedar vacia)
    # Una vez tenemos el substring materia=nota, lo separamos utilizando '='
    j = materia_nota.index("=") # Indice para separar materia de la nota (utilizando el caracter '=')
    materia = materia_nota[:j] # Obtenemos el nombre de la materia
    nota = int(materia_nota[j+1:]) # Obtenemos la nota y la convertimos a entero. El +1 es para evitar el '='
    suma += nota # Sumatoria de notas
    n_notas += 1 # contador notas
    # Buscamos la major nota
    if nota > mejor_nota:
        mejor_materia = materia
        mejor_nota = nota
# Calculamos el promedio
promedio = int(round(suma / n_notas)) 
# Mostramos lo solicitado 
print("Promedio:", promedio)
print("Mejor asignatura:", mejor_materia)