diff --git a/lesson.3.py b/lesson.3.py new file mode 100644 index 0000000..0f0838c --- /dev/null +++ b/lesson.3.py @@ -0,0 +1,180 @@ +''' ****** Задание 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() \ No newline at end of file