Files
labs/labPython/lab15/task_2.py
2026-04-18 14:42:00 +05:00

122 lines
4.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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()