[Tutor] Refining Code

bob gailer bgailer at gmail.com
Sat Apr 12 03:13:02 CEST 2014


On 4/10/2014 6:26 PM, Saba Usmani wrote:
>
>  My task is :
Welcome to the tutor list. In what school are you learning Python?

What version of Python? What operating system? What do you use to write 
and run your code?

What Python elements have you studied so far? Your code can be greatly 
simplified by the application of tuples, lists, dictionaries, functions 
and/or classes.

Requests: post in plain text rather than html (no formatting). This 
guarantees that all of us will be able to read your posts with ease.

Also reply in such a way that a copy goes to tutor at python.org, to keep 
all of us in the loop.

The rest of my comments follow the relevant part of your post. Please 
also reply in similar fashion. Avoid as much as possible "top posting".
>
> A food vending machine accepts 10p, 20p, 50p and £1 coins. One or more 
> coins are inserted and the current credit is calculated and displayed. 
> A product is selected from those available. The system checks to see 
> if there is enough credit to purchase the product chosen. If there is 
> not enough credit the system displays an error message. If there is 
> enough credit it dispenses the product, updates the credit available 
> and displays the remaining credit. Further selections can be made if 
> there is enough credit. The vending machine simulation should have 
> five products and prices. Design, code, test and evaluate a program 
> for this simulation.
I am glad to see this problem appear again. Recently it was sent to me 
privately by someone who claimed it was not homework!

Critique of the specification: it is a bit vague (imprecise). I assume 
the instructor has a broad tolerance for what is delivered. In a 
business environment I'd want it a lot more precise. Often I have to 
help the user accomplish this, as many users don't know how to do this.

it is a good idea to first develop a sample dialog from the 
specification, review that with the user, then code to reproduce that 
sample. Do this. Either review it with the instructor or forget that step.
>
> I have designed the following code, but would like to know how to make 
> it more efficient without making it too complex as I am a beginner or 
> is this fine?
Efficient? Do you mean execution time? With today's processor speeds 
that is rarely an issue to be concerned about when first writing code.

Complexity does not necessarily create efficiency.
> Also, how do I add a loop to this so that once one product has been 
> dispensed the program asks the user if they would like to continue and 
> purchase another product?
Alan has given a suggestion already.

Based on your code you already know how to use a while loop. What is 
mysterious about using it here?
>
>
> Code:
>
> print "Welcome to Snack Attack"
>
> snack1 = 0.40
> snack2 = 0.75
> snack3 = 1.20
> snack4 = 0.99
> snack5 = 0.50
> insert = 0
You never use this variable!
>
> change = 0
This machine does not dispense change!
> currentCredit = 0.00
> A = 0.10
> B = 0.20
> C = 0.50
> D = 1.00
> a = 0.10
> b = 0.20
> c = 0.50
> d = 1.00
Never Never use floating values for money, as floating point cannot in 
general represent fractional values exactly.
>
> print "Menu"
> print "Snack 1: Snickers - £0.40"
> print "Snack 2: Doritos - £0.75 "
> print "Snack 3: J20 - £1.20"
> print "Snack 4: Oreos - £0.99"
> print "Snack 5: M&M's - £0.50"
> print "Exit?"                - how do I make this a Boolean 
> expression, so the user can respond with either yes or no?
>
You don't. Better (as Alan suggested) use raw_input and treat users 
entries as character. There is no advantage to using input and integers 
and a lot of room for errors.

> choice = input("Select your snack: ")
This does not agree with the specification - enter coin(s) first. The 
ensuing dialog also does not agree with the specification. You deposit 
one or more coins first, see the available credit. then choose a
>
> if choice==1:
>   print " "
>   print "You have selected Snickers, which cost £0.40"
>   print "Please insert £0.40"
>   while currentCredit < snack1:
>       print "Please select which of these coins to insert; 
> A:10p,B:20p,C:50p and D:£1"
>       insert_coins = input("Insert coins: ")
>       currentCredit = insert_coins + currentCredit
Major problem here. As A user I'd enter (say) 20p. How does that get 
translated to a numeric value for adding?
What should happen if I enter 30p, or 20x, or foo?
>       print "Your current credit is £",currentCredit
This assumes that credit less than £1 will be reported as a fraction of 
a £. How will you handle this fraction?
>   else:
>       change_given=currentCredit-snack1
>       print " "
>       print "Your change is £",change_given
>       print "Your Snickers have been dispensed...Enjoy!"
>
> elif choice==2:
>      print "You have selected Doritos, which cost £0.75"
>      print "Please insert £0.75"
>      while currentCredit<snack2:
>       print "Please select which of these coins to insert; 
> A:10p,B:20p,C:50p and D:£1"
>       insert_coins = input("Enter coins: ")
>       currentCredit = insert_coins + currentCredit
>       print "Your current credit is £",currentCredit
>      else:
>       change_given=currentCredit-snack2
>       print " "
>       print "Your change is £",change_given
>       print "Your Doritos have been dispensed...Enjoy!"
>
> elif choice==3:
>      print "You have selected J20, which costs £1.20"
>      print "Please insert £1.20"
>      while currentCredit<snack3:
>       print "Please select which of these coins to insert; 
> A:10p,B:20p,C:50p and D:£1"
>       insert_coins = input("Enter coins: ")
>       currentCredit = insert_coins + currentCredit
>       print "Your current credit is £",currentCredit
>      else:
>       change_given=currentCredit-snack3
>       print " "
>       print "Your change is £",change_given
>       print "Your J2O has been dispensed...Enjoy!"
>
> elif choice==4:
>      print "You have selcetd Oreos, which cost £0.99"
>      print "Please insert £0.99"
>      while currentCredit<snack4:
>       print "Please select which of these coins to insert; 
> A:10p,B:20p,C:50p and D:£1"
>       insert_coins = input("Enter coins: ")
>       currentCredit = insert_coins + currentCredit
>       print "Your current credit is £",currentCredit
>      else:
>       change_given=currentCredit-snack4
>       print " "
>       print "Your change is £",change_given
>       print "Your Oreos have been dispensed...Enjoy!"
>
> elif choice==5:
>      print "You have selected M&M's, which cost £0.50"
>      print "Please insert £0.50"
>      while currentCredit<snack5:
>       print "Please select which of these coins to insert; 
> A:10p,B:20p,C:50p and D:£1"
>       insert_coins = input("Enter coins: ")
>       currentCredit = insert_coins + currentCredit
>       print "Your current credit is £",currentCredit
>      else:
>       change_given=currentCredit-snack5
>       print " "
>       print "Your change is £",change_given
>       print "Your M&M's have been dispensed...Enjoy!"
>
> elif choice=="Exit":
>     print "Thank You and Have a Nice Day"
> else:
>     print " "
>     print "Invalid choice"
>
Otherwise it is an OK program, for a beginner.

You should carefully develop a sample dialog, by taking the 
specification item by item, translating each piece into a bit of dialog, 
then write code from that. It will be quite different.

If you have studied lists or tuples, consider putting all the data for 
one product in a list, and create another list of these lists. By doing 
this you enter the data once, and refer to it more than once.


More information about the Tutor mailing list