Сделал 3 задание
This commit is contained in:
parent
60711c6c9f
commit
06a607df4a
180
lesson.3.py
Normal file
180
lesson.3.py
Normal file
|
|
@ -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()
|
||||||
Loading…
Reference in a new issue