hilfe hausaufgabe python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
SuperDAU²
User
Beiträge: 20
Registriert: Sonntag 24. Mai 2009, 12:47

Warum "f = reduce"? Was heißt "lambda"? Was berechnst du in der ersten Klammer? womit ist a, b und c definiert?

Code: Alles auswählen

x=f(lambda(a,b),c:([(b>=c,c)]+a,b-(b>=c)*c)
Was soll print ausgeben? Und wie setzt du das um?

Ich glaube, dass ich gerade gehörig auf dem Schlauch stehe.

PS: Die for-Schleife habe ich nun verstanden

Code: Alles auswählen

#!/usr/bin/env python
# Bankautomat

scheine = [5, 10, 20, 50, 100, 200, 500]
u = 0
multi = '*'
trenn = ', '
trenn2 = ''
auszahlung = []
betrag = int(raw_input('Wieviel soll ausgezahlt werden? '))

for schein in scheine:
    if betrag >= scheine:
        auszahlung.append(str(scheine))
        betrag = betrag - scheine
print auszahlung
scheine.reverse()

while betrag > 0:
    while betrag >= scheine[u]:
        auszahlung.append(str(scheine[u]))
        betrag = betrag - scheine[u]
    u = u + 1

auszahlungsliste = [str(auszahlung.count('500')), multi, str(scheine[0]), trenn,
str(auszahlung.count('200')), multi, str(scheine[1]), trenn,
str(auszahlung.count('100')), multi, str(scheine[2]), trenn,
str(auszahlung.count('50')), multi, str(scheine[3]), trenn,
str(auszahlung.count('20')), multi, str(scheine[4]), trenn,
str(auszahlung.count('10')), multi, str(scheine[5]), trenn,
str(auszahlung.count('5')), multi, str(scheine[6])]

print 'Ihre Auszahlung:', trenn2.join(auszahlungsliste)
Allerdings habe ich, wenn ich in der Mitte mir "print auszahlung" anzeigen lasse, kein einziges Listenelement. Demnach funktioniert irgendetwas mit der for-Schleife und somit auch die Hausfrauenmischung nicht.

Code: Alles auswählen

Wieviel soll ausgezahlt werden? 675
[]
Ihre Auszahlung: 1*500, 0*200, 1*100, 1*50, 1*20, 0*10, 1*5
Deswegen habe ich weiter daran gebastelt.

Code: Alles auswählen

#!/usr/bin/env python
# Bankautomat

scheine = [5, 10, 20, 50, 100, 200, 500]
u = 0
multi = '*'
trenn = ', '
trenn2 = ''
auszahlung = []
betrag = int(raw_input('Wieviel soll ausgezahlt werden? '))

for schein in scheine:
    if betrag >= scheine:
        print schein
        print scheine
        auszahlung.append(str(scheine))
        betrag = betrag - scheine
    scheine.reverse()
    while betrag > 0:
        while betrag >= scheine:
            auszahlung.append(str(scheine)
            betrag = betrag - scheine

auszahlungsliste = [str(auszahlung.count('500')), multi, str(scheine[0]), trenn,
str(auszahlung.count('200')), multi, str(scheine[1]), trenn,
str(auszahlung.count('100')), multi, str(scheine[2]), trenn,
str(auszahlung.count('50')), multi, str(scheine[3]), trenn,
str(auszahlung.count('20')), multi, str(scheine[4]), trenn,
str(auszahlung.count('10')), multi, str(scheine[5]), trenn,
str(auszahlung.count('5')), multi, str(scheine[6])]

print 'Ihre Auszahlung:', trenn2.join(auszahlungsliste)
Ich bekomme allerdings folgenden Fehlercode(Kann aber keinen Fehler in Zeile 22 entdecken):

Code: Alles auswählen

python Python/bankautomat3.py
  File "Python/bankautomat3.py", line 22
    betrag = betrag - scheine
         ^
SyntaxError: invalid syntax
Die Auszahlungsliste werde ich auch noch überarbeiten.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@SuperDAU²:

Du bist ja lustig. Der Hinweis, dass die `int()`-Umwandlungen sinnfrei sind, da sie schon in der Liste als Integer eingetragen sind, meinte mitnichten, dass du überall ein `str()` vorsetzen sollst. Warum machst du dir das Leben so kompliziert? Ich habe doch gesagt, dass man die Umwandlungen, die für `join()` nötig sind, am Ende mappen kann:

Code: Alles auswählen

In [21]: lst = [1,2,3]

In [22]: lst
Out[22]: [1, 2, 3]

In [23]: map(str, lst)
Out[23]: ['1', '2', '3']
SuperDAU² hat geschrieben:Ich bekomme allerdings folgenden Fehlercode(Kann aber keinen Fehler in Zeile 22 entdecken):

Code: Alles auswählen

python Python/bankautomat3.py
  File "Python/bankautomat3.py", line 22
    betrag = betrag - scheine
         ^
SyntaxError: invalid syntax
In solchen Fällen hilft es oft, eine Zeile höher zu schauen und dann entdeckt man auch den Fehler: In Zeile 21 fehlt am Ende eine schließende Klammer. :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Argh. Danke, war wohl gestern schon spät.

Code: Alles auswählen

", ".join(reduce(lambda(a,c),b:(a%b,c+["%d*%d"%(a/b,b)]),[500,200,100,50,20,10,5],(input(),[]))[1])
Wir haben aber beide noch Probleme mit beliebigen Scheinen. Angenommn wir haben die Beträge 7 und 5 und möchten 10 Euro abheben, dann werden wir nur 7 bekommen. Vielleicht sollten wir also die Vorraussetzung beibehalten, dass jeder Schein durch eine Kombination der kleineren Scheine konstruiert werden kann (wirklich ausreichende Bedingung?).

Edit: Nimmt man die oben genannte Voraussetzung an, so lässt sich über die Teilbarkeit der auszahlbaren Beträge durch den kleinsten Geldschein leicht zeigen, dass immer eine vollständige Auszahlung erfolgen kann. Interessant wäre nun noch, ob Systeme existieren welche die oben genannte Bedingung nicht erfüllen und trotzdem immer vollständig auszahlen (natürlich falls möglich).

Edit: das Beispiel mal richtig gemacht.
Zuletzt geändert von EyDu am Mittwoch 27. Mai 2009, 14:41, insgesamt 2-mal geändert.
Das Leben ist wie ein Tennisball.
SuperDAU²
User
Beiträge: 20
Registriert: Sonntag 24. Mai 2009, 12:47

Also so in der Art:

Code: Alles auswählen

auszahlungsliste = [auszahlung.count('500'), scheine[0],
auszahlung.count('200'), scheine[1], auszahlung.count('100'), scheine[2],
auszahlung.count('50'), scheine[3], auszahlung.count('20'), scheine[4],
auszahlung.count('10'), scheine[5], auszahlung.count('5'), scheine[6]]

print 'Ihre Auszahlung:', map(str, auszahlungsliste)
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Wenn beim `append()` in Zeile 16 ebenfalls keine Strings angehängt werden, kannst du auch `count()` normale Zahlen übergeben. Wie kamst du eigentlich auf die Idee? Denkst du, Listen dürfen nur Strings enthalten? Listenelemente können alle möglichen Objekte sein, z.B. auch Klasseninstanzen oder weitere Listen. Es gibt da keine Limitierungen.

Und ansonsten:

Code: Alles auswählen

[(auszahlung.count(schein), schein) for schein in scheine]
Geht natürlich nur, wenn man keine Strings anhängt. ;)
SuperDAU²
User
Beiträge: 20
Registriert: Sonntag 24. Mai 2009, 12:47

Wie gesagt, ich programmiere erst seit einer Woche.
Aber dank euch lerne ich (hoffentlich) schnell dazu :D
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

EyDu hat geschrieben:War doch klar, dass Werte von Geldscheinen auf den ersten binären Nachkommastellen von PI beruhen:

Code: Alles auswählen

>>> reduce(lambda a,b: a+[(a[-1]*(4+b))/2], tuple((int(math.pi*2**8)>>i)&1 for i in range(7, 1, -1)), [5])
[5, 10, 20, 50, 100, 200, 500]

:shock:
http://www.kinderpornos.info
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@SuperDAU²: so ganz hast du die for-Schleife wohl doch noch nicht verstanden. Das "scheine" sollte im ganzen Schleifenkörper zu "schein" werden, da du genau einen Schein meinst und nicht die ganze Liste.

Auch solltest du die Reihenfolge der Scheine noch umdrehen, sonst bekommt man alles in 5ern ausgezahlt.

Wenn du snafus Zusammensetzen der "auszahlungsliste" noch nicht versehst, dann versuche die Liste mal mit einer for-Schleife zu erzeugen.

@Dill: Also ich fand den Zusammenhang nun mehr als offensichtlich. Irgendwo kann man sicher noch e auftreiben :twisted:
Das Leben ist wie ein Tennisball.
SuperDAU²
User
Beiträge: 20
Registriert: Sonntag 24. Mai 2009, 12:47

Code: Alles auswählen

#!/usr/bin/env python
# Bankautomat

scheine = [5, 10, 20, 50, 100, 200, 500]
auszahlung = []
betrag = int(raw_input('Wieviel soll ausgezahlt werden? '))

for schein in scheine:
    if betrag >= schein:
        auszahlung.append(schein)
        betrag = betrag - schein
scheine.reverse()
for schein in scheine:
    while betrag > 0:
        while betrag >= schein:
            auszahlung.append(schein)
            betrag = betrag - schein

auszahlungsliste = [(auszahlung.count(schein), schein) for schein in scheine]

print 'Ihre Auszahlung:', map(str, auszahlungsliste)
In Zeile 15 scheint schon wieder eine endlos-Schleife zu sein :?
Außerdem gibt SciTe bei mir seit geraumer Zeit folgende Ausgabe beim Testen:

Code: Alles auswählen

>python -u "bankautomat5.py"
Wieviel soll ausgezahlt werdenTraceback (most recent call last):
  File "bankautomat5.py", line 6, in <module>
    betrag = input('Wieviel soll ausgezahlt werden')
IOError: [Errno 9] Bad file descriptor
>Exit code: 1
Das sagt mir, dass das doch nicht optimal gelöst ist. Aber wie kann man das umgehen? Bis jetzt habe ich noch keine Lösung gefunden.

@EyDu:
Danke, habe die for-Schleife entsprechend verändert. Warum muss ich die Liste aber 2-mal drehen?

snafus Variante habe ich so verstanden: mit jedem Objekt in der Liste wird der Befehl "Liste.count(Objekt), Objekt" durchgeführt. Also genau dass was ich will.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mit dem nochmaligen Umdrehen der Liste habe ich mich vertan. Habe die reverse-Zeile übersehen.

Endlosschleife: die hat einen ganz einfachen Grund: wenn noch Geld zu zahlen ist, aber der aktuelle Schein zu groß ist ist betrag>0, aber du betrittst niemals die innere while-Schleife. Du "verarbeitest" also kein Geld, der Betrag bleibt immer der selbe.
Das Leben ist wie ein Tennisball.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

SuperDAU² hat geschrieben:Wie gesagt, ich programmiere erst seit einer Woche.
Das hast du doch gestern schon gepostet; dann müssten es heute ja zumindest mal 8 Tage sein ... :D
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Warum die while-Schleife so nicht funktioniert kann ich ehrlich gesagt nicht beantworten. Bei meiner Lösung bin ich den Weg gegangen, über die Anzahl der Scheine zu iterieren. Quasi:

Code: Alles auswählen

for durchgang in xrange(anzahl_scheine):
Die Anzahl der Scheine bekommt man, wenn man den aktuellen Betrag durch den Scheinwert teilt. Da Python bei Integern sozusagen den Rest abschneidert, kann man dies ausnutzen: Wenn noch 90€ da sind und man beim Hundert-Euro-Schein ist, wird folglich 0 herauskommen und du kannst zum nächsttieferen Schein übergehen. Mit `xrange()` erzeugt man ein iterierfähiges Objekt und gibt in Klammern die Anzahl der Durchläufe an - hier also Zahl der Scheine. `xrange(0)` geht auch. Du musst also keine gesonderte Abfrage der ermittelten Scheinzahl machen, sondern übergibst in dem Fall eben 0 Durchläufe. Hoffe, du bist einigermaßen mitgekommen. ;)
SuperDAU²
User
Beiträge: 20
Registriert: Sonntag 24. Mai 2009, 12:47

Nochmals Danke, sieht langsam echt gut aus:

Code: Alles auswählen

#!/usr/bin/env python
# Bankautomat
scheine = [5, 10, 20, 50, 100, 200, 500]
auszahlung = []
betrag = int(raw_input('Wieviel soll ausgezahlt werden? '))
for schein in scheine:
    if betrag >= schein:
        auszahlung.append(schein)
        betrag = betrag - schein
scheine.reverse()
for schein in scheine:
    while betrag > 0 & betrag >= schein:
         auszahlung.append(schein)
         betrag = betrag - schein
auszahlungsliste = [(auszahlung.count(schein), schein) for schein in scheine]
print 'Ihre Auszahlung:', map(str, auszahlungsliste)
Ich muss allerdings "auszahlungsliste" schöner ausgeben. Werde ich wohl etwas rumprobieren müssen :D

@numerix:
Ehrlich gesagt, erst seit 6 Tagen. Ich habe 5 Tage / 7 Tage auf 1 aufgerundet.
OverNord
User
Beiträge: 72
Registriert: Donnerstag 24. Januar 2008, 11:59
Kontaktdaten:

Wie wäre es mit dieser Lösung http://paste.pocoo.org/show/119001/
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@SuperDAU²: Das & ist bitweises UND, du solltest es besser durch das logische "and" ersetzen.

Jetzt solltest du noch versuchen die while-Schleife ganz zu sparen. Dazu kannst du die ganzzahlige Division, den Modulo-Operator (%) oder gleich die divmod-Funktion nutzen.
Das Leben ist wie ein Tennisball.
SuperDAU²
User
Beiträge: 20
Registriert: Sonntag 24. Mai 2009, 12:47

@OverNord:
Ja, geht ist aber ohne Hausfrauenmischung :wink:

@EyDu:
Meinst du so

Code: Alles auswählen

#!/usr/bin/env python
# Bankautomat
scheine = [5, 10, 20, 50, 100, 200, 500]
auszahlung = []
betrag = int(raw_input('Wieviel soll ausgezahlt werden? '))
for schein in scheine:
    if betrag >= schein:
        auszahlung.append(schein)
        betrag = betrag - schein
scheine.reverse()
for schein in scheine:
    if betrag > 0 and betrag >= schein:
        n = betrag // schein
        n * auszahlung.append(schein)
        betrag = betrag - n * schein
auszahlungsliste = [(auszahlung.count(schein), schein) for schein in scheine]
print 'Ihre Auszahlung:', map(str, auszahlungsliste)
So geht das leider nicht. Wie könnte ich die Zeilen 13-15 abändern?
Ich werde daraus einfach nicht schlau.
BlackJack

@SuperDAU²: ``f=reduce;`` weil damit das Programm weniger Zeichen braucht. Die `reduce()`-Funktion verwende ich zweimal, das wären also 12 Zeichen. Das Binden an `f` zuzüglich dem Semikolon sind 9 Zeichen und jeweils 1 Zeichen für jeden der beiden Aufrufe macht 11 Zeichen. Damit habe ich also ein ganzes Zeichen eingespart. :-)

Mal an einem sinnfreien Beispiel demonstriert:

Code: Alles auswählen

In [1]: def abcdef():
   ...:     return 42
   ...:

In [2]: abcdef()+abcdef()
Out[2]: 84

In [3]: f=abcdef;f()+f()
Out[3]: 84
Was ich in der ersten Klammer berechne, ist der erste Schritt von der Haushaltsmischung. Den Ausruck hast Du nicht korrekt zitiert, da fehlt auf beiden Seiten etwas. Das Ergebnis von dem Funktionsaufruf wird nicht `x` zugewiesen, sondern ``r,x``. Die Funtkion gibt ein Tupel mit zwei Werten zurück, wovon der erste Wert an `r` und der zweite an `x` gebunden wird.

Beispiel für so eine Funktion ist `divmod()`, die eine ganzzahlige Division durchführt und sowohl das Ergebnis des Teilens, als auch den Rest zurück gibt. Also 10 durch 3 ist zum Beispiel 3 mit dem Rest 1:

Code: Alles auswählen

In [4]: divmod(10, 3)
Out[4]: (3, 1)

In [5]: a, b = divmod(10, 3)

In [6]: a
Out[6]: 3

In [7]: b
Out[7]: 1
Auf der rechten Seite hast Du die beiden anderen Argumente von `reduce()` bzw. `f()` unterschlagen. Die meisten Editoren unterstützen das Hervorheben von zusammengehörigen Klammerpaaren. Wenn man da den Cursor auf die Klammer nach dem ``f`` setzt, wird die dazugehörende schliessende Klammer (meist farbig) hervorgehoben. Dann siehst Du, dass der komplette Aufruf so aussieht:

Code: Alles auswählen

r,x=f(lambda(a,b),c:([(b>=c,c)]+a,b-(b>=c)*c),[5,10,20,50,100,200,500],([],input()))
Mit ``lambda`` definiert man einfache Funktionen, ohne ihnen einen Namen geben zu müssen. `reduce()` erwartet als erstes Argument nämlich eine Funktion. Und die wird mit ``lambda`` an der Stelle definiert, wo sie auch gleich übergeben wird.

`(a,b)` und `c` sind die Argumente, die von `reduce()` an die Funktion übergeben werden. Und zwar als erstes das Ergebnis vom letzten Aufruf und als zweites ein Element vom "iterable" das `reduce()` als zweites Argument übergeben wurde. Beim ersten Aufruf gibt's ja noch kein Ergebnis vom letzten Aufruf, da wird das dritte Argument von `reduce()` als erstes Argument übergeben.

Mal ein einfaches Beispiel für `reduce()`:

Code: Alles auswählen

In [4]: reduce(lambda a, b: a * b, [3, 5, 10], 1)
Out[4]: 150
Das erste Argument ist eine Funktion, die zwei Argumente entgegennimmt und diese multipliziert. `reduce()` ruft die jetzt für jedes Elemenet in der Liste auf, jeweils mit dem Ergebnis des letzten Aufrufs als erstem Argument und dem jeweiligen Element der Liste als zweitem Argument. Beim ersten Aufruf ist a=1, das dritte Argument von `reduce()`, und b=3, das erste Element der Liste. Ergebnis ist 3. Jetzt wird die Funktion mit a=3 und b=5 aufgerufen => 15, und für die 10 wird die Funktion mit a=15 und b=10 aufgerufen => 150.

Bei mir nimmt die Funtkion als erstes Argument ein Tupel aus Liste mit dem bisherigen Ergebnis und dem Restbetrag entgegen. Ein Aufruf von dem ersten `reduce()` sieht so aus (die 355 habe ich nach dem Aufruf eingegeben, weil das ``input()`` auf eine Eingabe wartet):

Code: Alles auswählen

In [3]: f(lambda(a,b),c:([(b>=c,c)]+a,b-(b>=c)*c),[5,10,20,50,100,200,500],([],input()))
355
Out[3]:
([(False, 500),
  (False, 200),
  (True, 100),
  (True, 50),
  (True, 20),
  (True, 10),
  (True, 5)],
 170)
Der Startwert ist ein Tupel aus einer leeren Liste und dem Betrag, der vom Anwender eingegeben wird. In jedem Schritt wird ein Tupel aus Wahrheitswert, ob ein Schein mit dem aktuellen Notenwert (`c`) ausgezahlt werden soll oder nicht und dem Notenwert *vor* die bisherige Liste (`a`) gehängt, und falls nötig der Notenwert vom Restbetrag (`b`) abgezogen. Dabei wird die Besonderheit ausgenutzt, dass sich `True` und `False` bei Rechenoperationen wie 1 und 0 verhalten. Wenn ``(b>=c)`` wahr ist, wird also `1*c` von `b` abgezogen, im anderen Fall `0*c` also letztlich 0.

Der zweite Einsatz von `reduce()` arbeitet im wesentlichen nach dem gleichen Prinzip. Eingabe ist die Liste mit den Flags und Notenwerten aus dem ersten Schritt und einem Tupel aus leerer Liste und Restbetrag als Startwert. Ausgabe ist ein Tupel mit einer Liste von Zeichenketten der Form `'anzahl * notenwert'` und dem Restbetrag, der ignoriert wird, weil nur das erste Element an die `join()`-Methode übergeben wird.

Die beiden Argumente der zweiten ``lambda``-Funktionen sind jeweils zwei Tupel bestehend aus bisheriger Ergebnisliste (`a`) und Restbetrag (`b`), und Wahrheitswert (`c`) ob der Notenwert (`d`) im ersten Durchgang ausbezahlt würde, und dem Notenwert selbt. Das sind ja die Elemente aus der Liste wie man oben im Beispiel sieht.

Ich denke der grösste Knackpunkt ist das Verstehen der `reduce()`-Funktion. Damit tun sich viele Leute ein wenig schwer.

Man muss als Anfänger auch nicht unbedingt sofort "code golf"-Lösungen komplett verstehen. Sich damit auseinander zu setzen fördert vielleicht das Verständnis von den etwas skurrileren Ecken einer Programmiersprache, aber nicht alles was man dabei kennenlernt, gehört in saubere Programme. Ein Beispiel wäre das ``&`` vs. ``and``. Die Bitoperation ist natürlich zwei Zeichen kürzer und funktioniert in vielen Fällen äquivalent zum logischen ``and``, aber verständlicher ist die logische Operation, wenn man die meint und nicht die Bitmanipulation.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

SuperDAU² hat geschrieben:Meinst du so

So geht das leider nicht. Wie könnte ich die Zeilen 13-15 abändern?
Ich werde daraus einfach nicht schlau.

Code: Alles auswählen

for schein in scheine:
    if betrag >= schein:
        n, betrag = divmod(betrag, schein)
        auszahlung.extend([schein]*n)
Edit: oder in lang:

Code: Alles auswählen

for schein in scheine:
    if betrag >= schein:
        n = betrag //schein
        betrag = betrag % schein
        auszahlung.extend([schein]*n)
Das Leben ist wie ein Tennisball.
SuperDAU²
User
Beiträge: 20
Registriert: Sonntag 24. Mai 2009, 12:47

@BlackJack:
Danke für den ausführlichen Text, ich hoffe mal, dass ich es verstanden habe.

Der "reduce"-Funktion werden also mehr Argumente als Variablen übermittelt!?

@EyDu:
Danke auch an dich , aber inzwischen habe ich selbst eine Lösung gefunden:


Code: Alles auswählen

#!/usr/bin/env python
# Bankautomat
scheine = [5, 10, 20, 50, 100, 200, 500]
auszahlung = []
trenn = ''
betrag = int(raw_input('Wieviel soll ausgezahlt werden? '))
for schein in scheine:
    if betrag // schein:
        auszahlung.append(schein)
        betrag = betrag - schein
    else:
        break
scheine.reverse()
for schein in scheine:
    for durchgang in xrange(betrag // schein):
        auszahlung.append(schein)
        betrag = betrag - schein
auszahlungsliste = [(auszahlung.count(schein), schein) for schein in scheine]
print 'Ihre Auszahlung:', trenn.join(map(str, auszahlungsliste))
Allerdings ist die Ausgabe immer noch Mist (nicht sehr übersichtlich). Ich probiere gerade mit der Zeichenkettenformatierung herum.

Edit: Wer sagt's denn, ich hab's geschafft!

Code: Alles auswählen

#!/usr/bin/env python
# Bankautomat
scheine = [5, 10, 20, 50, 100, 200, 500]
auszahlung = []
trenn = ''
betrag = int(raw_input('Wieviel soll ausgezahlt werden? '))
for schein in scheine:
    if betrag // schein:
        auszahlung.append(schein)
        betrag = betrag - schein
    else:
        break
scheine.reverse()
for schein in scheine:
    for durchgang in xrange(betrag // schein):
        auszahlung.append(schein)
        betrag = betrag - schein
print 'Ihre Auszahlung: '
for schein in scheine:
    if auszahlung.count(schein) == 0:
        continue
    else:
        print '%d * %d EUR' % (auszahlung.count(schein), schein)
Und wenn ein Schein nicht ausgezahlt wird, wird er nicht ausgegeben als "0*x" sondern einfach wegelassen. :D
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Man könnte am Ende über die `auszahlung` anstatt über `scheine` iterieren, um sich das Testen auf 0 zu sparen. Hier bietet sich ein Set an, da es alle mehrfachen Einträge rausschmeisst:

Code: Alles auswählen

In [2]: auszahlung = [100,50,50,50,10,5,5]

In [3]: sorted(set(auszahlung))
Out[3]: [5, 10, 50, 100]
Wie du dir jetzt sicher denken kannst, sind Sets nicht sortiert. ;)

Und nochwas:

Code: Alles auswählen

In [4]: a = 1

In [5]: a = a + 1

In [6]: a
Out[6]: 2

In [7]: b = 1

In [8]: b += 1

In [9]: b
Out[9]: 2
Geht natürlich nicht nur für's Addieren...
Antworten