diff --git a/lesson6_1.py b/lesson6_1.py new file mode 100644 index 0000000..bc3f900 --- /dev/null +++ b/lesson6_1.py @@ -0,0 +1,38 @@ +# 1. Создать класс TrafficLight (светофор) и определить у него один атрибут color (цвет) и метод running (запуск). +# Атрибут реализовать как приватный. +# В рамках метода реализовать переключение светофора в режимы: красный, желтый, зеленый. +# Продолжительность первого состояния (красный) составляет 7 секунд, +# второго (желтый) — 2 секунды, третьего (зеленый) — на ваше усмотрение. +# Переключение между режимами должно осуществляться только в указанном порядке +# (красный, желтый, зеленый). Проверить работу примера, создав экземпляр и вызвав описанный метод. + + +import time + + +# Класс светофор. Цикл работы запускается методом running +class TrafficLight: + __color = "red" + + def running(self): + __color__ = "red" + print("red") + time.sleep(7) + __color__ = "yellow" + print("yellow") + time.sleep(2) + __color__ = "green" + print("green") + time.sleep(10) + + +tl = TrafficLight() + +while True: + action = input("Запустить сфетовор y/n? ") + if action.upper() == "Y": + { + tl.running() + } + else: + break diff --git a/lesson6_2.py b/lesson6_2.py new file mode 100644 index 0000000..66f1b71 --- /dev/null +++ b/lesson6_2.py @@ -0,0 +1,23 @@ +# 2. Реализовать класс Road (дорога), в котором определить атрибуты: +# length (длина), width (ширина). Значения данных атрибутов должны передаваться при создании экземпляра класса. +# Атрибуты сделать защищенными. +# Определить метод расчета массы асфальта, необходимого для покрытия всего дорожного полотна. +# Использовать формулу: длина * ширина * масса асфальта для покрытия одного кв метра дороги асфальтом, +# толщиной в 1 см * чи сло см толщины полотна. +# Проверить работу метода. +# Например: 20м * 5000м * 25кг * 5см = 12500 т + +class Road: + _lenght: int + _width: int + + def __init__(self, lenght, width): + self._lenght = lenght + self._width = width + + def calc_asphalt_mass(self, density, thick): + return self._lenght * self._width * density * thick + + +my_road = Road(5000, 20) +print(my_road.calc_asphalt_mass(25, 5)) \ No newline at end of file diff --git a/lesson6_3.py b/lesson6_3.py new file mode 100644 index 0000000..cc72125 --- /dev/null +++ b/lesson6_3.py @@ -0,0 +1,42 @@ +# 3. Реализовать базовый класс Worker (работник), в котором определить атрибуты: +# name, surname, position (должность), income (доход). +# Последний атрибут должен быть защищенным и ссылаться на словарь, содержащий элементы: +# оклад и премия, например, {"wage": wage, "bonus": bonus}. +# Создать класс Position (должность) на базе класса Worker. +# В классе Position реализовать методы получения полного имени сотрудника (get_full_name) и дохода +# с учетом премии (get_total_income). +# Проверить работу примера на реальных данных +# (создать экземпляры класса Position, передать данные, проверить значения атрибутов, вызвать методы экземпляров). + + +class Worker: + name: str + surname: str + position: str + _income = {} + + def __init__(self, new_name, new_surname, new_position, new_income): + self.name = new_name + self.surname = new_surname + self.position = new_position + self._income = new_income + + def get_income(self): + return int(self._income["wage"]) + int(self._income["bonus"]) + + +class Positon(Worker): + + def __init__(self, new_name, new_surname, new_position, new_income): + super().__init__(new_name, new_surname, new_position, new_income) + + def get_full_name(self): + return f"{self.name} {self.surname}" + + def get_total_income(self): + return self.get_income() + + +engineer = Positon("Иван", "Иванов", "Инженер", {"wage": 100000, "bonus": 50000}) +print(engineer.get_full_name()) +print(engineer.get_total_income()) diff --git a/lesson6_4.py b/lesson6_4.py new file mode 100644 index 0000000..15c95dc --- /dev/null +++ b/lesson6_4.py @@ -0,0 +1,85 @@ +# 4. Реализуйте базовый класс Car. У данного класса должны быть следующие атрибуты: +# speed, color, name, is_police (булево). А также методы: go, stop, turn(direction), +# которые должны сообщать, что машина поехала, остановилась, повернула (куда). +# Опишите несколько дочерних классов: TownCar, SportCar, WorkCar, PoliceCar. +# Добавьте в базовый класс метод show_speed, который должен показывать текущую скорость автомобиля. +# Для классов TownCar и WorkCar переопределите метод show_speed. +# При значении скорости свыше 60 (TownCar) и 40 (WorkCar) должно выводиться сообщение о превышении скорости. +# Создайте экземпляры классов, передайте значения атрибутов. +# Выполните доступ к атрибутам, выведите результат. +# Выполните вызов методов и также покажите результат. + +class Car: + speed: int + color: str + name: str + is_police: bool + + def go(self): + print("Машина поехала") + + def stop(self): + print("Машина остановилась") + + def turn(self, direction): + print(f"Машина повернула {direction}") + + def show_speed(self, speed): + self.speed = speed + print(f"Скорость машины {speed} км/ч") + + +class TownCar(Car): + def __init__(self, speed, color, name, is_police = False): + self.speed = speed + self.color = color + self.name = name + self.is_police = is_police + + def show_speed(self, speed): + self.speed = speed + if self.speed > 60: + print(f"Внимание: скорость превышена") + else: + print(f"Скорость машины {self.speed} км/ч") + + +class SportCar(Car): + def __init__(self, speed, color, name, is_police = False): + self.speed = speed + self.color = color + self.name = name + self.is_police = is_police + + +class WorkCar(Car): + def __init__(self, speed, color, name, is_police = False): + self.speed = speed + self.color = color + self.name = name + self.is_police = is_police + + def show_speed(self, speed): + self.speed = speed + if self.speed > 40: + print(f"Внимание: скорость превышена") + else: + print(f"Скорость машины {self.speed} км/ч") + + +class PoliceCar(Car): + def __init__(self, speed, color, name, is_police = True): + self.speed = speed + self.color = color + self.name = name + self.is_police = is_police + + +car1 = TownCar(40, "white", "Ford") +car1.go() +car1.show_speed(61) +car1.turn("направо") +car1.show_speed(59) + +print(f"цвет машины {car1.color}") +print(f"марка машины {car1.name}") \ No newline at end of file diff --git a/lesson6_5.py b/lesson6_5.py new file mode 100644 index 0000000..540d655 --- /dev/null +++ b/lesson6_5.py @@ -0,0 +1,47 @@ +# 5. Реализовать класс Stationery (канцелярская принадлежность). +# Определить в нем атрибут title (название) и метод draw (отрисовка). +# Метод выводит сообщение “Запуск отрисовки.” +# Создать три дочерних класса Pen (ручка), Pencil (карандаш), Handle (маркер). +# В каждом из классов реализовать переопределение метода draw. +# Для каждого из классов методы должен выводить уникальное сообщение. +# Создать экземпляры классов и проверить, что выведет описанный метод для каждого экземпляра. + + +class Stationery: + title: str + + def draw(self): + print("Запуск отрисовки") + + +class Pen(Stationery): + def __init__(self): + self.title = "Ручка" + + def draw(self): + print("Рисуем ручкой") + + +class Pencil(Stationery): + def __init__(self): + self.title = "Карандаш" + + def draw(self): + print("Рисуем карандашом") + + +class Handle(Stationery): + def __init__(self): + self.title = "Маркер" + + def draw(self): + print("Рисуем маркером") + + +stat1 = Pencil() +print(stat1.title) +stat1.draw() + +stat2 = Handle() +print(stat2.title) +stat2.draw() diff --git a/lesson7_1.py b/lesson7_1.py new file mode 100644 index 0000000..20a9994 --- /dev/null +++ b/lesson7_1.py @@ -0,0 +1,58 @@ +# 1. Реализовать класс Matrix (матрица). +# Обеспечить перегрузку конструктора класса (метод __init__()), +# который должен принимать данные (список списков) для формирования матрицы. +# Подсказка: матрица — система некоторых математических величин, расположенных в виде прямоугольной схемы. +# Примеры матриц вы найдете в методичке. +# Следующий шаг — реализовать перегрузку метода __str__() для вывода матрицы в привычном виде. +# Далее реализовать перегрузку метода __add__() для реализации операции сложения двух объектов класса Matrix +# (двух матриц). Результатом сложения должна быть новая матрица. +# Подсказка: сложение элементов матриц выполнять поэлементно — первый элемент первой строки первой +# матрицы складываем с первым элементом первой строки второй матрицы и т.д. + + +# Класс матрица +class Matrix: + def __init__(self, data_input: []): + self.data = data_input + + def __str__(self): + result = "" + + if len(self.data) == 0: + return "Матрица пуста" + + result += "[\n" + + for i in range(0, len(self.data)): + i_list = self.data[i] + result += f" {str(i_list)}\n" + + result += "]\n" + return result + + def __add__(self, second): + empty = Matrix([]) + result = [] + + if len(self.data) != len(second.data): + print("Размерности матриц не совпадают") + return empty + + for i in range(0, len(self.data)): + if len(self.data[i]) != len(second.data[i]): + print("Размерности матриц не совпадают") + return empty + new_line = [] + for j in range(0, len(self.data[i])): + new_line.append(self.data[i][j] + second.data[i][j]) + result.append(new_line) + + return Matrix(result) + + +m1 = Matrix([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) +m2 = Matrix([[9, 8, 7], [6, 5, 4], [3, 2, 1]]) +m3 = Matrix([[1, 2], [3, 4]]) +print(str(m1)) +m_summa = m1 + m2 +print(str(m_summa)) diff --git a/lesson7_2.py b/lesson7_2.py new file mode 100644 index 0000000..c260dba --- /dev/null +++ b/lesson7_2.py @@ -0,0 +1,56 @@ +# 2. Реализовать проект расчета суммарного расхода ткани на производство одежды. +# Основная сущность (класс) этого проекта — одежда, которая может иметь определенное название. +# К типам одежды в этом проекте относятся пальто и костюм. +# У этих типов одежды существуют параметры: размер (для пальто) и рост (для костюма). +# Это могут быть обычные числа: V и H, соответственно. +# Для определения расхода ткани по каждому типу одежды использовать формулы: для пальто (V/6.5 + 0.5), +# для костюма (2 * H + 0.3). Проверить работу этих методов на реальных данных. +# Реализовать общий подсчет расхода ткани. +# Проверить на практике полученные на этом уроке знания: +# реализовать абстрактные классы для основных классов проекта, проверить на практике работу декоратора @property. + +class Clother: + russian_name = "Одежда" + + def count_cloth(self): + return 0 + + +class Suit(Clother): + russian_name = "Костюм" + + def __init__(self, exact_height): + self.height = exact_height + + @property + def get_height(self): + return self.height + + @property + def count_cloth(self): + return 2 * self.height + 3 + + +class Coat(Clother): + russian_name = "Пальто" + + def __init__(self, exact_size): + self.size = exact_size + + @property + def get_size(self): + return self.size + + @property + def count_cloth(self): + return self.size / 6.5 + 0.5 + + +my_coat = Coat(45) +my_suit = Suit(1.80) + +#print(f"{my_coat.russian_name} размера {my_coat.get_size()} требует такани {my_coat.count_cloth()} кв.м") +#print(f"{my_suit.russian_name} размера {my_suit.get_height()} требует такани {my_suit.count_cloth()} кв.м") + +print(f"{my_coat.russian_name} размера {my_coat.get_size} требует такани {my_coat.count_cloth} кв.м") +print(f"{my_suit.russian_name} размера {my_suit.get_height} требует такани {my_suit.count_cloth} кв.м") \ No newline at end of file diff --git a/lesson7_3.py b/lesson7_3.py new file mode 100644 index 0000000..ac1312a --- /dev/null +++ b/lesson7_3.py @@ -0,0 +1,73 @@ +# 3. Реализовать программу работы с органическими клетками. Необходимо создать класс Клетка. +# В его конструкторе инициализировать параметр, соответствующий количеству клеток (целое число). +# В классе должны быть реализованы методы перегрузки арифметических операторов: сложение (__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, exact_quantity): + self.quantity = exact_quantity + + def __add__(self, other): + return Cell(self.quantity + other.quantity) + + def __sub__(self, other): + if (self.quantity - other.quantity) != 0: + return Cell(abs(self.quantity - other.quantity)) + + def __mul__(self, other): + return Cell(self.quantity * other.quantity) + + def __truediv__(self, other): + if other.quantity != 0: + return Cell(int(self.quantity / other.quantity)) + + def make_order(self, in_line): + result = "" + cells_left = self.quantity + while cells_left > 0: + if cells_left > in_line: + for i in range(0, in_line): + result += "*" + result += "\n" + cells_left -= in_line + else: + for i in range(0, cells_left): + result += "*" + cells_left = 0 + + return result + + +c1 = Cell(6) +c2 = Cell(4) +c_sum = c1 + c2 +c_sub = c1 - c2 +c_mul = c1 * c2 +c_div = c1 / c2 + +print(f"c1 = \n{c1.make_order(4)}") +print(f"c2 = \n{c2.make_order(4)}") +print(f"c_sum = \n{c_sum.make_order(4)}\n") +print(f"c_sub = \n{c_sub.make_order(4)}\n") +print(f"c_mul = \n{c_mul.make_order(4)}\n") +print(f"c_div = \n{c_div.make_order(4)}\n")