Zadanie typu zamowienie w restauracji

0

Witam, mam takie zadanko do zrobienia: restauracja. Klient zamawia coś z menu, a po wyborze podsumowuje co wybrał i ile płacił...

import sys
menu = {'1':['kurczak',8.20],
        '2':['frytki',7],
        '3':['pizza',30],
        '4':['Flaki',9]
   

}
def pobranie_wyboru():
    wybor = input('Proszę wybrać danie z menu od punktu:  ')
    if wybor in menu.keys():
        return wybor
    else:
        return pobranie_wyboru()

def restauracja(koszt,zamowienie):
    print('Menu \n')
    for nr_pozycji,danie in menu.items():
            print(f' {nr_pozycji} - {danie[0]} - {danie[1]}')#danie[0] 
    print('0 - koniec zamowienia,dziękuję')
    wybor = input('Proszę wybrać danie: ')
    if wybor == '0': sys.exit()
    koszt += menu[wybor][1]# ceny
    zamowienie += menu[wybor][0] + ' '
    print('\n Coś jeszcze \n')


while True:
    restauracja(koszt = '0',zamowienie = '')
  

I mam taki błąd: ```

    koszt += menu[wybor][1]# ceny
TypeError: can only concatenate str (not "float") to str

Próbowałem w tym wierszu dodać "str" ale cały czas mam błedy inne itp.... Więc muszę poprosić Was o podpowiedz :)

0

Jako koszt ustawiasz '0' czyli stringa, następnie próbujesz za pomocą operatora += dodać do tego stringa float co powoduje błąd.

2

Z nudów coś poklikałem :P W klasie order od razu zaimplementowałem przykładowe zabezpieczenie przed niechcianym edytowaniem zamowienia po jego finalizacji. Wbrew pozorom to nie taki trywialny symulator. Jest w nim zdecydowanie więcej zależności.

from types import FunctionType

class Order:
    def __init__(self):
        self._cost = 0
        self._ordered = []
        self._finalized = False

    def __close_if_finalized(method) -> FunctionType | None:
            def wrapper(self, *args, **kwargs):
                if self._finalized == False:
                    method(self, *args, **kwargs)
                else:
                    print("already closed")
            return wrapper


    @property
    def cost(self) -> int | float:
        return self._cost

    @cost.setter
    def cost(self, value) -> None:
        print("You cannot edit cost")

    @property
    def ordered(self) -> list:
        return self._ordered

    @ordered.setter
    def ordered(self, value) -> None:
        print("you cannot edit cart")

    @property
    def finalized(self) -> bool:
        return self._finalized

    @finalized.setter
    def finalized(self, value) -> None:
        print("You cannot finalize this order unless you don;t pay :)))")

    @__close_if_finalized
    def _update_cost(self, price: int | float) -> None:
        self._cost += price

    @__close_if_finalized
    def order_product(self, product_info: dict) -> None:
        product_name = product_info.get("name")
        product_price = product_info.get("price")
        self._ordered.append(product_name)
        self._update_cost(price=product_price)

    @__close_if_finalized
    def finalize_order(self) -> None:
        self._finalized = True

class restaurant:
    def __init__(self, name: str, menu: dict) -> None:
        self.name = name
        self.menu = menu

    def __repr__(self):
        return f"Welcome to {self.name} restaurant!"

    def create_order(self):
        return Order()

if __name__ == "__main__":
    raw = [["kurczak", 8.20], ["frytki", 7], ["pizza", 30], ["flaki", 9]]
    menu = {item[0]: {"name": item[1][0], "price": item[1][1]} for item in enumerate(raw, start=1)}
    kfc = restaurant(name="kfc", menu=menu)
    order = kfc.create_order()
    while not order.finalized:
        product_index = int(input("0 - pay, 1-4 products: "))
        if product_index > 0:
            product = kfc.menu.get(product_index)
            order.order_product(product_info=product)
        else:
            order.finalize_order()
            print(f'You have ordered {order.ordered} and paid {order.cost}')
    order.finalize_order()


>> You have ordered ['frytki', 'pizza', 'flaki', 'kurczak'] and paid 54.2
>> already closed
0

@Seken: Dzięki za wskazówkę :) Kwestia czasu, jak nauczę się "rozumieć" błędy które mam podczas uruchamiania kodu. Więc tak , poprawiłem kod o ten bład co dałeś podpowiedz..

import sys
menu = {'1':['kurczak',8.20],
        '2':['frytki',7],
        '3':['pizza',30],
        '4':['Flaki',9]
   

}


def spis_menu():
    print('Menu \n')
    for nr_pozycji,danie in menu.items():
            print(f' {nr_pozycji} - {danie[0]} - {danie[1]}')
    if wybor == 0: exit()
    print('0 - koniec zamowienia,dziękuję')


def pobranie_wyboru():
    wybor = input('Proszę wybrać danie z menu od punktu:  ')
    if wybor in menu.keys():
        return wybor
    else:
        return pobranie_wyboru()

def restauracja(koszt,zamowienie):

  zamowienie += menu[wybor][0] + ' ' 
    print(f'\n Zamowiono: {zamowienie}')
    print('\n Coś jeszcze \n')
    koszt += menu[wybor][1]# ceny
    print(f'\n Do zaplaty: {koszt} pln')

while True:
    spis_menu()
    wybor = pobranie_wyboru()
    restauracja(koszt = 0,zamowienie = '')
   
    
    
  

  #zamiana miejscami , kod działa bez błędów, ale pokazuje mi najpierw wybor z menu, a potem dopiero całe menu!
# wybor = pobranie_wyboru() 
# restauracja(koszt = 0,zamowienie = '')

  

Ale mam następny błąd:

   koszt += menu[wybor][1]# ceny
NameError: name 'wybor' is not defined

I tu na moje przeciez , 'wybor' został przeze mnie zdefiniowany linikją na końcu kodu: wybor = pobranie_wyboru. Albo czegoś tu jeszcze nie rozumiem, jeśli chodzi o funkcje w pythonie. Po prostu chciałbym zrozumieć gdzie robię błędy i jak to interpretować te błedy ( na przyszłosć). Co ciekawe jak zamienię miejscami linijki kodu (na koncu kodu ) na pierwsze wybor = pobranie_wyboru) a ponizej dam restauracja(...) kod się uruchamia, ale najpierw widać wybor , po kliknięciu na wybór np. 1 jest dopiero pokazane menu. I prawie byłoby dobrze, ale na koncu nie podlicza mi tego jak powinno.. Gdzieś tu robię w tym kodzie błąd podsumowania zamowienia.... Jakieś wskazówki, spostrzezenia do mojego kodu, błedów w kodzie? Mam nadzieję, że się połapiecie w tym wszystkim co napisałem :)

0

Tutaj popełniasz błąd:

def spis_menu():
    print('Menu \n')
    for nr_pozycji,danie in menu.items():
            print(f' {nr_pozycji} - {danie[0]} - {danie[1]}')
    if wybor == 0: exit() # gdzie tworzysz zmienna wybór? 
    print('0 - koniec zamowienia,dziękuję')
0

@Seken: Pobawiłem się kodem, i prawie koniec, ale nie podsumowuje mi ilości zamówien i koszta tego. Wiem, że można rozbudować ten kod o inne funkcje, napisać to inaczej, ale na razie poprzestaje na tym moim kodzie i podstawowym działaniu zamówień i podliczenia tych zamówień w tym kodzie.

import sys
menu = {'1':['kurczak',8.20],
        '2':['frytki',7],
        '3':['pizza',30],
        '4':['Flaki',9]

}


def spis_menu():
    print('Menu \n')
    for nr_pozycji,danie in menu.items():
            print(f' {nr_pozycji} - {danie[0]} - {danie[1]}')
    
    print('0 - koniec zamowienia,dziękuję')

def pobranie_wyboru():
    wybor = input('Proszę wybrać danie z menu od punktu:  ')
    if wybor == 0: sys.exit
    if wybor in menu.keys():
        return wybor
    else:
        return pobranie_wyboru()

def restauracja(koszt ,zamowienie):
    zamowienie += menu[wybor][0] + ' ' 
    koszt += menu[wybor][1]# ceny
    print('\n Coś jeszcze \n')
    print(f'\n Zamowiono: {zamowienie}')
    print(f'\n Do zaplaty: {koszt} pln')
           

while True:
    spis_menu()
    wybor = pobranie_wyboru()
    restauracja(koszt = 0,zamowienie = '')
#print(f'\n Zamowiono: {zamowienie}')
#print(f'\n Do zaplaty: {koszt} pln')

Po wyborze kilku opcji zamówien i wprowadzeniu '0' powinno mi wszystkie zamówienie wydrukować i podsumować ile to kosztuje (ile do zapłąty)

Problem leży chyba w umiejscowieniu tych dwóch linijek kodu: "Kombinowałem na różne sposoby"

print(f'\n Zamowiono: {zamowienie}')
print(f'\n Do zaplaty: {koszt} pln')

Normalnie mam chyba anielską cierpliwość do kodowania :), myślę że idę dobrym tokiem rozumowania. Jakieś pomysły? ,bo mi na razie pomysły na dziś się konczą :)

1

Podstawowe błędy masz tu: if wybor == 0: sys.exit ...

  • wybor nie może się równać 0 bo nie konwertujesz na int, sprawdzaj czy równa się '0'
  • sys.exit to funkcja, żeby ją wywołać używa się nawiasu

Reszty nie skomentuję, ja anielskiej cierpliwości niestety nie mam ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1