last lab
This commit is contained in:
121
labPython/lab15/task_2.py
Normal file
121
labPython/lab15/task_2.py
Normal 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()
|
||||
Reference in New Issue
Block a user