This commit is contained in:
2026-04-18 14:42:00 +05:00
commit ef77f101fa
96 changed files with 3134 additions and 0 deletions

121
labPython/lab15/task_2.py Normal file
View File

@@ -0,0 +1,121 @@
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()