Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2024, 14:14   #1
Nicodim
Пользователь
 
Регистрация: 31.05.2023
Сообщений: 31
По умолчанию Программирование на Python, dataclass

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

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

Для этого вам нужно доработать дата-класс Promo, чтобы он мог принимать список товаров, на который будет распространяться промокод. Если список товаров не передать при создании, то данный промокод применяется ко всей корзине целиком.

Также необходимо доработать метод add_product в классе Cart. Необходимо добавить возможность передавать в него количество товара, которое добавляется в корзину. Например, строка

cart.add_product(product1, 5)
говорит о том, что нужно добавить в корзину 5 единиц товара product1. Если не передавать количество

cart.add_product(product1)
то нужно считать, что добавили одну единицу товара.

Тест программы.


Sample Input 1:

book = Product('Книга', 100.0)
usb = Product('Флешка', 50.0)
pen = Product('Ручка', 10.0)

ACTIVE_PROMO = [
Promo('new', 20, [pen]),
Promo('all_goods', 30),
]

cart = Cart()
cart.add_product(book, 10)
cart.add_product(pen)
print(cart.get_total())

# Применение промокода в 20% на ручку
cart.apply_promo('new')
print(cart.get_total())
Sample Output 1:

1010.0
Промокод new успешно применился
1008.0
Sample Input 2:

book = Product('Книга', 100.0)
usb = Product('Флешка', 50.0)
pen = Product('Ручка', 10.0)

ACTIVE_PROMO = [
Promo('new', 20, [pen]),
Promo('all_goods', 30),
Promo('only_book', 40, [book]),
]

cart = Cart()
cart.add_product(book, 10)
cart.add_product(pen)
print(cart.get_total())

# Применение промокода в 40% на книгу
cart.apply_promo('only_book')
print(cart.get_total())
Sample Output 2:

1010.0
Промокод only_book успешно применился
610.0
Sample Input 3:

book = Product('Книга', 100.0)
usb = Product('Флешка', 50.0)
pen = Product('Ручка', 10.0)

ACTIVE_PROMO = [
Promo('new', 20, [pen]),
Promo('all_goods', 30),
Promo('only_book', 40, [book]),
]

cart = Cart()
cart.add_product(book, 10)
cart.add_product(pen)
cart.add_product(usb, 5)
print(cart.get_total())

# Применение промокода в 30% на все
cart.apply_promo('all_goods')
print(cart.get_total())
Sample Output 3:

1260.0
Промокод all_goods успешно применился
882.0


Код:
from dataclasses import dataclass, field
from typing import List, Optional

# Глобальная переменная для хранения активных промокодов
ACTIVE_PROMO = []

@dataclass
class Product:
    name: str
    price: float

@dataclass
class Promo:
    code: str
    discount: float  # Скидка в процентах
    applicable_products: Optional[List[Product]] = field(default_factory=list)

@dataclass
class Cart:
    products: List[tuple] = field(default_factory=list)  # Список кортежей (Product, quantity)
    applied_promo: Optional[Promo] = None

    def add_product(self, product: Product, quantity: int = 1):
        """Добавление товара в корзину."""
        self.products.append((product, quantity))

    def get_total(self) -> float:
        """Расчет общей суммы покупок в корзине с учетом примененного промокода."""
        total = sum(product.price * quantity for product, quantity in self.products)

        # Если применен промокод, рассчитываем скидку
        if self.applied_promo:
            if self.applied_promo.applicable_products:
                applicable_total = sum(
                    product.price * quantity for product, quantity in self.products
                    if product in self.applied_promo.applicable_products
                )
                discount_amount = applicable_total * (self.applied_promo.discount / 100)
                total -= discount_amount
            else:
                discount_amount = total * (self.applied_promo.discount / 100)
                total -= discount_amount

        return total

    def apply_promo(self, promo_code: str) -> str:
        """Применение промокода к корзине."""
        global ACTIVE_PROMO
        for promo in ACTIVE_PROMO:
            if promo.code == promo_code:
                self.applied_promo = promo
                print( f"Промокод {promo_code} успешно применился")

        return f"Такого {promo_code} не существует"
Nicodim вне форума Ответить с цитированием
Старый 23.12.2024, 19:47   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

На первый взгляд не вижу проблем. А есть еще какие-нибудь требования к методу apply_promo? В текущем виде он печатает сообщение об успешном применении, если нашел промокод, но всегда возвращает результат-сообщение, будто не нашел промокод.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.12.2024, 05:49   #3
Nicodim
Пользователь
 
Регистрация: 31.05.2023
Сообщений: 31
По умолчанию

Здравствуйте, дело в 5 тесте, что не так не понятно какая то не точность.

book = Product('Книга', 100.0)
usb = Product('Флешка', 50.0)
pen = Product('Ручка', 10.0)

ACTIVE_PROMO = [
Promo('new', 20, [pen]),
Promo('all_goods', 30),
Promo('sale', 50, [book, usb]),
]

cart = Cart()
cart.add_product(book, 10)
cart.add_product(pen)
cart.add_product(book, 5)
cart.add_product(usb, 5)
cart.add_product(usb, 15)
cart.add_product(pen, 2)

print(cart.get_total())

# Применение промокода в 50% на книги и флешки
cart.apply_promo('sale')
print(cart.get_total())
Nicodim вне форума Ответить с цитированием
Старый 24.12.2024, 12:22   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Цена корзины до и после применения промокода вроде верна. Может быть, нужно складывать количество одного товара в корзине, а не делать несколько позиций, т.е. чтобы в корзине в последнем примере было [(book, 15), (pen, 3), (usb, 20)] после добавления всех товаров.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.12.2024, 18:18   #5
Nicodim
Пользователь
 
Регистрация: 31.05.2023
Сообщений: 31
По умолчанию

Благодарю за помощь!!!!
Nicodim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование на Python Nicodim Помощь студентам 5 05.11.2024 13:18
Программирование на Python Задача на программирование покрытие отрезками Nicodim Помощь студентам 2 29.12.2023 21:19
Программирование на Python fyz abkbvjyjdf Помощь студентам 11 14.12.2022 19:42
Программирование на python Семен_13 Python 7 17.10.2022 17:59
Программирование Python Белка и Стрелка Помощь студентам 1 29.05.2017 23:53