Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
127 changes: 127 additions & 0 deletions homeworks/les08/task01.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
"""1. Реализовать класс «Дата», функция-конструктор которого должна принимать дату в виде строки формата
«день-месяц-год». В рамках класса реализовать два метода.
Первый, с декоратором @classmethod, должен извлекать число, месяц, год и преобразовывать их тип к типу «Число».
Второй, с декоратором @staticmethod, должен проводить валидацию числа, месяца и года (например, месяц — от 1 до 12).
Проверить работу полученной структуры на реальных данных. """


class MyDate:
_year = 0
_month = 0
_day = 0
__months = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
is_leap = None

def __init__(self, str_date: str):
"""
принимает дату в виде строки формата «день-месяц-год».
:param str_date:
"""

self._build_date(str_date)
if MyDate._is_ok_year(self._year):
self.is_leap = MyDate.is_leap_year(self._year)
else:
raise ValueError('My date structure (year) is incorrect')
if not MyDate.check_date(self._day, self._month, self._year):
raise ValueError('The data for date is not allowed')

@staticmethod
def is_leap_year(year):
"""
1. Если год делится на 4 без остатка, перейдите на шаг 2.
В противном случае перейдите к выполнению действия 5.
2. Если год делится на 100 без остатка, перейдите на шаг 3.
В противном случае перейдите к выполнению действия 4.
3. Если год делится на 400 без остатка, перейдите на шаг 4.
В противном случае перейдите к выполнению действия 5.
4. Год високосный (366 дней).
5. Год не високосный год (365 дней).
https://docs.microsoft.com/ru-ru/office/troubleshoot/excel/determine-a-leap-year
:return:
"""
if not year % 4: # 1
if not year % 100: # 2
if not year % 400:
return True
else:
return False
else:
return True
else: # 5
return False

@classmethod
def set_date(cls, str_date: str):
"""
Извлекает число, месяц, год и возвращает объект с данными типа int
:param str_date:
:return:
"""
return cls(str_date)

@staticmethod
def check_date(date, month, year, verbose=False):
"""
Проверяет детально дату включая максимальную дату месяца с учетом високосных лет
:param date:
:param month:
:param year:
:param verbose:
:return:
"""
is_ok = False
if verbose:
print(f'{date} - {month} - {year}')
if 1 <= month <= 12:
is_ok = True
elif verbose:
print('the month is wrong number')
if is_ok:
is_ok = date <= MyDate.__months[month + 1]
if not is_ok and verbose:
print('the day is wrong number of month')
if is_ok:
is_ok = MyDate._is_ok_year(year)
if not is_ok and verbose:
print('the year is not belong to correct period')
if is_ok and month == 2:
is_ok = not MyDate.is_leap_year(year) and date <= 28
if not is_ok and verbose:
print('the day of Feb is wrong')
if verbose:
print(f' date is {"ok" if is_ok else "wrong"}')
return is_ok

@staticmethod
def _is_ok_year(year):
# мои правила проверки года
return 1970 <= year <= 2060

def _build_date(self, str_date):
# принимает дату в виде строки формата «день-месяц-год».
self._day, self._month, self._year = tuple(map(int, str_date.split('-')))

@property
def day(self):
return self._day

@property
def month(self):
return self._month

@property
def year(self):
return self._year


if __name__ == '__main__':
d1 = MyDate.check_date(13, 2, 1977, verbose=True)
d2 = MyDate.check_date(13, 2, 1967, verbose=True)
d3 = MyDate.check_date(30, 2, 1977, verbose=True)
d4 = MyDate.check_date(29, 2, 2000, verbose=True)

D1 = MyDate.set_date('13-02-1977')
print(f'D1: {D1.day} {D1.month} {D1.year}')
D2 = MyDate('13-02-1977')
print(f'D2: {D2.day} {D2.month} {D2.year}')
26 changes: 26 additions & 0 deletions homeworks/les08/task02.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
"""2. Создайте собственный класс-исключение, обрабатывающий ситуацию деления на нуль. Проверьте его работу на данных,
вводимых пользователем. При вводе пользователем нуля в качестве делителя программа должна корректно обработать эту
ситуацию и не завершиться с ошибкой. """


class MyZeroDivisionError(Exception):
def __init__(self, message='Ошибка: Делитель = 0'):
self.message = message

def __str__(self):
return self.message


if __name__ == '__main__':
while True:
buf = input('Введите 1 число :')
if buf == '':
break
d1 = int(buf)
d2 = int(input('Введите 2 число :'))
try:
if d2 == 0:
raise MyZeroDivisionError('Ошибка: Делитель = 0')
print(d1 / d2)
except MyZeroDivisionError as e:
print(e)
32 changes: 32 additions & 0 deletions homeworks/les08/task03.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""3. Создайте собственный класс-исключение, который должен проверять содержимое списка на наличие только чисел.
Проверить работу исключения на реальном примере. Необходимо запрашивать у пользователя данные и заполнять список.
Класс-исключение должен контролировать типы данных элементов списка. Примечание: длина списка не фиксирована.
Элементы запрашиваются бесконечно, пока пользователь сам не остановит работу скрипта, введя, например,
команду “stop”. При этом скрипт завершается, сформированный список выводится на экран. Подсказка: для данного задания
примем, что пользователь может вводить только числа и строки. При вводе пользователем очередного элемента необходимо
реализовать проверку типа элемента и вносить его в список, только если введено число. Класс-исключение должен не
позволить пользователю ввести текст (не число) и отобразить соответствующее сообщение. При этом работа скрипта не
должна завершаться. """


class MyOnlyIntError(Exception):
def __init__(self, message='Ошибка: должно быть число'):
self.message = message

def __str__(self):
return self.message


if __name__ == '__main__':
int_list = []
while True:
buf = input('Введите данные:')
if buf == 'stop':
break
try:
if not buf.isdigit():
raise MyOnlyIntError
int_list.append(int(buf))
except MyOnlyIntError as e:
print(e)
print(int_list)
32 changes: 32 additions & 0 deletions homeworks/les08/task04.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""4. Начните работу над проектом «Склад оргтехники». Создайте класс, описывающий склад. А также класс «Оргтехника»,
который будет базовым для классов-наследников. Эти классы — конкретные типы оргтехники (принтер, сканер, ксерокс). В
базовом классе определить параметры, общие для приведенных типов. В классах-наследниках реализовать параметры,
уникальные для каждого типа оргтехники. """


class WarehouseEquipments:
shelf = {}

def __init__(self, shelf):
self.shelf = shelf


class OfficeEquipment:
inventory_number = 0
dimensions = (0, 0)
weight = 0
place = (0, 0)
is_network = False


class Printer(OfficeEquipment):
letter_size = ''
color = False


class CopyMachine(OfficeEquipment):
auto_feeder = False


class Scanner(OfficeEquipment):
is_pdf_ready = False
104 changes: 104 additions & 0 deletions homeworks/les08/task05.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
"""5. Продолжить работу над первым заданием. Разработать методы, отвечающие за приём оргтехники на склад и передачу в
определенное подразделение компании. Для хранения данных о наименовании и количестве единиц оргтехники,
а также других данных, можно использовать любую подходящую структуру, например словарь. """


class WarehouseEquipments:
shelf = {}
in_work = {}
__current_num = 1000

def __init__(self, shelf=None):
self.take_storage_equipments(shelf)

def take_storage_equipments(self, equipments):
for machine in equipments:
self.take_storage(machine)

def take_storage(self, equipment):
if isinstance(equipment, OfficeEquipment):
for _ in range(equipment.number):
self.__current_num += 1
equipment.inventory_number = self.__current_num
self.shelf[self.__current_num] = equipment

def find_by_inventory(self, number):
return self.shelf[number]

def move_in_work(self, inventory, division):
self.in_work[inventory] = (self.shelf[inventory], division)
del (self.shelf[inventory])

def move_in_shelf(self, inventory):
self.shelf[inventory], _ = self.in_work[inventory]
del (self.in_work[inventory])

def print_shelf(self):
for inventory, equipment in self.shelf.items():
print(f'{inventory} {equipment.type} {equipment.brand} {equipment.model}')

def print_in_work(self):
for inventory, (equipment, division) in self.in_work.items():
print(f'{inventory} {equipment.type} {equipment.brand} {equipment.model} {division}')


class OfficeEquipment:
brand = ''
model = ''
inventory_number = 0
dimensions = (0, 0)
weight = 0
place = (0, 0)
is_network = False
number = 0

def __init__(self, brand, model, number=1):
self.brand = brand
self.model = model
self.number = number


class Printer(OfficeEquipment):
type = 'Принтер'
letter_size = ''
color = False


class CopyMachine(OfficeEquipment):
type = 'Копир'
auto_feeder = False


class Scanner(OfficeEquipment):
type = 'Сканер'
is_pdf_ready = False


if __name__ == '__main__':
sc_1 = Scanner('Canon', 'CanoScan LiDE 400')
sc_2 = Scanner('Epson', 'Perfection V19')
sc_3 = Scanner('Panasonic', 'KV-SL1066')
pr_1 = Printer('Xerox', 'Phaser 3020BI')
pr_2 = Printer('HP', 'LaserJet Pro M15w')
pr_3 = Printer('Brother', 'HL-L2340DWR')
cp_1 = CopyMachine('Xerox', 'B1022')
cp_2 = CopyMachine('Xerox', 'B215')
cp_3 = CopyMachine('Konica-Minolta', 'A0XY026')
wh1 = WarehouseEquipments([sc_1, sc_2, sc_3, pr_1, pr_2, pr_3])
print('Склад создан')
wh1.print_shelf()
print('Добавлено оборудование')
wh1.take_storage_equipments([cp_1, cp_2, cp_3])
wh1.print_shelf()
print('Выдано оборудование')
wh1.move_in_work(1005, 'Secretary')
wh1.move_in_work(1006, 'Secretary')
wh1.move_in_work(1007, 'R&D')
wh1.print_in_work()
print('Возвращено оборудование')
wh1.move_in_shelf(1005)
wh1.move_in_shelf(1006)
print('Склад')
wh1.print_shelf()
print('Выдано')
wh1.print_in_work()
Loading