final version

This commit is contained in:
Дмитрий Зязев 2026-04-17 19:10:10 +03:00
parent 5d0c1614c8
commit 5981e1c814
2 changed files with 65 additions and 14 deletions

18
result.txt Normal file
View File

@ -0,0 +1,18 @@
Загружено записей: 7
После удаления дубликатов: 7
Записи после удаления дубликатов:
1. Анна Кузнецова (ИВТ-201, курс 2) Математика: 85.0 2. Иван Соколов (ИВТ-201, курс 2) Математика: 92.0 3. Анна Кузнецова (ИВТ-201, курс 2) Программирование: 78.0 4. Мария Ткач (ПИ-101, курс 1) Программирование: 88.0 5. Иван Соколов (ИВТ-201, курс 2) Программирование: 91.0 6. Иван Иванович (ИНБб-2301, курс 3) Программирование: 95.0 7. Иван Иванович (ИНБб-2301, курс 3) Математика: 91.0
После фильтрации (курс 2, оценка >= 70.0): 4 записей
Средний балл по выборке: 86.50
Список студентов (по убыванию среднего балла):
1. Иван Соколов - 91.50
2. Анна Кузнецова - 81.50
Распределение оценок:
5 (90-100): 2
4 (75-89): 2
3 (60-74): 0
2 (0-59): 0
Статистика по предметам:
Математика: оценок 2, средний 88.50
Программирование: оценок 2, средний 84.50

View File

@ -93,21 +93,27 @@ def remove_duplicate_records(records):
unique.append(r)
return unique
def export_grade_report(records, filtered, output_file):
def export_grade_report(records, filtered, output_file, course, min_grade, group):
with open(output_file, 'w', encoding='utf-8') as f:
f.write(f"Загружено записей: {len(records)}\n")
f.write(f"После удаления дубликатов: {len(records)}\n")
f.write(f"После фильтрации (курс 2, оценка >= 80): {len(filtered)} записей\n")
f.write("\nЗаписи после удаления дубликатов:\n")
i = 1
for r in records:
f.write(f" {format_record(r, i)}")
i += 1
f.write(f"\nПосле фильтрации (курс {course}, оценка >= {min_grade}" + (f", группа {group}" if group else "") + f"): {len(filtered)} записей\n")
if filtered:
overall_avg_filtered = sum(r['grade'] for r in filtered) / len(filtered)
f.write(f"Средний балл по выборке: {overall_avg_filtered:.2f}\n")
else:
f.write("Средний балл по выборке: нет данных\n")
top3 = top_students_by_avg(filtered, 3)
f.write("Топ-3 студента:\n")
unique_students_ids = set(r['student_id'] for r in filtered)
all_students = top_students_by_avg(filtered, len(unique_students_ids))
f.write("Список студентов (по убыванию среднего балла):\n")
i = 1
for sid, name, avg in top3:
f.write(f" {i}. {name} - {avg:.2f}")
for sid, name, avg in all_students:
f.write(f" {i}. {name} - {avg:.2f}\n")
i += 1
dist = grade_distribution(filtered)
f.write("Распределение оценок:\n")
@ -120,25 +126,52 @@ def export_grade_report(records, filtered, output_file):
for subj, data in subj_stats.items():
f.write(f" {subj}: оценок {data['count']}, средний {data['avg']:.2f}\n")
def format_record(r, idx):
return f"{idx}. {r['full_name']} ({r['group']}, курс {r['course']}) {r['subject']}: {r['grade']:.1f}"
def main():
records = load_students('data/students.csv')
print(f"Загружено записей: {len(records)}")
print("Исходные данные (все записи):")
i = 1
for r in records:
print(f" {format_record(r, i)}")
i += 1
records = remove_duplicate_records(records)
print(f"После удаления дубликатов: {len(records)}")
filtered = filter_by_course(records, 2)
filtered = filter_by_min_grade(filtered, 80)
print(f"После фильтрации (курс 2, оценка >= 80): {len(filtered)} записей")
i = 1
for r in records:
print(f" {format_record(r, i)}")
i += 1
try:
course = int(input("\nВведите курс для фильтрации (1-4): "))
min_grade = float(input("Введите минимальную оценку (0-100): "))
group = input("Введите название группы (или Enter, чтобы не фильтровать по группе): ").strip()
if group == "":
group = None
except ValueError:
print("Ошибка ввода. курс=2, мин.оценка=80, группа не фильтруется")
course, min_grade, group = 2, 80.0, None
filtered = filter_by_course(records, course)
filtered = filter_by_min_grade(filtered, min_grade)
if group:
filtered = filter_by_group(filtered, group)
print(f"\nПосле фильтрации (курс {course}, оценка >= {min_grade}" + (f", группа {group}" if group else "") + f"): {len(filtered)} записей")
if filtered:
overall_avg_filtered = sum(r['grade'] for r in filtered) / len(filtered)
print(f"Средний балл по выборке: {overall_avg_filtered:.2f}")
else:
print("Средний балл по выборке: нет данных")
top3 = top_students_by_avg(filtered, 3)
print("Топ-3 студента:")
unique_students_ids = set(r['student_id'] for r in filtered)
all_students = top_students_by_avg(filtered, len(unique_students_ids))
print("Список студентов (по убыванию среднего балла):")
i = 1
for sid, name, avg in top3:
for sid, name, avg in all_students:
print(f" {i}. {name} - {avg:.2f}")
i += 1
dist = grade_distribution(filtered)
print("Распределение оценок:")
print(f" 5 (90-100): {dist[5]}")
@ -149,8 +182,8 @@ def main():
print("Статистика по предметам:")
for subj, data in subj_stats.items():
print(f" {subj}: оценок {data['count']}, средний {data['avg']:.2f}")
export_grade_report(records, filtered, 'output.txt')
print("Полный отчёт сохранён в output.txt")
export_grade_report(records, filtered, 'result.txt', course, min_grade, group)
print("Полный отчёт сохранён в result.txt")
if __name__ == '__main__':
main()