From e6e425500fc1bc50068c2b3ef05290cf4512d614 Mon Sep 17 00:00:00 2001 From: Shirguin Date: Mon, 17 May 2021 07:34:58 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=BC=D0=B0=D1=88=D0=BD=D0=B5?= =?UTF-8?q?=D0=B5=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BA=20?= =?UTF-8?q?=D0=B2=D0=BE=D1=81=D1=8C=D0=BC=D0=BE=D0=BC=D1=83=20=D1=83=D1=80?= =?UTF-8?q?=D0=BE=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task_1_lesson8.py | 38 ++++++++++++ task_2_lesson8.py | 22 +++++++ task_3_lesson8.py | 36 +++++++++++ task_4_lesson8.py | 84 ++++++++++++++++++++++++++ task_5_lesson8.py | 99 +++++++++++++++++++++++++++++++ task_6_lesson8.py | 148 ++++++++++++++++++++++++++++++++++++++++++++++ task_7_lesson8.py | 29 +++++++++ 7 files changed, 456 insertions(+) create mode 100644 task_1_lesson8.py create mode 100644 task_2_lesson8.py create mode 100644 task_3_lesson8.py create mode 100644 task_4_lesson8.py create mode 100644 task_5_lesson8.py create mode 100644 task_6_lesson8.py create mode 100644 task_7_lesson8.py diff --git a/task_1_lesson8.py b/task_1_lesson8.py new file mode 100644 index 0000000..57b1f90 --- /dev/null +++ b/task_1_lesson8.py @@ -0,0 +1,38 @@ +# Задание №1 +# Реализовать класс «Дата», функция-конструктор которого должна принимать дату в виде +# строки формата «день-месяц-год». В рамках класса реализовать два метода. Первый, с +# декоратором @classmethod. Он должен извлекать число, месяц, год и преобразовывать их тип +# к типу «Число». Второй, с декоратором @staticmethod, должен проводить валидацию числа, +# месяца и года (например, месяц — от 1 до 12). Проверить работу полученной структуры на +# реальных данных. + +class Date: + def __init__(self, day=0, month=0, year=0): + self.day = day + self.month = month + self.year = year + + @classmethod + def number_from_string(cls, string_date): + day, month, year = map(int, string_date.split('-')) + print(string_date) + return day, month, year + + @staticmethod + def valid_date(string_date): + day, month, year = map(int, string_date.split('-')) + print(string_date) + if 0 < day <= 31 and 0 < month <= 12 and year <= 2021: + return day, month, year + else: + print('Дата введена не верно!') + + +d1 = '12-04-1961' +d2 = '17-05-2000' +d3 = '20-13-2021' +print(Date.number_from_string(d1)) +print() +print(Date.valid_date(d2)) +print() +print(Date.valid_date(d3)) diff --git a/task_2_lesson8.py b/task_2_lesson8.py new file mode 100644 index 0000000..7bfd414 --- /dev/null +++ b/task_2_lesson8.py @@ -0,0 +1,22 @@ +# Задание №2 +# Создайте собственный класс-исключение, обрабатывающий ситуацию деления на ноль. +# Проверьте его работу на данных, вводимых пользователем. При вводе нуля в качестве +# делителя программа должна корректно обработать эту ситуацию и не завершиться с ошибкой. + +class DivisionZero(Exception): + def __init__(self, text): + self.text = text + + +try: + divisible = float(input('Введите делимое число: ')) + divisor = float(input('Введите делитель: ')) + if divisor == 0: + raise DivisionZero('Вы ввели ноль, деление на ноль невозможно!') +except ValueError: + print('Вы ввели не число') +except DivisionZero as err: + print(err) +else: + print(f'Результат деления равен: {round((divisible / divisor), 2)}') +print('Программа завершена') diff --git a/task_3_lesson8.py b/task_3_lesson8.py new file mode 100644 index 0000000..4835af3 --- /dev/null +++ b/task_3_lesson8.py @@ -0,0 +1,36 @@ +# Задание №3 +# Создайте собственный класс-исключение, который должен проверять содержимое списка на +# наличие только чисел. Проверить работу исключения на реальном примере. Запрашивать у +# пользователя данные и заполнять список необходимо только числами. Класс-исключение +# должен контролировать типы данных элементов списка. +# Примечание: длина списка не фиксирована. Элементы запрашиваются бесконечно, пока +# пользователь сам не остановит работу скрипта, введя, например, команду «stop». При этом +# скрипт завершается, сформированный список с числами выводится на экран. +# Подсказка: для этого задания примем, что пользователь может вводить только числа и строки. +# Во время ввода пользователем очередного элемента необходимо реализовать проверку типа +# элемента. Вносить его в список, только если введено число. Класс-исключение должен не +# позволить пользователю ввести текст (не число) и отобразить соответствующее сообщение. +# При этом работа скрипта не должна завершаться. + +class NotNumber(Exception): + def __init__(self, text): + self.text = text + + +my_ls = [] +while True: + try: + el_my_ls = input('Введите число для следующего элемента списка или "stop" для выхода: ') + if el_my_ls == "stop": + break + else: + try: + el_my_ls = int(el_my_ls) + except ValueError: + raise NotNumber('Вы ввели не число!') + my_ls.append(el_my_ls) + except NotNumber as err: + print(err) +print() +print(f'Введенный список элементов: {my_ls}') +print('Программа завершена') diff --git a/task_4_lesson8.py b/task_4_lesson8.py new file mode 100644 index 0000000..27fb7a1 --- /dev/null +++ b/task_4_lesson8.py @@ -0,0 +1,84 @@ +# Задание №4 +# Начните работу над проектом «Склад оргтехники». Создайте класс, описывающий склад. А +# также класс «Оргтехника», который будет базовым для классов-наследников. Эти классы — +# конкретные типы оргтехники (принтер, сканер, ксерокс). В базовом классе определите +# параметры, общие для приведённых типов. В классах-наследниках реализуйте параметры, +# уникальные для каждого типа оргтехники. + +class Warehouse: + def __init__(self): + self.nomenclature = [] + + # Поступление на склад товара + def entrance(self, product): + self.nomenclature.append(product) + + # Убытие товара со склада + def departure(self, product): + self.nomenclature.remove(product) + + # Остаток товара на складе + def balance(self): + return self.nomenclature + + +class OfficeEquipment: + def __init__(self, manufacturer, model, color): + self.manufacturer = manufacturer + self.model = model + self.color = color + + +class Printer(OfficeEquipment): + def __init__(self, manufacturer, model, color, printing_technology): + super().__init__(manufacturer, model, color) + self.printing_technology = printing_technology + self.type_equipment = 'принтер' + + def product_card(self): + card = f'{self.type_equipment} {self.manufacturer} {self.model} {self.color} {self.printing_technology}' + return card + + +class Scanner(OfficeEquipment): + def __init__(self, manufacturer, model, color, permission): + super().__init__(manufacturer, model, color) + self.permission = permission + self.type_equipment = 'сканер' + + def product_card(self): + card = f'{self.type_equipment} {self.manufacturer} {self.model} {self.color} {self.permission}' + return card + + +class CopyMachine(OfficeEquipment): + def __init__(self, manufacturer, model, color, permission): + super().__init__(manufacturer, model, color) + self.permission = permission + self.type_equipment = 'ксерокс' + + def product_card(self): + card = f'{self.type_equipment} {self.manufacturer} {self.model} {self.color} {self.permission}' + return card + + +# Создаем оргтехнику +pr_1 = Printer('Epson', 'TX659', 'серый', 'струйный') +print(pr_1.product_card()) +sc_1 = Scanner('Epson', 'EX897', 'черный', 'dpi 600x1200') +print(sc_1.product_card()) +cm_1 = CopyMachine('Xerox', 'X7856S', 'белый', 'dpi 1200x1200') +print(cm_1.product_card()) + +# Создаем склад и перемещаем на него оргтехнику +wh = Warehouse() +wh.entrance(pr_1.product_card()) +wh.entrance(sc_1.product_card()) +wh.entrance(cm_1.product_card()) + +# Смотрим остаток товара +print(f'Остаток товара на складе {wh.balance()}') + +# Перемещаем товар со склада +wh.departure(sc_1.product_card()) +print(f'Остаток товара на складе {wh.balance()}') diff --git a/task_5_lesson8.py b/task_5_lesson8.py new file mode 100644 index 0000000..dacd355 --- /dev/null +++ b/task_5_lesson8.py @@ -0,0 +1,99 @@ +# Задание №5 +# Продолжить работу над первым заданием. Разработайте методы, которые отвечают за приём +# оргтехники на склад и передачу в определённое подразделение компании. Для хранения +# данных о наименовании и количестве единиц оргтехники, а также других данных, можно +# использовать любую подходящую структуру (например, словарь). + +class Warehouse: + def __init__(self): + self.nomenclature = {} + self.nomenclature_b = {} + + # Поступление на склад товара + def entrance(self, product, quantity, price): + self.nomenclature[product] = [quantity, price] + + # Убытие товара со склада + def departure(self, product): + del self.nomenclature[product] + + # Перемещение товара в подразделение "B" + def moving(self, product): + self.nomenclature_b[product] = self.nomenclature[product] + del self.nomenclature[product] + + # Остаток товара на складе "A" + def balance(self): + return self.nomenclature + + # Остаток товара в подразделении "B" склада "A" + def balance_b(self): + return self.nomenclature_b + + +class OfficeEquipment: + def __init__(self, manufacturer, model, color): + self.manufacturer = manufacturer + self.model = model + self.color = color + + +class Printer(OfficeEquipment): + def __init__(self, manufacturer, model, color, printing_technology): + super().__init__(manufacturer, model, color) + self.printing_technology = printing_technology + self.type_equipment = 'принтер' + + def product_card(self): + card = f'{self.type_equipment} {self.manufacturer} {self.model} {self.color} {self.printing_technology}' + return card + + +class Scanner(OfficeEquipment): + def __init__(self, manufacturer, model, color, permission): + super().__init__(manufacturer, model, color) + self.permission = permission + self.type_equipment = 'сканер' + + def product_card(self): + card = f'{self.type_equipment} {self.manufacturer} {self.model} {self.color} {self.permission}' + return card + + +class CopyMachine(OfficeEquipment): + def __init__(self, manufacturer, model, color, permission): + super().__init__(manufacturer, model, color) + self.permission = permission + self.type_equipment = 'ксерокс' + + def product_card(self): + card = f'{self.type_equipment} {self.manufacturer} {self.model} {self.color} {self.permission}' + return card + + +# Создаем оргтехнику +pr_1 = Printer('Epson', 'TX659', 'серый', 'струйный') +print(pr_1.product_card()) +sc_1 = Scanner('Epson', 'EX897', 'черный', 'dpi 600x1200') +print(sc_1.product_card()) +cm_1 = CopyMachine('Xerox', 'X7856S', 'белый', 'dpi 1200x1200') +print(cm_1.product_card()) + +# Создаем склад и перемещаем на него оргтехнику +wh_a = Warehouse() +wh_a.entrance(pr_1.product_card(), 15, 8500) +wh_a.entrance(sc_1.product_card(), 5, 4200) +wh_a.entrance(cm_1.product_card(), 10, 15000) + +# Смотрим остаток товара +print(f'Остаток товара на складе "A": {wh_a.balance()}') + +# Расход товара со склада "A" +wh_a.departure(sc_1.product_card()) +print(f'Остаток товара на складе "A": {wh_a.balance()}') + +# Перемещение товара со склада "A" в подразделение "B" +wh_a.moving(cm_1.product_card()) +print(f'Остаток товара на складе "A": {wh_a.balance()}') +print(f'Остаток товара в подразделении "B" склада "A": {wh_a.balance_b()}') +print('Программа завершена') diff --git a/task_6_lesson8.py b/task_6_lesson8.py new file mode 100644 index 0000000..c4fbeb3 --- /dev/null +++ b/task_6_lesson8.py @@ -0,0 +1,148 @@ +# Задание №6 +# Продолжить работу над вторым заданием. Реализуйте механизм валидации вводимых +# пользователем данных. Например, для указания количества принтеров, отправленных на +# склад, нельзя использовать строковый тип данных. +# Подсказка: постарайтесь реализовать в проекте «Склад оргтехники» максимум возможностей, +# изученных на уроках по ООП. + +global in_quantity, in_price + + +class Warehouse: + def __init__(self): + self.nomenclature = {} + self.nomenclature_b = {} + + # Поступление на склад товара + def entrance(self, product, quantity, price): + self.nomenclature[product] = [quantity, price] + + # Убытие товара со склада + def departure(self, product): + del self.nomenclature[product] + + # Перемещение товара в другое подразделение + def moving(self, product): + self.nomenclature_b[product] = self.nomenclature[product] + del self.nomenclature[product] + + # Остаток товара на складе "A" + def balance(self): + return self.nomenclature + + # Остаток товара в подразделении "B" склада "A" + def balance_b(self): + return self.nomenclature_b + + +class OfficeEquipment: + def __init__(self, manufacturer, model, color): + self.manufacturer = manufacturer + self.model = model + self.color = color + + +class Printer(OfficeEquipment): + def __init__(self, manufacturer, model, color, printing_technology): + super().__init__(manufacturer, model, color) + self.printing_technology = printing_technology + self.type_equipment = 'принтер' + + def product_card(self): + card = f'{self.type_equipment} {self.manufacturer} {self.model} {self.color} {self.printing_technology}' + return card + + +class Scanner(OfficeEquipment): + def __init__(self, manufacturer, model, color, permission): + super().__init__(manufacturer, model, color) + self.permission = permission + self.type_equipment = 'сканер' + + def product_card(self): + card = f'{self.type_equipment} {self.manufacturer} {self.model} {self.color} {self.permission}' + return card + + +class CopyMachine(OfficeEquipment): + def __init__(self, manufacturer, model, color, permission): + super().__init__(manufacturer, model, color) + self.permission = permission + self.type_equipment = 'ксерокс' + + def product_card(self): + card = f'{self.type_equipment} {self.manufacturer} {self.model} {self.color} {self.permission}' + return card + + +# Ввод всех параметров оборудования и оприходывание на склад "A" +def input_product(): + while True: + while True: + type_equipment = input('Введите тип оборудования(принтер, сканер, ксерокс): ') + if type_equipment == 'принтер' or type_equipment == 'сканер' or type_equipment == 'ксерокс': + break + else: + print('Тип оборудования введен неверно!!!') + manufacturer = input('Введите производителя оборудования: ') + model = input('Введите модель оборудования: ') + color = input('Введите цвет оборудования: ') + if type_equipment == 'принтер': + printing_technology = input('Введите технологию печати: ') + product = Printer(manufacturer, model, color, printing_technology).product_card() + print(product) + input_quantity() + input_price() + wh_a.entrance(product, in_quantity, in_price) + elif type_equipment == 'сканер': + permission = 'dpi ' + input('Введите разрешение оборудования: ') + product = Scanner(manufacturer, model, color, permission).product_card() + print(product) + input_quantity() + input_price() + wh_a.entrance(product, in_quantity, in_price) + else: + permission = 'dpi ' + input('Введите разрешение оборудования: ') + product = CopyMachine(manufacturer, model, color, permission).product_card() + print(product) + input_quantity() + input_price() + wh_a.entrance(product, in_quantity, in_price) + while True: + temp_exit = input('Хотите ввести следующий товар "да, нет"?: ') + if temp_exit == 'да' or temp_exit == 'нет': + break + else: + print('Вы ввели не правильную команду!!!') + if temp_exit == 'нет': + print('Оприходывание товара завершено!\n') + break + + +# Ввод количества оборудования +def input_quantity(): + global in_quantity, in_price + try: + in_quantity = int(input('Введите количество этого товара: ')) + except ValueError: + print('Вы ввели не число!!!') + input_quantity() + return in_quantity + + +# Ввод цены оборудования +def input_price(): + global in_price + try: + in_price = float(input('Введите цену этого товара: ')) + except ValueError: + print('Вы ввели не число!!!') + input_price() + return in_price + + +wh_a = Warehouse() +print('Оприходывание товара на склад "A"') +input_product() +print(f'Остаток товара на складе "A": {wh_a.balance()}') +print('Программа завершена') diff --git a/task_7_lesson8.py b/task_7_lesson8.py new file mode 100644 index 0000000..4880ba6 --- /dev/null +++ b/task_7_lesson8.py @@ -0,0 +1,29 @@ +# Задание №7 +# Реализовать проект «Операции с комплексными числами». Создайте класс «Комплексное +# число». Реализуйте перегрузку методов сложения и умножения комплексных чисел. Проверьте +# работу проекта. Для этого создаёте экземпляры класса (комплексные числа), выполните +# сложение и умножение созданных экземпляров. Проверьте корректность полученного +# результата. + +class ComplexNumber: + def __init__(self, a, b): + self.a = a + self.b = b + + def __add__(self, other): + return f'{self.a + other.a}+{self.b + other.b}*i' + + def __mul__(self, other): + return f'{self.a * other.a - self.b * other.b}+{self.a * other.b + other.a * self.b}*i' + + def __str__(self): + return f'{self.a}+{self.b}*i' + + +comp_1 = ComplexNumber(1, 2) +comp_2 = ComplexNumber(3, 4) +print(f'Комплексное число №1: ({comp_1})') +print(f'Комплексное число №2: ({comp_2})') +print(f'Сумма комплексных чисел равна: ({comp_1 + comp_2})') +print(f'Произведение комплексных чисел равно: ({comp_1 * comp_2})') +print('Программа завершена')