diff --git a/07_OOP/Task_01.py b/07_OOP/Task_01.py new file mode 100644 index 0000000..fe0da01 --- /dev/null +++ b/07_OOP/Task_01.py @@ -0,0 +1,42 @@ +''' +Реализовать класс Matrix (матрица). Обеспечить перегрузку конструктора класса (метод __init__()), +который должен принимать данные (список списков) для формирования матрицы. + +Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в привычном виде. +Далее реализовать перегрузку метода __add__() для реализации операции сложения двух объектов класса Matrix (двух матриц). +Результатом сложения должна быть новая матрица. +Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой строки первой матрицы складываем с +первым элементом первой строки второй матрицы и т.д. +''' + +import copy # для создания полной копии первой матрицы при переопределении метода __add__ + +class Matrix: + + def __init__(self, matrix): + self.matrix = matrix + + def __str__(self): + my_str = '' + for el in self.matrix: + my_str += str(el) + '\n' + return my_str + + def __add__(self, other): + result = copy.deepcopy(self.matrix) + for line in range(len(result)): + for col in range(len(result[line])): + result[line][col] += other.matrix[line][col] + return Matrix(result) + + +a = Matrix([[1,2,3], [4,5,6], [7,8,9]]) +b = Matrix([[1,2,3], [4,5,6], [7,8,9]]) +c = Matrix([[1,2,3], [4,5,6], [7,8,9]]) + +print(a) +print(a + b + c) + + + + diff --git a/07_OOP/Task_02.py b/07_OOP/Task_02.py new file mode 100644 index 0000000..b5990c2 --- /dev/null +++ b/07_OOP/Task_02.py @@ -0,0 +1,74 @@ +''' +Реализовать проект расчета суммарного расхода ткани на производство одежды. +Основная сущность (класс) этого проекта — одежда, которая может иметь определенное название. +К типам одежды в этом проекте относятся пальто и костюм. У этих типов одежды существуют параметры: размер (для пальто) и +рост (для костюма). Это могут быть обычные числа: V и H, соответственно. +Для определения расхода ткани по каждому типу одежды использовать формулы: для пальто (V/6.5 + 0.5), +для костюма (2*H + 0.3). +Проверить работу этих методов на реальных данных. +Реализовать общий подсчет расхода ткани. +Проверить на практике полученные на этом уроке знания: реализовать абстрактные классы для основных классов проекта, +проверить на практике работу декоратора @property. +''' + +class Clothes: + + summary_rate = 0 # общее количество используеммой ткани + + def __init__(self, id, v, h): + self.id = id # номер заказа + self.v = v # ширина см + self.h = h # рост, см + + @property + def thread_length(self): # подстчет длины нити + return 2 * (self.v + self.h) + + +class Coat(Clothes): + + def rate(self): + rate = self.v / 6.5 + 0.5 # расчет расхода ткани + Clothes.summary_rate += rate + return rate + + @property + def cost(self): + return self.rate() * 100 + +class Suit(Clothes): + + def rate(self): + rate = 2 * self.h + 0.3 # расчет расхода ткани + Clothes.summary_rate += rate + return rate + + @property + def cost(self): + return self.rate() * 130 + +class Trousers(Clothes): + + def rate(self): + rate = self.v / 3.5 + 0.25 # расчет расхода ткани + Clothes.summary_rate += rate + return rate + + @property + def cost(self): + return self.rate() * 80 + + +my_coat = Coat(112, 48, 190) +my_suit = Suit(113, 52, 176) +my_trousers = Trousers(114, 46, 178) + + +print(f'Для заказа №{my_coat.id} необходимо {my_coat.rate()} метров ткани и {my_suit.thread_length} метров нити\n' + f'Себестоимость заказа {round(my_coat.cost, 2)} рублей\n') +print(f'Для заказа №{my_suit.id} необходимо {my_suit.rate()} метров ткани {my_suit.thread_length} метров нити\n' + f'Себестоимость заказа {round(my_suit.cost, 2)} рублей\n') +print(f'Для заказа №{my_trousers.id} необходимо {my_trousers.rate()} метров ткани {my_trousers.thread_length} метров нити\n' + f'Себестоимость заказа {round(my_trousers.cost, 2)} рублей\n') + +print(f'Общее количество используеммой ткани {round(Clothes.summary_rate, 2)} метров') diff --git a/07_OOP/Task_03.py b/07_OOP/Task_03.py new file mode 100644 index 0000000..2c05c39 --- /dev/null +++ b/07_OOP/Task_03.py @@ -0,0 +1,87 @@ +''' +Реализовать программу работы с органическими клетками. + +Необходимо создать класс Клетка. +В его конструкторе инициализировать параметр, соответствующий количеству клеток (целое число). +В классе должны быть реализованы методы перегрузки арифметических операторов: +сложение (__add__()), вычитание (__sub__()), умножение (__mul__()), деление (__truediv__()). + +Данные методы должны применяться только к клеткам и выполнять увеличение, уменьшение, +умножение и обычное (не целочисленное) деление клеток, соответственно. В методе деления должно осуществляться округление +значения до целого числа. + +Сложение. Объединение двух клеток. При этом число ячеек общей клетки должно равняться сумме ячеек исходных двух клеток. + +Вычитание. Участвуют две клетки. Операцию необходимо выполнять только если разность количества ячеек двух клеток +больше нуля, иначе выводить соответствующее сообщение. + +Умножение. Создается общая клетка из двух. Число ячеек общей клетки определяется как произведение количества ячеек +этих двух клеток. + +Деление. Создается общая клетка из двух. Число ячеек общей клетки определяется как целочисленное деление количества +ячеек этих двух клеток. + +В классе необходимо реализовать метод make_order(), принимающий экземпляр класса и количество ячеек в ряду. +Данный метод позволяет организовать ячейки по рядам. +Метод должен возвращать строку вида *****\n*****\n*****..., где количество ячеек между \n равно переданному аргументу. +Если ячеек на формирование ряда не хватает, то в последний ряд записываются все оставшиеся. + +Например, количество ячеек клетки равняется 12, количество ячеек в ряду — 5. Тогда метод make_order() вернет строку: +*****\n*****\n**. + +Или, количество ячеек клетки равняется 15, количество ячеек в ряду — 5. Тогда метод make_order() вернет строку: +*****\n*****\n*****. +''' + + +class Cell: + + def __init__(self, nums: int): + self.nums = nums # колличество клеток + + def __str__(self): + return f'{self.nums}' + + def __add__(self, other): + return Cell(self.nums + other.nums) + + def __sub__(self, other): + if self.nums > other.nums: + return Cell(self.nums - other.nums) + else: + return 'Результат - ноль или отрицательное число' + + def __mul__(self, other): + return Cell(self.nums * other.nums) + + def __truediv__(self, other): + return Cell(self.nums // other.nums) + + # вариант №1 метода make_order + # def make_order(self, n): + # lines = self.nums // n + # piece = self.nums - self.nums // n * n + # for i in range(lines): + # print('*' * n) + # print('*' * piece) + + # вариант №2 метода make_order + def make_order(self, n): + result = '' + for i in range(self.nums): + if i % n != 0 or i == 0: + result += '*' + else: + result += '\n*' + return result + + +cell_01 = Cell(5) +cell_02 = Cell(9) + +print(cell_01 + cell_02) # сложение +print(cell_01 - cell_02) # вычитание +print(cell_01 * cell_02) # умножение +print(cell_01 / cell_02) # деление + +print(cell_02.make_order(5)) # визуальное представление количства клеток