Skip to content

Latest commit

 

History

History
211 lines (141 loc) · 9.69 KB

File metadata and controls

211 lines (141 loc) · 9.69 KB

Задачи второго блока

Во всех задачах реализуй соответствующие классы, соблюдай правила ООП.


1. 🏦 Класс BankAccount

Создай класс BankAccount с приватным атрибутом баланса.

Требования:

  • Метод deposit(amount) — пополнение счёта.
  • Метод withdraw(amount) — снятие со счёта (не снимать больше, чем есть).
  • Метод get_balance() — возвращает текущий баланс.

2. 💡 Умное устройство с множественным наследованием

Создай два класса:

  • Speaker с методом play_music()
  • Lamp с методом turn_on_light()

Создай класс SmartDevice, который наследует оба и добавляет метод activate() — включает музыку и свет.


3. 🛒 Классы Product, Item, ShoppingCart

  • Product: название, цена, вес.
  • Item: содержит Product и количество.
  • ShoppingCart: список объектов Item.

Обязательные методы и поведение:

➕ Добавление товара (add_item(product, quantity)):

  • Если товар уже есть в корзине (сравнение по названию), нужно увеличить количество в существующем Item.
  • Если такого товара ещё нет, создать новый Item и добавить его в корзину.
  • При добавлении отрицательного количества — выбросить ValueError.

➖ Удаление товара (remove_item(product)):

  • Удаляет Item, содержащий Product, из корзины.
  • Если товар не найден, вывести сообщение: Продукт '<название>' не найден в корзине.

📊 Другие методы:

  • get_total_price() — общая стоимость всех товаров.
  • get_total_weight() — общий вес всех товаров.
  • __len__() — количество разных товаров (Item).
  • __str__() — красивый вывод содержимого корзины.

4. 🧱 Усложнение корзины

Добавь в ShoppingCart:

  • Метод обновления количества товара.
  • Проверки на отрицательные значения цены, веса, количества.
  • Поддержку сложения корзин (+) — складываются количества совпадающих товаров.
  • Сортировку по:
    • цене (если одинаково — по весу, потом по названию),
    • весу,
    • названию.
  • Поддержку in и индексированного доступа ([]).

5. 📇 Класс Contact и AddressBook с миксином

  • Contact: имя, телефон, e-mail
  • AddressBook: список контактов, метод add_contact

Миксин:

Добавь SaveToFileMixin с методом save_to_file(filename), который сохраняет текстовое представление объекта в файл.

Применение:

  • Contact и AddressBook должны использовать этот миксин.

6. 🛠️ Усложнение адресной книги

Добавь:

  • Проверку на дублирование по email (удалять старый при совпадении).
  • Удаление по имени.
  • Поиск контактов по имени.

7. 🃏 Колода карт для игры в «Дурака»

Реализуй:

  • Card: ранг (6–A) и масть (♠ ♥ ♦ ♣)
  • Deck: 36 карт

Возможности:

  • Перетасовать
  • Вытянуть карту
  • Показать козырь (последняя карта)
  • Метод beats(other, trump_suit) — побеждает ли карта другую по правилам «дурака»

8. 🌡️ Класс Temperature

  • Хранит температуру в Цельсиях.
  • @classmethod:
    • from_fahrenheit(cls, f)
    • from_kelvin(cls, k)
  • @property:
    • fahrenheit
    • kelvin

9. 🧱 Паттерн Factory Method

Создай абстрактный класс Shape и классы-наследники:

  • Circle, Rectangle, Square

Создай ShapeFactory с методом create_shape(type: str) для создания фигур.


10. 🧠 Паттерн Strategy: сортировка товаров

  • Класс Product: название, цена, вес
  • Разные стратегии сортировки:
    • по цене
    • по алфавиту
    • по весу

Реализуй отдельные классы-стратегии и класс ProductSorter, который принимает стратегию и сортирует список.


Тут начинаются сложные, но приближенные к реальным задачам

11. 🌳 Бинарное дерево: классы Node и BinaryTree

Реализуй класс узла Node(value, left=None, right=None) и класс BinaryTree.

Требования:

  • Методы обхода: preorder(), inorder(), postorder() — возвращают список значений.
  • height() — высота дерева; count_leaves() — число листьев.
  • is_balanced() — разница высот поддеревьев каждого узла не больше 1.
  • __iter__() — итерирование по дереву (например, inorder).
  • Поддержка пустого дерева (корень None).

Крайние случаи:

  • Пустое дерево, дерево из одного узла, сильно «кривое» дерево (цепочка).

12. 🔍 Бинарное дерево поиска (BST)

Построй на основе Node/BinaryTree класс BST.

Требования:

  • insert(value), search(value) -> bool, remove(value) (3 случая удаления: лист, один ребёнок, два ребёнка).
  • min(), max(), to_sorted_list() (inorder даёт отсортированный список).
  • validate() -> bool — проверка свойства BST на всём дереве.
  • from_sorted_list(values) — построение почти сбалансированного BST из отсортированного списка.

Оценка сложности:

  • Средний случай: поиск/вставка/удаление — O(log n), худший — O(n) при вырождении.

13. 🕸️ Граф (ориентированный/неориентированный)

Реализуй класс Graph, использующий список смежности. Поддержи как ориентированные, так и неориентированные графы.

Требования:

  • Базовые операции: add_vertex(v), add_edge(u, v), remove_edge(u, v), neighbors(v).
  • Обходы: bfs(start) -> порядок вершин, dfs(start) -> порядок вершин.
  • shortest_path(u, v) — кратчайший путь в невзвешенном графе (BFS), вернуть список вершин.
  • connected_components() — компоненты связности (для неориентированного графа).
  • has_cycle() — обнаружение цикла (для направленного и/или ненаправленного графа; допустимы отдельные методы has_cycle_directed/has_cycle_undirected).
  • topological_sort() — для DAG (если цикл найден — выбросить исключение или вернуть индикатор ошибки).

Подсказки:

  • Для топологической сортировки можно использовать алгоритм Кана или DFS с порядком завершения.

14. 🌿 Git как DAG: модель коммитов

Смоделируй историю репозитория Git как ориентированный ациклический граф: каждый коммит ссылается на одного или нескольких родителей.

Требования:

  • Класс Commit (id/хеш, метаданные по желанию, список родителей).
  • Класс CommitGraph:
    • add_commit(id, parents: list[str])
    • is_ancestor(a, b) -> bool — является ли a предком b.
    • merge_base(a, b) — общий ближайший предок (аналог git merge-base).
    • topo_order() — топологический порядок коммитов.
  • Валидация: граф должен оставаться ацикличным (при попытке создать цикл — ошибка).

Примечание:

  • Это учебная модель: хеши/ветки/теги можно упростить до строк.

✅ Тесты

К каждой задаче необходимо написать модульные тесты с использованием стандартного модуля unittest.