import pickle import os import random class Student: def __init__(self, surname, name, grade, extra_data): self.surname = surname self.name = name self.grade = int(grade) self.extra_data = extra_data def __str__(self): base = f"{self.surname:<15} | {self.name:<15} | {self.grade:<5} | " if self.grade == 1: return base + f"Скорость: {self.extra_data:<10}" elif self.grade == 4: return base + f"Балл аттест.: {self.extra_data:<10}" elif self.grade in [2, 3]: return base + f"Математика: {self.extra_data:<10}" return base def input_student(): surname = input("Введите фамилию: ") name = input("Введите имя: ") while True: try: grade = int(input("Введите класс (1-4): ")) if grade not in [1, 2, 3, 4]: raise ValueError break except ValueError: print("Ошибка: введите класс от 1 до 4.") extra_data = None while True: try: if grade == 1: extra_data = int(input("Скорость чтения (слов/мин): ")) elif grade == 4: extra_data = float(input("Балл аттестации (1-100): ")) if not (1 <= extra_data <= 100): raise ValueError elif grade in [2, 3]: extra_data = float(input("Оценка по математике (1-10): ")) if not (1 <= extra_data <= 10): raise ValueError break except ValueError: print("Некорректные данные для этого класса.") return Student(surname, name, grade, extra_data) def save_to_binary(filename, students): with open(filename, "wb") as f: pickle.dump(students, f) def read_from_binary(filename): if not os.path.exists(filename): return [] with open(filename, "rb") as f: return pickle.load(f) def run_task_2(): filename = "students.bin" while True: print("\n--- Меню: Ученики (Бинарные файлы) ---") print("1. Ввести N учеников вручную и сохранить") print("2. Создать файл со случайными данными") print("3. Прочитать файл и вывести таблицу") print("0. Выход") choice = input("Ваш выбор: ") if choice == "0": break elif choice == "1": try: n = int(input("Введите N: ")) students = [input_student() for _ in range(n)] save_to_binary(filename, students) except ValueError: print("Ошибка ввода числа.") elif choice == "2": surnames = ["Иванов", "Петров", "Сидоров", "Смирнов"] names = ["Алексей", "Мария", "Иван", "Анна"] random_students = [] for _ in range(5): g = random.randint(1, 4) if g == 1: ex = random.randint(30, 100) elif g == 4: ex = round(random.uniform(50.0, 100.0), 1) else: ex = round(random.uniform(2.0, 10.0), 1) random_students.append( Student(random.choice(surnames), random.choice(names), g, ex) ) save_to_binary(filename, random_students) print("Файл заполнен случайными данными.") elif choice == "3": data = read_from_binary(filename) if not data: print("Файл пуст или не существует.") else: print( f"\n{'Фамилия':<15} | {'Имя':<15} | {'Класс':<5} | Доп. информация" ) print("-" * 60) for s in data: print(s) else: print("Неверный выбор.") if __name__ == "__main__": run_task_2()