slendy343
slendy343

Reputation: 23

The price doesn't add up

creating a pizza ordering program for IT class, almost finished with it but I'm currently stuck with a problem that I can't seem to fix or don't know how to. As the user is finished choosing their pizza it was suppose to add up the total cost of the pizza they have chosen but the problems is they don't add up the instead the price stays the same

 Name:Jack
Telephone:47347842

ORDER:
['2. Hawaiian pizza', 8.5]
['1. Pepperoni pizza', 8.5]
['3. Garlic cheese pizza (with choice of sauce)', 8.5]
Total Price: 8.50

Here's the price list that they have to choose from

['1. Pepperoni pizza', 8.5]
['2. Hawaiian pizza', 8.5]
['3. Garlic cheese pizza (with choice of sauce)', 8.5]
['4. Cheese pizza (with choice of sauce)', 8.5]
['5. Ham and cheese pizza', 8.5]
['6. Beef & onion pizza', 8.5]
['7. Vegetarian pizza', 8.5]
['8. BBQ chicken & bacon aioli pizza', 13.5]
['9. Boneless pizza (italian style anchovy with no bones)', 13.5]
['10. Pizza margherita', 13.5]
['11. Meat-lover’s pizza', 13.5]
['12. Tandoori pizza', 13.5]

I don't know if the problems lies in this code but it seem like it is. I originally I tried using 'cost.append' but it only came up with an error like this

unsupported operand type(s) for +: 'int' and 'str'

def Choice_of_pizza():
    for i in range(1,pizza_no
                   +1): #Repeats a number of times (number user has inputted)
      while True:
        try: #Validating inputs
          pizza_kind = int(input("Choice of pizza(s):"))
          if pizza_kind < 1:
            print("Refer to PIZZA MENU for number order")
            continue
          if pizza_kind > 12:
            print("Refer to PIZZA MENU for number order")
            continue
          else:
            pizza = pizza_kind - 1 #Makes the list start at 1
            cost.append(MENU[pizza_kind-1][0][pizza])
            customerOrder.append(MENU[pizza_kind-1][pizza])            
           
            
            
            global total_cost
            total_cost = sum(cost) #Sum of the pizzas
            global Combined_Total
            if delivery == "D": #Adds $3 dollars to the total cost if delivery
              Combined_Total = total_cost + Delivery_cost
            else: #Price stays the same if pick up 
              Combined_Total = total_cost
            break
        except ValueError:#Validating inputs - accepts only numbers and can't be left blank 
          print("Please use numbers only")
          continue
Choice_of_pizza()

So I went and replace it with 'cost=+customerOrder[i][1]' but even then it somewhat works with the names of the pizza being added but not the prices unto the customer details.

def Choice_of_pizza():
    for i in range(1,pizza_no +1): #Repeats a number of times (number user has inputted)
     
      while True:
        try: #Validating inputs
          pizza_kind = int(input("Choice of pizza(s):"))
          if pizza_kind < 1:
            print("Refer to PIZZA MENU for number order")
            continue
          if pizza_kind > 12:
            print("Refer to PIZZA MENU for number order")
            continue
          else:
            pizza = pizza_kind - 1 #Makes the list start at 1
            print('\nYou have chosen {}\n'.format(MENU[pizza_kind-1][0]))
            customerOrder.append(MENU[pizza_kind-1])
            for i in range(len(customerOrder)):
              cost=+customerOrder[i][1]
              
            global total_cost
            total_cost=0
            #Sum of the pizzas
            global Combined_Total
            if delivery == "D": #Adds $3 dollars to the total cost if delivery
              total_cost=+cost
              Combined_Total = total_cost + Delivery_cost
            else: #Price stays the same if pick up
              total_cost=+cost
              Combined_Total = total_cost
            break
        except ValueError:#Validating inputs - accepts only numbers and can't be left blank 
          print("Please use numbers only")
          continue
Choice_of_pizza(

The intended goal was, as the user input there choice one by one it takes out the name and places the price into the cost list but it doesn't seem to do that.

here's the original full code

#----------------------------important stuff-----------------------------------

#time delay
import time 
#loop system for the details section
running = True #Loop
import re


Delivery_cost = 3.0
cost=[]
customerOrder=[]
customer_name=[]
customer_name_2=[]
customer_telephone_2=[]
house_no=[]
street_name=[]

                       
#------------------------------menu list --------------------------------------
MENU =[
  ['1. Pepperoni pizza', 8.50], ['2. Hawaiian pizza', 8.50], ['3. Garlic cheese pizza (with choice of sauce)', 8.50],['4. Cheese pizza (with choice of sauce)', 8.50], ['5. Ham and cheese pizza', 8.50], ['6. Beef & onion pizza', 8.50], ['7. Vegetarian pizza', 8.50], ['8. BBQ chicken & bacon aioli pizza', 13.50], ['9. Boneless pizza (italian style anchovy with no bones)', 13.50], ['10. Pizza margherita', 13.50],['11. Meat-lover’s pizza', 13.50],['12. Tandoori pizza', 13.50]
]
   



#-----------------------------details------------------------------------

def pick_or_deli():
  global delivery
  delivery = input("P - pick up / D - delivery:")
  delivery = delivery.upper() #Changes the letter inputted to an uppercase 

  if delivery == "D": #statement if person choosed delivery
    while running == True:
      global customer_name #This can be called when printing out final order and details
      customer_name = input("Name:")
      if not re.match("^[a-zA-Z ]*$", customer_name): #Checks whether input is letters only
        print("Please use letters only")
      elif len(customer_name) == 0: #User has not inputted anything, therefore invalid input
        print("Please enter a valid input")
      else:
        customer_name = customer_name.title()
        break #Breaks the loop when valid input has been entered
    while running == True:
      global customer_telephone
      customer_telephone = input("Telephone:")
      if not re.match("^[0-9 ]*$", customer_telephone): #Checks whether input is numbers only
        print("Please use numbers only")
      elif len(customer_telephone) == 0: #User has not inputted anything, therefore invalid input
        print("Please enter a valid input")
      else:
        break #Breaks the loop when valid input has been entered
    while running == True:
      global house_no
      house_no = input("House number:")
      if not re.match("^[0-9 /]*$", house_no): #Checks whether input is numbers only
        print("Please use numbers only")
      elif len(house_no) == 0: #User has not inputted anything, therefore invalid input
        print("Please enter a valid input")
      else:
        break #Breaks the loop when valid input has been entered
    while running == True:
      global street_name
      street_name = input("Street name:")
      if not re.match("^[a-zA-Z ]*$", street_name): #Checks whether input is letters only
        print("Please use letters only")
      elif len(street_name) == 0: #User has not inputted anything, therefore invalid input
        print("Please enter a valid input")
      else:
        street_name = street_name.title()
        break #Breaks the loop when valid input has been entered
  elif delivery == "P": #statement for if person choosed pickup
    while running == True:
      global customer_name_2
      customer_name_2 = input("Name:")
      if not re.match("^[a-zA-Z ]*$", customer_name_2): #Checks whether input is letters only
        print("Please use letters only")
      elif len(customer_name_2) == 0: #User has not inputted anything, therefore invalid input
        print("Please enter a valid input")
      else:
        customer_name_2 = customer_name_2.title()
        break #Breaks the loop when valid input has been entered
    while running == True:
      global customer_telephone_2
      customer_telephone_2 = input("Telephone:")
      if not re.match("^[0-9 ]*$", customer_telephone_2): #Checks whether input is numbers only
        print("Please use numbers only")
      elif len(customer_telephone_2) == 0: #User has not inputted anything, therefore invalid input
        print("Please enter a valid input")
      else:
        break #Breaks the loop when valid input has been entered  
  else:
    print("Please enter P or D")
    pick_or_deli()

pick_or_deli()

#-----------------------------order script-------------------------------------
print('''\nWelcome to ~~~~~ Dream Pizza ~~~~~
To pick an order from the Menu pick the designated number that is next to the product.\n
From 1 for Pepperoni pizza.\n
Or 2 for Hawaiian pizza.\n
and so on.\n
The delivery cost is $3\n
To cancel the order throughout press 0 and it will reset itself.\n
But first decide how many pizza you want.\n''') 

time.sleep(3.0)

#--------------menu text and design can be called again------------------------
def menu_design():
  print(*MENU, sep = "\n")\

menu_design()

#------------------deciding how many pizzas they want---------------------------
def order():
  global pizza_no
  while True:
    try: #Validating the inputs
      pizza_no = int(input('''\nNo. of pizzas you want (min 1 - max 5):\n'''))
      if pizza_no < 1:
        print("Please order between 1 - 5 pizzas") #Checks whether input is between 1 and 5
        continue
      if pizza_no > 12:
        print("Please order between 1 - 5 pizzas")
        continue
      else:
        break #Breaks the loop when valid input has been entered
    except ValueError: #Validating inputs - accepts only numbers and can't be left blank 
      print("Please use numbers only")
      continue
order()

#--------------------------------picking pizza-----------------------------------

def Choice_of_pizza():
    for i in range(1,pizza_no +1): #Repeats a number of times (number user has inputted)
     
      while True:
        try: #Validating inputs
          pizza_kind = int(input("Choice of pizza(s):"))
          if pizza_kind < 1:
            print("Refer to PIZZA MENU for number order")
            continue
          if pizza_kind > 12:
            print("Refer to PIZZA MENU for number order")
            continue
          else:
            pizza = pizza_kind - 1 #Makes the list start at 1
            print('\nYou have chosen {}\n'.format(MENU[pizza_kind-1][0]))
            customerOrder.append(MENU[pizza_kind-1])
            for i in range(len(customerOrder)):
              cost=+customerOrder[i][1]
              
            global total_cost
            total_cost=0
            #Sum of the pizzas
            global Combined_Total
            if delivery == "D": #Adds $3 dollars to the total cost if delivery
              total_cost=+cost
              Combined_Total = total_cost + Delivery_cost
            else: #Price stays the same if pick up
              total_cost=+cost
              Combined_Total = total_cost
            break
        except ValueError:#Validating inputs - accepts only numbers and can't be left blank 
          print("Please use numbers only")
          continue
Choice_of_pizza()          
                     
          
#-----------------------------------reciept---------------------------------------

def customerDetails(): #Prints customer order and details
  if delivery == "D": #if person choosed delivery
    print ("")
    print ("CUSTOMER and ORDER DETAILS")
    print ("")
    print ('Name: {}' .format(customer_name))
    print ('Telephone: {}' .format(customer_telephone))
    print ('Address:')
    print (house_no, street_name)
    print ("")
    print ('ORDER:')
    print(*customerOrder, sep = "\n")
    print ('Total Price: $ {:.2f}' .format(total_cost))
    print ('Total Price + Delivery Cost: $ {:.2f}' .format(Combined_Total))
  else: #if person choosed pickup don't have to speccify
    print ("")
    print ("CUSTOMER and ORDER DETAILS")
    print ("")
    print ('Name:{}' .format(customer_name_2))
    print ('Telephone:{}' .format(customer_telephone_2))
    print ("")
    print ('ORDER:')
    print(*customerOrder, sep = "\n")
    print ('Total Price: {:.2f}' .format( total_cost))
customerDetails()

#-----------confrimation of customers order proceed or cancel---------------------
print ("")
def confirm(): #Confirms details of customer and order
  confirmation = input("Y - confirm order / N - cancel order:")
  confirmation = confirmation.upper() #Changes the letter inputted to an uppercase 
  
  if confirmation == "Y": #if Y is entered, order is confirmed
    print("DETAILS CONFIRMED")
  elif confirmation == "N": #if N is entered, order is cancelled
    print("DETAILS CANCELLED - order has been reset")
    customerOrder[:] = []
    cost[:] = []
    menu_design()
    order()
    Choice_of_pizza()
    customerDetails()
    confirm()
  else:
    print("Please enter Y or N") #If anything other than Y or N is entered, it will ask again
    confirm()
    
confirm()
#----statement im customer would like to order more or finalised there order---

print ("")
def order_more(): #Placing another order
  order_more = input("Z - order more / x - exit program:")
  order_more = order_more.upper() #Changes the letter inputted to an uppercase 
  '''cost[:] = []'''
  if order_more == "Z":
    menu_design() #Calls the functions - will run the code that the def defines
    order()
    Choice_of_pizza()
    customerDetails()
    confirm()
    print ("")
    print ("THANK YOU FOR YOUR SHOPPING AT DREAMS PIZZA")
    if delivery == "D":
      print ("Your order will be delivered in 25mins") #Ending statement 
    elif delivery == "P":
      print ("Your order will be ready to pick up in 20mins") #Ending statement 
  elif order_more == "X":
    print ("")
    print ("THANK YOU FOR YOUR ORDER")
    if delivery == "D":
      print ("Your order will be delivered in 25mins") #Ending statement
    elif delivery == "P":
      print ("Your order will be ready to pick up in 20mins") #Ending statement
  else:
    print ("Please enter X or Z") #If anything other than X or Z is entered, it will ask again
    order_more()
    
order_more()

Also why I only have one list? it is because I was required to only use one

Upvotes: 1

Views: 83

Answers (1)

DarrylG
DarrylG

Reputation: 17166

Code Issues:

  1. For addition assignment the syntax is:

    x += y # this assigns x to (x + y)

Not:

x = +y  # this assign x to y
  1. Glbols are not causing a problem in your code, but are usually frowned upon and negatively reflect on programming skills i.e. Why are Global Variables Evil?.

Choice_of_pizza function fix

def Choice_of_pizza():
    for i in range(1,pizza_no +1): #Repeats a number of times (number user has inputted)
     
      while True:
        try: #Validating inputs
          pizza_kind = int(input("Choice of pizza(s):"))
          if pizza_kind < 1:
            print("Refer to PIZZA MENU for number order")
            continue
          if pizza_kind > 12:
            print("Refer to PIZZA MENU for number order")
            continue
          else:
            pizza = pizza_kind - 1 #Makes the list start at 1
            print('\nYou have chosen {}\n'.format(MENU[pizza_kind-1][0]))
            customerOrder.append(MENU[pizza_kind-1])
            cost = 0
            for i in range(len(customerOrder)):
              cost += customerOrder[i][1]
                     
            global total_cost  # globals are discouraged
            total_cost=0
            #Sum of the pizzas
            global Combined_Total # globals are discouraged
            if delivery == "D": #Adds $3 dollars to the total cost if delivery
              total_cost += cost
              Combined_Total = total_cost + Delivery_cost
            else: #Price stays the same if pick up
              total_cost += cost
              Combined_Total = total_cost
            break
        except ValueError:#Validating inputs - accepts only numbers and can't be left blank 
          print("Please use numbers only")
          continue

Upvotes: 1

Related Questions