Python: торговый автомат - PullRequest
       21

Python: торговый автомат

0 голосов
/ 21 октября 2018

Программа предлагает товары, платит за них пользователю, «отдает» товары и обновляет запасы каждого товара.Кажется, работает более или менее.У меня есть 2 вопроса:

1) Я не знаю, как выйти из программы торгового автомата после того, как пользователь ответит 'n', чтобы 'купить что-нибудь еще?(да / нет): '.

2) Есть ли способ сделать код проще / лучше?

def vend():

    a = {'item': 'choc', 'price': 1.5, 'stock': 2}
    b = {'item': 'pop', 'price': 1.75, 'stock': 1}
    c = {'item': 'chips', 'price': 2.0, 'stock': 3}
    d = {'item': 'gum', 'price': 0.50, 'stock': 1}
    e = {'item': 'mints', 'price': 0.75, 'stock': 3}
    items = [a, b, c, d, e]
    cim = 0 # cash in machine

    print('welcome to vending machine! \n***************')

    # show items, prices
    def show(items):
        print('\nitems available \n***************')

        for item in items:      
            if item.get('stock') == 0:
                items.remove(item)
        for item in items:
            print(item.get('item'), item.get('price'))

        print('***************\n')

    # have user choose item
    while True:
        show(items)
        selected = input('select item: ')
        for item in items:
            if selected == item.get('item'):
                selected = item               
                price = selected.get('price')
                while cim < price:
                    cim = float(input('insert ' + str(price - cim) + ': '))   
                else:
                    print('you got ' + selected.get('item'))
                    selected['stock'] -= 1
                    cim -= price
                    print('cash remaining: ' + str(cim))
                    a = input('buy something else? (y/n): ')
                    if a == 'n':
                        if cim != 0:
                            print(str(cim) + ' refunded')
                            cim = 0
                            print('thank you, have a nice day!\n')
                            break                        
                        else:
                            print('thank you, have a nice day!\n')
                            break                        
                    else:
                        continue



vend()

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вам нужно только добавить логическую переменную, для которой вы установили значение false, если ответ пользователя - n.Также обратите внимание, что в коде была проблема, вы не обновляете значение cim надлежащим образом.Вы должны учитывать, что человеку может потребоваться ввести более одной монеты, поэтому вам нужно накопить общее количество вставленных монет:

def vend():

    a = {'item': 'choc', 'price': 1.5, 'stock': 2}
    b = {'item': 'pop', 'price': 1.75, 'stock': 1}
    c = {'item': 'chips', 'price': 2.0, 'stock': 3}
    d = {'item': 'gum', 'price': 0.50, 'stock': 1}
    e = {'item': 'mints', 'price': 0.75, 'stock': 3}
    items = [a, b, c, d, e]
    cim = 0 # cash in machine

    print('welcome to vending machine! \n***************')

    # show items, prices
    def show(items):
        print('\nitems available \n***************')

        for item in items:      
            if item.get('stock') == 0:
                items.remove(item)
        for item in items:
            print(item.get('item'), item.get('price'))

        print('***************\n')
    continueToBuy = True
    # have user choose item
    while continueToBuy == True:
        show(items)
        selected = input('select item: ')
        for item in items:
            if selected == item.get('item'):
                selected = item               
                price = selected.get('price')
                while cim < price:
                    cim = cim + float(input('insert ' + str(price - cim) + ': '))   

                print('you got ' + selected.get('item'))
                selected['stock'] -= 1
                cim -= price
                print('cash remaining: ' + str(cim))
                a = input('buy something else? (y/n): ')
                if a == 'n':
                    continueToBuy = False

                    if cim != 0:
                        print(str(cim) + ' refunded')
                        cim = 0
                        print('thank you, have a nice day!\n')
                        break                        
                    else:
                        print('thank you, have a nice day!\n')
                        break  
                else:
                    continue



vend()

Кроме того, я думаю, что это хороший пример для введения объектно-ориентированнойпрограммирование.Это позволяет вам иметь более структурированный код и позволить вам сосредоточиться на логике того, что вы хотите разработать.Вот возможная реализация:

class Item:
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock

    def updateStock(self, stock):
        self.stock = stock

    def buyFromStock(self):
        if self.stock == 0:
            # raise not item exception
            pass
        self.stock -= 1

class VendingMachine:
    def __init__(self):
        self.amount = 0
        self.items = []

    def addItem(self, item):
        self.items.append(item)

    def showItems(self):
        print('\nitems available \n***************')

        for item in self.items:      
            if item.stock == 0:
                self.items.remove(item)
        for item in self.items:
            print(item.name, item.price)

        print('***************\n')

    def addCash(self, money):
        self.amount = self.amount + money

    def buyItem(self, item):
        if self.amount < item.price:
            print('You can\'t but this item. Insert more coins.')
        else:
            self.amount -= item.price
            item.buyFromStock()
            print('You got ' +item.name)
            print('Cash remaining: ' + str(self.amount))

    def containsItem(self, wanted):
        ret = False
        for item in self.items:
            if item.name == wanted:
                ret = True
                break
        return ret

    def getItem(self, wanted):
        ret = None
        for item in self.items:
            if item.name == wanted:
                ret = item
                break
        return ret

    def insertAmountForItem(self, item):
        price = item.price
        while self.amount < price:
                self.amount = self.amount + float(input('insert ' + str(price - self.amount) + ': '))

    def checkRefund(self):
        if self.amount > 0:
            print(self.amount + " refunded.")
            self.amount = 0

        print('Thank you, have a nice day!\n')


def vend():

    machine = VendingMachine()
    item1 = Item('choc',  1.5,  2)
    item2 = Item('pop', 1.75,  1)
    item3 = Item('chips',  2.0,  3)
    item4 = Item('gum',  0.50, 1)
    item5 = Item('mints',0.75,  3)
    machine.addItem(item1)
    machine.addItem(item2)
    machine.addItem(item3)
    machine.addItem(item4)
    machine.addItem(item5)

    print('Welcome to the vending machine!\n***************')

    continueToBuy = True
    while continueToBuy == True:
        machine.showItems()
        selected = input('select item: ')
        if machine.containsItem(selected):
            item = machine.getItem(selected)

            machine.insertAmountForItem(item)
            machine.buyItem(item)

            a = input('buy something else? (y/n): ')
            if a == 'n':
                continueToBuy = False
                machine.checkRefund()
            else:
                continue

        else:
            print('Item not available. Select another item.')
            continue

vend()

Для получения дополнительной информации об ООП см. ресурс, подобный этому .

0 голосов
/ 21 октября 2018

1) Я не знаю, как выйти из программы торгового автомата после того, как пользователь ответит 'n' на 'купить что-нибудь еще?(y / n): '.

Оператор break в Python прерывает первый для или , в то время как цикл , которыйзаключает этоВы выходите только из показанного цикла для .Условие в то время как True держит вас в цикле навсегда.

Однако, вы сделали что-то умное, вы включили все функции торгового автомата в свою функцию vend .Если вместо break вы используете оператор return , вы не только выйдете из функции vend , вы достигнете конца всей программы и выйдетевы хотите.

Оператор return также используется для возврата значений из вызовов функций, но вам не нужно делать это в вашем случае.

Кроме того, выне нужно и не должно быть двух отдельных выходов из функции.Удалите эти три строки:

                else:
                    print('thank you, have a nice day!\n')
                    break

Обведите две строки сразу над тремя, которые вы удалили, и замените break на return .

Вы можете сделать и другие улучшения, но это только начало.

...