''' ****** Задание 3 из 3 ********* * Что нужно сделать Вывести общие показатели учеников программы: максимальное, среднее и минимальное значение рейтинга в процентах от максимально возможного. Округлить результаты до целого значения с помощью функции round(). Вывести лучших учеников: топ-3 лидера по рейтингу, их фамилии в порядке убывания рейтинга и заработанный процент от максимального количества баллов. Если у студентов равный рейтинг (в абсолютном значении), то они идут в порядке их ввода — кто первый указан, тот выше по рейтингу и находится. Фамилии учеников уникальны. На основе данных сделать предварительный вывод, насколько усваивается курс: Если среднее значение рейтинга <= 50 — курс усваивается плохо. Если среднее значение рейтинга > 50 — курс усваивается хорошо. Также нужно проверить правильность введённых данных и расчётов. Если есть ошибки, выводим строку «Во введённых данных ошибка» Формат ввода Одна строчка, в которой через пробел подаются следующие данные: N M Q cw sw hw tw N (num_students) — число учеников на курсе M (num_lessons) — количество занятий в курсе Q (max_rating) — максимальный рейтинг cw (classwork_coefficient) — коэффициент для активности на занятии sw (selfwork_coefficient) — коэффициент для практики hw (homework_coefficient) — коэффициент для домашней работы tw (testwork_coefficient) — коэффициент для контрольной работы Далее идут фамилии учеников (N) и несколько строчек (M) с оценками ученика на занятиях в формате: Иванов a₁,b₁,c₁,d₁ a₂,b₂,c₂,d₂ a₃,b₃,c₃,d₃ ⋮ aₘ,bₘ,cₘ,dₘ Сидоров ... Где aᵢ,bᵢ,cᵢ,dᵢ — это оценки за i-ое занятие: aᵢ (classwork_grade) — оценка за активность на занятии bᵢ (selfwork_grade) — оценка за практику на занятии cᵢ (homework_grade) — оценка за домашнюю работу на занятии dᵢ (testwork_grade) — оценка за контрольную работу на занятии Если не было активности, ученик отсутствовал либо не проявил себя на занятии — значение за активность будет 0. Формат вывода Построчно в следующей последовательности: Максимальный, средний и минимальный рейтинг учеников программы. Через пробел, округлённый до целого числа с помощью round. Построчно фамилию и имя трёх лидеров рейтинга Предварительный вывод «как усваивается курс» (хорошо или плохо). Max Average Min (максимальный, средний и минимальный рейтинг учеников программы) Фамилия_1 Rating_1% (top-1) Фамилия_2 Rating_2% (top-2) Фамилия_3 Rating_3% (top-3) Курс усваивается хорошо/плохо Также сделайте проверку на верность вводных данных. Если условие не выполняется, то необходимо вывести строку «В введённых данных ошибка» N >= 3 (количество учеников больше или равно 3) M > 0 (количество проведённых занятий 1 и больше) cw, sw, hm, tw > 0 (все активности учитываются в рейтинге) Рассчитанный максимальный рейтинг ученика на программе не должен превышать Q. Если столкнётесь с нерешаемыми сложностями — обратитесь к подсказкам финальной задачи главы. Комментарий к примеру 3. Почему Орлов выше Щербакова по рейтингу Пример 1 Ввод 5 4 200 1 2 3 4 Лебедев 0,3,1,1 3,3,0,0 3,0,2,2 3,1,3,2 Жуков 0,1,0,3 1,0,0,1 0,1,1,0 2,1,2,3 Белозёров 3,2,0,0 2,0,2,3 3,2,0,0 1,3,2,0 Попов 0,0,3,1 2,0,0,0 1,0,0,3 0,2,0,0 Медведев 1,0,1,1 3,2,1,0 3,2,3,2 2,1,3,0 Вывод 30 24 16 Лебедев 30% Медведев 28% Белозёров 24% Курс усваивается плохо ''' if __name__ == "__main__" import sys def print_error(): print("Во введённых данных ошибка") sys.exit() def main(): data = sys.stdin.read().splitlines() if not data: print_error() try: head = data[0].strip().split() if len(head) != 7: print_error() N, M, Q, cw, sw, hw, tw = map(int, head) if N < 3 or M <= 0 or cw <= 0 or sw <= 0 or hw <= 0 or tw <= 0 or Q <= 0: print_error() lines = data[1:] expected_lines = N * (1 + M) if len(lines) < expected_lines: print_error() idx = 0 students = [] for order in range(N): if idx >= len(lines): print_error() surname = lines[idx].strip() if not surname: print_error() idx += 1 total = 0 for _ in range(M): if idx >= len(lines): print_error() row = lines[idx].replace(',', ' ').split() idx += 1 if len(row) != 4: print_error() try: a, b, c, d = map(int, row) except Exception: print_error() total += a * cw + b * sw + c * hw + d * tw if total > Q: print_error() percent = (total / Q) * 100 students.append((surname, percent, order)) percentages = [s[1] for s in students] max_p = round(max(percentages)) min_p = round(min(percentages)) avg_p = round(sum(percentages) / len(percentages)) students_sorted = sorted(students, key=lambda x: (-x[1], x[2])) print(f"{max_p} {avg_p} {min_p}") for i in range(3): print(f"{students_sorted[i][0]} {round(students_sorted[i][1])}%") if avg_p > 50: print("Курс усваивается хорошо") else: print("Курс усваивается плохо") except Exception: print_error() if __name__ == "__main__": main()