Найти - Пользователи
Полная версия: Задачи
Начало » Python для новичков » Задачи
1 2 3
al76ex
Добрый день! Помогите решить задачу:
Клиент приходит в кондитерскую. Он хочет приобрести один или несколько видов продукции, а также узнать её состав. Реализуйте кондитерскую. У вас есть словарь, где ключ – название продукции (торт, пирожное, маффин и т.д.). Значение – список, который содержит состав, цену (за 100гр) и кол-во (в граммах). Предложите выбор: 1. Если человек хочет посмотреть описание: название – описание 2. Если человек хочет посмотреть цену: название – цена. 3. Если человек хочет посмотреть количество: название – количество. 4. Всю информацию. 5. Приступить к покупке: С клавиатуры вводите название торта и его кол-во. n – выход из программы. Посчитать цену выбранных товаров и сколько товаров осталось в изначальном списке 6. До свидания.
AD0DE412
и что у вас уже есть?
ZerG
AD0DE412
и что у вас уже есть?
…желание получить готовый отлаженный код на 5-ку
AD0DE412
0.0001 BTC
Palrom
Казалось бы, не такая уж и сложная задача по описанию, но с@ка, я два вечера угробил на реализацию. Чукча конечно не бухгалтер, над расчётами и правда посмеяться можно, как лучше я не знаю, но в целом всё работает, даже не падает. На перёд, в своё оправдание скажу дефолтное: “я художник, я так вижу”.

  
goods = {'торт': ['мука, яйцо, сливки, шоколад', 150, 2000],
         'пирожное': ['тесто слоеное, молоко, сливочное масло', 120, 1500],
         'маффин': ['порошок яичный, порошок какао, ванилин', 200, 1000]}
my_cart = {}
 
def goods_demo(demo_type=0, product=None):
    p = 'Товар:'
    s = 'Состав: '
    c = 'Цена за 100 гр.: '
    k = 'Количество (г): '
    if demo_type == 0:
        for i in goods:
            print(i)
        return
    elif demo_type == 1:
        return f'{s}{goods[product][0]}'
    elif demo_type == 2:
        return f'{c}{goods[product][1]}'
    elif demo_type == 3:
        return f'{k}{goods[product][2]}'
    elif demo_type == 4:
        return f'{s}{goods[product][0]}\n' \
               f'{c}{goods[product][1]}\n' \
               f'{k}{goods[product][2]}'
    elif demo_type == 6:
        print('\nОстаток кондитерской:')
        for i in goods:
            print(f'{p} "{i}" {k}{goods[i][2]}')
        return
 
def ask_action_type(product):
    while True:
        try:
            action = int(input('Что вы хотели бы узнать о товаре?\n '
                               '(1)-состав, (2)-цена, (3)-количество, '
                               '(4)-вся инф., (5)-покупка\n>>> '))
            if action == 5:
                return action
            elif 1 <= action <= 4:
                return goods_demo(action, product)
        except:
            print('Введите число, сопоставленное с действием.')
            continue
 
def ask_continue():
    while True:
        s = input('Продолжить покупки? д|н\n>>> ').lower()
        if s == 'д':
            return True
        elif s == 'н':
            return False
 
def add_to_cart(product, price, weight):
    if product in my_cart.keys():
        my_cart[product][0] += price
        my_cart[product][1] += weight
    else:
        my_cart.update({product: [price, weight]})
 
def buy(product):
    while True:
        try:
            weight = abs(int(input('Сколько грамм купить?\n>>> ')))
        except:
            print('Нужно ввести целое число.')
            continue
        if goods[product][2] - weight >= 0:
            if weight > 0:
                goods[product][2] -= weight
                price = goods[product][1] * (weight * 0.01)
                return add_to_cart(product, price, weight)
            else:
                print('Нужно число больше нуля.')
                continue
        else:
            print(f'На складе нет такого количества! '
                  f'В наличии: {goods[product][2]}')
            continue
 
def show_total():
    p = 'Товар:'
    o = 'Общая стоимость товаров: '
    w = 'Вес в граммах: '
    summ = 0
    print('В вашей корзине: ')
    for i in my_cart:
        summ += my_cart[i][0]
        print(f'{p} "{i}" {w}{my_cart[i][1]}')
    print(f'{o}{summ} у.е.')
    if goods != {}:
        return goods_demo(6)
 
def check_goods():
    global goods
    new = goods.copy()
    for i in goods:
        if goods[i][2] == 0:
            new.pop(i)
    goods = new.copy()
    if goods == {}:
        print('Все товары закончились!')
        return False
    else:
        return True
 
def ask_product():
    while True:
        product = input('Какой из товаров вас интересует?\n>>> ').lower()
        if product in goods.keys():
            return product
        else:
            print('Такого товара нет, введите товар из списка выше.')
            continue
 
def main():
    print('Добро пожаловать в кондитерскую!')
    run = True
    while run:
        if check_goods():
            print('В продаже имеется:')
            goods_demo()
            user_choice = ask_product()
            user_interest = ask_action_type(user_choice)
            if user_interest == 5:
                buy(user_choice)
            else:
                print(f'Товар: "{user_choice}"\n{user_interest}')
            run = ask_continue()
        else:
            break
    show_total()
    print('До свидания.')
 
if __name__ == '__main__':
    main()
FishHook
Palrom
Здесь есть вообще все ошибки проектирования и алгоритмирования, вообще все,
на вашем материале можно докторскую защитить - как ни в коем случае нельзя писать код

апдейт
я более внимательно еще посмотрел…
не чувак, это прям совсем говно
если хочешь, я разберу по строкам, но не в пятницу вечером

ПС. Ты извини за грубость выражения мысли, но смысл он важнее формы
Palrom
FishHook
не чувак, это прям совсем говно
Спасибо, старался) Если честно, выложил, просто потому что жалко было вложенный труд (по натягиванию совы на глобус) отправить сразу в мусор. Я изначально начал не с того. Программа была более менее стройной до тех пор, пока я не начал примазывать к ней функцию покупки..
FishHook
смысл он важнее формы
Я тоже так считаю. Переосмыслю на днях, переделаю всё.
py.user.next
Palrom
Если честно, выложил, просто потому что жалко было вложенный труд
Выкладывай всегда, не ведись на код. Практически всегда чудесное творение, которое жалко выложить, оказывается говнокодом на каком-то уровне развития. Если не будешь выкладывать, тебе никто на ошибки или просто на какую-то тупость не укажет и ты её не будешь исправлять у себя и будешь долго-долго писать с ней и она будет у тебя во всех твоих кодах, пока ты сам не перейдёшь на следующий уровень и на нём уже не заметишь, что это тупость какая-то. Отказываться от тупостей очень сложно, особенно, если ты ими пользуешься уже несколько лет. Часто приходится себя полностью перестраивать. Прямо фундаментально, бывает.
Palrom
FishHook
если хочешь, я разберу по строкам
py.user.next
тебе никто на ошибки или просто на какую-то тупость не укажет и ты её не будешь исправлять
Ну вообще, если не брезгуете и располагаете временем, я бы конечно не отказался от какого никакого код-ревью.. Буду рад любым замечаниям.
py.user.next
Palrom
я бы конечно не отказался от какого никакого код-ревью
Видно, что ты программируешь снизу вверх. Ну, типа пишешь функцию, потом думаешь “а что для неё надо?” и начинаешь писать ещё функцию, которая вызывает эту функцию. Потом снова и снова так делаешь. Ну, и чем больше ты так делаешь, раз за разом, тем больше оно становится похоже на свалку, что мы и наблюдаем в твоём итоговом коде. Свалка и свалка. Нет чёткой такой конструкции, где всё во всём понятно.

Надо программировать сверху вниз. Тогда эта штука вся будет вырисовываться точно и определённо, не будет ничего лишнего.
Тут писал подборку материалов.
Тут выполнил один пример от и до.

По синтаксису питона и по принятым правилам написания кода FishHook тебе будет писать. Много у тебя всяких непитонячих приёмов, которые в питоне просто не используются так, как в других языках. Типа там безымянный except и подобные вещи.

Вообще, очень бросается в глаза, что у тебя функции такие маленькие, а в них уже можно запутаться. Типа, есть клубок ниток, который можно размотать в одну нитку. А есть борода из ниток, которая тоже может быть одной ниткой по сути, но при этом её проще разрезать всю, чем разматывать. Вот такой код у тебя - не красивый маленький десятисантиметровый клубок, а борода на четыре квадратных метра. А всё дело в том, кто это всё смотать пытался и по какому принципу - по всем правилам или просто побыстрее.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB