180 lines
7.7 KiB
Python
180 lines
7.7 KiB
Python
''' ****** Задание 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() |