lab3
This commit is contained in:
+138
@@ -0,0 +1,138 @@
|
||||
import math
|
||||
|
||||
|
||||
class Worker:
|
||||
def __init__(self, surname: str, position: str, salary: float):
|
||||
self.surname = None
|
||||
self.position = None
|
||||
self.salary = None
|
||||
self.set_surname(surname)
|
||||
self.set_position(position)
|
||||
self.set_salary(salary)
|
||||
|
||||
# -----------------------
|
||||
# проверка фамилии
|
||||
def set_surname(self, surname: str):
|
||||
self.surname = self.validate_surname(surname)
|
||||
|
||||
@staticmethod
|
||||
def validate_surname(surname: str) -> str:
|
||||
surname = surname.strip()
|
||||
if len(surname) < 2:
|
||||
raise ValueError("Фамилия слишком короткая")
|
||||
if not surname.isalpha():
|
||||
raise ValueError("Фамилия должна содержать только буквы")
|
||||
return surname.capitalize()
|
||||
|
||||
# проверка должности
|
||||
def set_position(self, position: str):
|
||||
self.position = self.validate_position(position)
|
||||
|
||||
@staticmethod
|
||||
def validate_position(position: str) -> str:
|
||||
position = position.strip()
|
||||
if len(position) < 2:
|
||||
raise ValueError("Должность слишком короткая")
|
||||
if not all(x.isalpha() or x.isspace() for x in position):
|
||||
raise ValueError("Должность должна содержать только буквы и пробелы")
|
||||
return position.lower()
|
||||
|
||||
# проверка оклада
|
||||
def set_salary(self, salary: float):
|
||||
self.salary = self.validate_salary(salary)
|
||||
|
||||
@staticmethod
|
||||
def validate_salary(salary: float) -> float:
|
||||
if not isinstance(salary, (int, float)):
|
||||
raise ValueError("Оклад должен быть числом")
|
||||
if not math.isfinite(salary):
|
||||
raise ValueError("Оклад не может быть NaN или бесконечностью")
|
||||
if salary < 1000:
|
||||
raise ValueError("Оклад слишком маленький (<1000)")
|
||||
if salary > 10_000_000:
|
||||
raise ValueError("Оклад слишком большой (>10_000_000)")
|
||||
return float(salary)
|
||||
|
||||
# метод №1 — увеличить оклад на 15%
|
||||
def increase_salary(self):
|
||||
self.salary *= 1.15
|
||||
|
||||
# метод №2 — если фамилия начинается с "Иван", присвоить должность "инженер"
|
||||
def assign_engineer_if_ivan(self):
|
||||
if self.surname.lower().startswith("иван"):
|
||||
self.position = "инженер"
|
||||
|
||||
# строка информации об объекте
|
||||
def info(self) -> str:
|
||||
return f"Фамилия: {self.surname}, Должность: {self.position}, Оклад: {self.salary:.2f}"
|
||||
|
||||
|
||||
# -----------------------
|
||||
# функции ввода с проверкой
|
||||
def input_surname() -> str:
|
||||
while True:
|
||||
surname = input("Введите фамилию: ").strip()
|
||||
try:
|
||||
return Worker.validate_surname(surname)
|
||||
except ValueError as e:
|
||||
print("Ошибка:", e)
|
||||
|
||||
|
||||
def input_position() -> str:
|
||||
while True:
|
||||
position = input("Введите должность: ").strip()
|
||||
try:
|
||||
return Worker.validate_position(position)
|
||||
except ValueError as e:
|
||||
print("Ошибка:", e)
|
||||
|
||||
|
||||
def input_salary() -> float | None:
|
||||
while True:
|
||||
salary_str = input("Введите оклад: ").strip().replace(",", ".")
|
||||
try:
|
||||
salary = float(salary_str)
|
||||
except ValueError:
|
||||
print("Ошибка: оклад должен быть числом")
|
||||
continue
|
||||
|
||||
try:
|
||||
return Worker.validate_salary(salary)
|
||||
except ValueError as e:
|
||||
print("Ошибка:", e)
|
||||
|
||||
|
||||
def input_worker() -> Worker:
|
||||
surname = input_surname()
|
||||
position = input_position()
|
||||
salary = input_salary()
|
||||
return Worker(surname, position, salary)
|
||||
|
||||
|
||||
# -----------------------
|
||||
def main():
|
||||
print("Создание работника с клавиатуры:")
|
||||
worker_from_input = input_worker()
|
||||
|
||||
# работники-константы
|
||||
worker1 = Worker("Иванов", "менеджер", 50000)
|
||||
worker2 = Worker("Петров", "аналитик", 60000)
|
||||
|
||||
workers = [worker_from_input, worker1, worker2]
|
||||
|
||||
print("\nИсходные данные:")
|
||||
for w in workers:
|
||||
print(w.info())
|
||||
|
||||
# обработка данных
|
||||
for w in workers:
|
||||
w.increase_salary()
|
||||
w.assign_engineer_if_ivan()
|
||||
|
||||
print("\nПосле обработки:")
|
||||
for w in workers:
|
||||
print(w.info())
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user