20. Числовые оценки – в буквенные. (в коде есть строки из следующих тем: "словари, циклы").

(открыть в новой вкладке)

Условие:

В предыдущем упражнении мы переводили буквенные оценки студентов в числовые. Сейчас перевернем ситуацию и попробуем определить буквенный номинал оценки по его числовому эквиваленту. Убедитесь в том, что ваша программа будет обрабатывать числовые значения между указанными в предыдущей задаче. В этом случае оценки должны быть округлены до ближайшей буквы.


Код:

estimation = {
    "A": 4.0,
    "A-": 3.7,
    "B+": 3.3,
    "B": 3.0,
    "B-": 2.7,
    "C+": 2.3,
    "C": 2.0,
    "C-": 1.7,
    "D+": 1.3,
    "D": 1.0,
    "F": 0,
}
number = float(input("%100s" % "Введите числовую оценку в формате 1.1 (не более одно знака после запятой): "))

result = 0                                                              # если переменная не изменится, то это запустит условие в будущем
if number >= estimation["A"]:                                           # условие сразу выведет максимальный результат
    result = "A"        
elif number < 0:
    result = "Введено отрицательное число"                              # условие выведет, если оценка меньше 0
else:
    more = list()                                                       # здесь будут хранится оценки выше
    less = list()                                                       # здесь будут хранится оценки ниже
    for a, b in estimation.items():
        if number == b:                                                 # условие выведет значение, если оно точно соответствует введённому
            result = a
        elif number < b:
            more.append((a, b))
        elif number > b:
            less.append((a, b))
    if result == 0:
        diapazon = [less[0], more[-1]]                                              # узкий диапазон оценок, их всего две, одна выше и другая ниже    
        delta = (int(diapazon[-1][-1] * 10) - int(diapazon[0][-1] * 10)) / 10       # почему такая сложная запись? Чтобы убрать неточность в числах float при расчёте дельты между максимальной и минимальной соседними оценками
        delta_polovina = delta / 2    
        if number == ((diapazon[0][-1] * 10) + (delta_polovina * 10)) / 10:
            result = diapazon[-1][0]
        elif number > ((diapazon[0][-1] * 10) + (delta_polovina * 10)) / 10:
            result = diapazon[-1][0]
        else:
            result = diapazon[0][0]

print("%99s" % "Буквенная оценка:", result)