From 5981e1c8142b65e0f1db74bb8c3a43890c9fbdba Mon Sep 17 00:00:00 2001 From: stud204007 Date: Fri, 17 Apr 2026 19:10:10 +0300 Subject: [PATCH] final version --- result.txt | 18 ++++++++++++++++ src/main.py | 61 +++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 65 insertions(+), 14 deletions(-) create mode 100644 result.txt diff --git a/result.txt b/result.txt new file mode 100644 index 0000000..184f28d --- /dev/null +++ b/result.txt @@ -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 diff --git a/src/main.py b/src/main.py index 5a241e8..efebd2c 100644 --- a/src/main.py +++ b/src/main.py @@ -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() \ No newline at end of file