You've been busy.
For something as advanced as this it would help you to no end to learn more about Python containers; dictionaries, tuples, lists, etc.
You are passing around lists of numbers here and you need to manage them as groups.
I liked this part, the rest I doctored a little.
def sumMoney(self, l):
s = 0
s += l['ones']
s += l['fives'] * 5
s += l['tens'] * 10
s += l['twenties'] * 20
return s
Not bad so far. We're still a ways from running from the command line though.
Keep pluggin'.
There are people out here better qualified than me, and there's probably many different ways to do this stuff, but here's what I've come up with; based on my understanding of what you want to do. You might have to work out a few bugs.
# You dont want function calls in __init__ because the functions haven't been
# initialized yet. Use __init__ to assign values and such
# from the arguments you provide when you create an instance of the class.
class CashRegister(object):
def __init__(self, ones, fives, tens, twenties):
self.drawer = {'ones': ones, 'fives': fives, 'tens': tens, 'twenties': twenties}
self.tender = {'ones': 0, 'fives': 0, 'tens': 0, 'twenties': 0}
self.cash = {'ones': 0, 'fives': 0, 'tens': 0, 'twenties': 0}
## Purchase function
def purchase(self, price, ones, fives, tens, twenties):
self.tender = {'ones': ones, 'fives': fives, 'tens': tens, 'twenties': twenties}
change_required = self.sum_tendered() - price
if change_required == 0:
return "err0" # distinguish error numbers from dollars
if self.sum_tendered() < price:
return "err2"
# if change_required > self.sumMoney(self.drawer):
if change_required > self.sum_drawer():
return "err3"
return change_required
## Helper functions
def formatMoney(self, amount):
self.cash = {'ones': 0, 'fives': 0, 'tens': 0, 'twenties': 0}
if amount >= 20:
self.cash['twenties'] = amount / 20
amount = amount % 20
if amount >= 10:
self.cash['tens'] = amount / 10
amount = amount % 10
if amount >= 5:
self.cash['fives'] = amount / 5
amount = amount % 5
self.cash['ones'] = amount
return self.cash
def sumMoney(self, fmt):
self.cash = fmt
s = 0
s += self.cash['ones']
s += self.cash['fives'] * 5
s += self.cash['tens'] * 10
s += self.cash['twenties'] * 20
return s
def cash_drawer(self):
return self.drawer
def cash_tendered(self):
return self.tender
def sum_drawer(self):
return self.sumMoney(self.drawer)
def sum_tendered(self):
return self.sumMoney(self.tender)
############
# some random testing
############
d1 = {}
reg = CashRegister(20, 20, 10, 10)
change = reg.purchase(38, 0, 0, 0, 2)
d1 = reg.cash_tendered()
tender = reg.sum_tendered()
print 'tendered:$%s = %s, %s, %s, %s' % (tender, d1['ones'], d1['fives'], d1['tens'], d1['twenties'])
d1 = reg.formatMoney(change)
print 'change:$%s = %s, %s, %s, %s' % (change, d1['ones'], d1['fives'], d1['tens'], d1['twenties'])
d1 = reg.cash_drawer()
drawer = reg.sum_drawer()
print 'drawer:$%s = %s, %s, %s, %s' % (drawer, d1['ones'], d1['fives'], d1['tens'], d1['twenties'])
--------- Post updated at 08:18 PM ---------- Previous update was at 01:36 AM ----------
EDIT:
Found some ugly bugs.
Did some renaming because vars were getting clobbered in the Helper functions.
Errors 0, 2, 3 were causing confusion with dollar output.
Added a few helper functions to ease the use of the class in a progamming sense.
Made several other changes and reposted the code.
The above tests now produce decent output.
Code:
tendered:$40 = 0, 0, 0, 2 change:$2 = 2, 0, 0, 0 drawer:$420 = 20, 20, 10, 10