Ryan V wrote:
For this source code, i am getting some errors, and not sure how to fix it,
as i am returning all the values. it is telling me that there is no value
for the variables i am returning.  any help is greatly appreciated!
Source
#main function
def main():
    print 'The menu is:'
    print 'Yum Yum Burger for $0.99'
    print 'Grease Yum Fries for $0.79'
    print 'Soda Yum For $1.09'
    mealOrder = input_meal()
    burgerPrice = input_burger()
    friesPrice = input_fries()
    sodaPrice = input_soda()
    mealEnd = input_mealEnd()
    calc_total(burgerPrice, friesPrice, sodaPrice)
#    print_info(total)

def input_meal():
    print 'If you want the Yum Yum Burger please press 1'
    print 'If you want the Grease Yum Fries please press 2'
    print 'If you want the Soda Yum please press 3'
    print 'If you entered no instead of yes just hit 4'
    mealOrder = input('Enter Now - ')
    if mealOrder == '1' :
        input_burger()
    elif mealOrder == '2' :
        input_fries()
    elif mealOrder == '3' :
        input_soda()
    elif mealOrder == '4' :
        calc_total(burgerPrice, friesPrice, sodaPrice)

def input_burger():
    amountBurger = input('How many burgers would you like?')
    burgerPrice = amountBurger * 0.99
    input_mealEnd()
    return burgerPrice

def input_fries():
    amountFries = input('How many Fries would you like?')
    friesPrice = amountFries * 0.79
    input_mealEnd()
    return friesPrice

def input_soda():
    amountSoda = input('How many sodas would you like?')
    sodaPrice = amountSoda * 1.09
    input_mealEnd()
    return sodaPrice

def input_mealEnd():
    mealEnd = raw_input('Would you like to end your order? (Enter yes or
no)')
    if mealEnd == 'yes' :
        calc_total(burgerPrice, friesPrice, sodaPrice)
    elif mealEnd == 'no' :
        input_meal()

#Calculation of meal cost
def calc_total(burgerPrice, friesPrice, sodaPrice):
    totalFood = burgerPrice + friesPrice + sodaPrice
    totalTax = totalFood * .06
    total = totalTax + totalFood
    print 'The total price for food is $', totalFood
    print 'The Tax is $', totalTax
    print 'The total is $', total
#Displays total, and what you ordered
#def print_info(total):
#    print 'The meal price is $', total

#call main function
main()
 and here is the output i am getting

The menu is:
Yum Yum Burger for $0.99
Grease Yum Fries for $0.79
Soda Yum For $1.09
If you want the Yum Yum Burger please press 1
If you want the Grease Yum Fries please press 2
If you want the Soda Yum please press 3
If you entered no instead of yes just hit 4
Enter Now - 1
How many burgers would you like?2
Would you like to end your order? (Enter yes or no)no
If you want the Yum Yum Burger please press 1
If you want the Grease Yum Fries please press 2
If you want the Soda Yum please press 3
If you entered no instead of yes just hit 4
Enter Now - 2
How many Fries would you like?2
Would you like to end your order? (Enter yes or no)no
If you want the Yum Yum Burger please press 1
If you want the Grease Yum Fries please press 2
If you want the Soda Yum please press 3
If you entered no instead of yes just hit 4
Enter Now - 3
How many sodas would you like?2
Would you like to end your order? (Enter yes or no)yes
*Traceback (most recent call last):
  File "...", line 74, in <module>
    main()
  File "...", line 16, in main
    sodaPrice = input_soda()
  File "...", line 51, in input_soda
    input_mealEnd()
  File "...", line 57, in input_mealEnd
    calc_total(burgerPrice, friesPrice, sodaPrice)
NameError: global name 'burgerPrice' is not defined*

Please tell us - is this your first programming language, or are you comfortable with another, and you need to see how Python differs from it? I suspect it's your first.

The main problem is that you're trying to use a function meal_end() to do flow control that needs to be in main(). Each time the user says "no" to "Would you like to end your order" you don't loop back to the same place, you call a new copy of input_meal(). (That's called recursion, and it's very useful, but not here). But you never return to the first copy of input_meal(). So you end up with several copies of that function. And only when all of them return (which won't happen) would you get back to main(). You need a loop (while or for), not recursion.

Second problem is that you're calling functions that return values, and only some of the time recording those actual values anywhere. When/if input_meal() calls input_burger(), it doesn't save the result anywhere. So if it did return, main() still couldn't get the value, it's already lost.

Third problem is that you have function input_mealEnd() that defines only one variable, but then expect three others to somehow have useful values.

Fourth is that you don't have a good way to terminate the program. Where do you expect to go after printing the current order? You might expect to start a new order, or something else, but that would require that you be back at main(), or returning from main().

The best answer to the loop problem is to make a loop either in main() or in input_meal(). Currently it's not clear which one you had intended to be the loop, since they both expect to ask for all the items. Since input_meal() never returns, main() never gets its chance to ask, nor to save the results. But basically, you have to consolidate these two functions, and make most of the function a while-loop.

The best answer to the problem of the local variables is to define a class. In fact, all these functions should probably be methods of that class. Then you'd have an instance of the class for each customer, and member data (attributes) for each of the things she can order. But I expect that classes are a later lesson in your course. So you probably need to arrange that all data is propagated back to your primary loop, so it's all visible at the same time.

So, to fix the problems:

truncate main() after the call to input_meal(). let input_meal() do all the work for this customer, and maybe main() will someday ask for next customer or something like that.

input_meal() needs to be a while loop You need to start by initializing the three variables burgerPrice, friesPrice, and sodaPrice to 0, so they'll always have some value. Initlialize meal_order to 0 as well, and loop while it's not equal to 4.

Now, when input_meal calls each of those functions, you have two choices, based on the answer to the following question. What do you want to happen if the customer chooses "burgers" twice, and enters two different amounts? Does he get both orders, or does the second value replace the first? That will determine what you do with the return value of input_burger(), for example.

Now, when the while loop finishes, you can print the totals and return to main(). You're done with that customer.


DaveA

_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to