Seite 1 von 2
Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 18:08
von Olsen
Guten Abend,
habe ein kleines Problem bei meinem Programm.
Code: Alles auswählen
Guthaben = float(input("Geben Sie ihr Guthaben ein: "))
if Guthaben > 0:
Guthaben1 = Guthaben
n=1
for x in (n, Guthaben):
while Guthaben <= 3*Guthaben1:
Guthaben = round(Guthaben*1.1225,2)
n=n+1
print("Durchlauf:",n-1,"Guthaben = ",Guthaben)
Es geht um Folgende Aufgabenstellung: Wenn das Guthaben größer als null ist, soll es so lange um 12,25 Prozent vergrößert werden, wie sein Wert kleiner als das Dreifache des Startwerts ist.
Meine "Problem" ist, dass das Programm erst aufhört, wenn das Guthaben > 3*Guthaben ist.
Vielen Dank!
Olsen
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 18:28
von EyDu
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 18:40
von BlackJack
@Olsen: Was soll denn diese ``for``-Schleife bewirken?
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 18:51
von Olsen
@BlackJack: Es sollen die Durchläufe gezählt und ausgegeben werden.
Das wollte ich damit realisieren. Geht es auch einfacher/besser?
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 19:09
von BlackJack
@Olsen: Wie oft wird die ``for``-Schleife denn durchlaufen, und warum? Welchen Wert hat `x` dabei, und warum wird `x` nirgends verwendet?
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 19:22
von Olsen
Das Guthaben soll so lange erhöht werden, wie es kleiner als sein 3-faches ist.
Beispiel: Guthaben = 10
nach dem 9. Durchlauf hat es den Wert 28,29. Da soll das Programm eigentlich stoppen.
Das Programm macht jedoch noch einen 10. Durchlauf.
Das mit dem `x` hab ich geändert.
Code: Alles auswählen
Guthaben = float(input("Geben Sie ihr Guthaben ein: "))
if Guthaben > 0:
Guthaben1 = Guthaben
n=1
for n in (1,Guthaben):
while Guthaben < 3*Guthaben1:
Guthaben = Guthaben*1.1225
n=n+1
print("Durchlauf:",n-1,"Guthaben = ",Guthaben)
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 20:04
von Sirius3
@Olsen: welchen Sinn hat die for-Schleife denn jetzt? Hast Du das Programm auch nur einmal gestartet und die Ausgabe angeschaut? Kommt Dir dabei nichts komisch vor?
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 20:13
von Olsen
Ich seh da jetzt nichts komisches:
Geben Sie ihr Guthaben ein: 10
Durchlauf: 1 Guthaben = 11.225000000000001
Durchlauf: 2 Guthaben = 12.600062500000002
Durchlauf: 3 Guthaben = 14.143570156250002
Durchlauf: 4 Guthaben = 15.876157500390628
Durchlauf: 5 Guthaben = 17.82098679418848
Durchlauf: 6 Guthaben = 20.00405767647657
Durchlauf: 7 Guthaben = 22.45455474184495
Durchlauf: 8 Guthaben = 25.20523769772096
Durchlauf: 9 Guthaben = 28.292879315691778
Durchlauf: 10 Guthaben = 31.75875703186402
>>>
Das Programm zählt wie oft das Guthaben erhöht wurde. Dazu ist meiner Meinung nach die for-Schleife nötig.
Das Problem ist, wie gesagt, dass die letzte Zeile sind nicht da sein sollte.
Ändere ich den Code wie folgt:
Code: Alles auswählen
Guthaben = float(input("Geben Sie ihr Guthaben ein: "))
if Guthaben > 0:
Guthaben1 = Guthaben
for n in (1,Guthaben):
while Guthaben < 3*Guthaben1:
print("Durchlauf:",n,"Guthaben = ",Guthaben)
n=n+1
Guthaben = Guthaben*1.1225
steht da:
Geben Sie ihr Guthaben ein: 10
Durchlauf: 1 Guthaben = 10.0
Durchlauf: 2 Guthaben = 11.225000000000001
Durchlauf: 3 Guthaben = 12.600062500000002
Durchlauf: 4 Guthaben = 14.143570156250002
Durchlauf: 5 Guthaben = 15.876157500390628
Durchlauf: 6 Guthaben = 17.82098679418848
Durchlauf: 7 Guthaben = 20.00405767647657
Durchlauf: 8 Guthaben = 22.45455474184495
Durchlauf: 9 Guthaben = 25.20523769772096
Durchlauf: 10 Guthaben = 28.292879315691778
vom Prinzip schon besser. Allerdings gefällt mir da die erste Zeile nicht. Ich will das Folgendes da steht:
Geben Sie ihr Guthaben ein: 10
Durchlauf: 1 Guthaben = 11.225000000000001
Durchlauf: 2 Guthaben = 12.600062500000002
Durchlauf: 3 Guthaben = 14.143570156250002
Durchlauf: 4 Guthaben = 15.876157500390628
Durchlauf: 5 Guthaben = 17.82098679418848
Durchlauf: 6 Guthaben = 20.00405767647657
Durchlauf: 7 Guthaben = 22.45455474184495
Durchlauf: 8 Guthaben = 25.20523769772096
Durchlauf: 9 Guthaben = 28.292879315691778
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 20:25
von kbr
@Olsen: Wenn Du meinst, dass die for-Schleife nötig ist, dann begründe bitte warum. Sonst ist es reine Raterei. Immerhin hört Dein Programm nach dem 10ten Durchlauf auf. Es gibt da also irgendeine Abbruchbedingung. Wenn Dir diese klar wird, hast Du Dein Problem gelöst. Und dann wirst Du sicher begründen können, warum die for-Schleife nicht nötig ist.
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 20:33
von Olsen
Abbruchbedingung soll sein, dass die Schleife verlassen wird, wenn das 3-fache des Startguthabens im nächsten Durchlauf überschritten wird.
Wie kann ich es denn sonst erreichen, dass das Guthaben so oft um 12,25% erhöht wird, wie es kleiner als das 3-fache des Startwertes. Zudem soll die Anzahl der Durchläufe gezählt werden.
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 20:44
von BlackJack
@Olsen: Das ist ja alles schön und gut, aber was ist denn nun der Sinn dieser ``for``-Schleife dabei? Was genau bewirkt die? Wie oft wird die durchlaufen? Und warum?
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 22:44
von Olsen
Ich dachte, dass ohne die for-Schleife das Programm nur einmal ausgeführt wird. Hab die gerade entfernt und siehe da, es funktioniert auch so. Ist jetzt im Endeffekt auch logisch. Manchmal ist so eine Pause gar nicht so schlecht um ein Problem zu lösen.
Habe nun auch die Abbruchbedingung so formuliert, dass alles so ist wie gewünscht.
Danke für die Hilfe und ich bitte um Nachsicht, dass ich etwas gebraucht habe um es zu kapieren.

Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 22:45
von Sirius3
@Olsen: Dann mußt Du halt einen Schritt voraus berechnen.
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 22:46
von Olsen
Jo danke, klappt jetzt alles.
Re: Kleines Problem
Verfasst: Donnerstag 30. Oktober 2014, 22:47
von Zett
Hier mal eine einfache Lösung von mir.
Code: Alles auswählen
while True:
try:
Basis_Guthaben = float(input("Guthaben Eingeben:\n"))
if Basis_Guthaben>0:
break
except:
print("Nur Zahlen eingeben")
Abbruch = Basis_Guthaben*3
Zins = float(1.1225) #12,25%
Guthaben = Basis_Guthaben
Durchlauf = 0
while True:
Guthaben = Guthaben*Zins
if Guthaben<=Abbruch:
Durchlauf += 1
print("Durchlauf: {}, Guthaben: {}".format(Durchlauf, Guthaben))
else:
break
Re: Kleines Problem
Verfasst: Freitag 31. Oktober 2014, 00:19
von EyDu
Du solltest die Abbruchbedingung nach oben in die Bedingung der while-Schleife ziehen. Momentan ist deine Lösung etwas umständlich. Außerdem bietet es sich noch an, die Abfrage des Betrags in eine Schleife zu packen. Hinzu kommt noch, dass niemals ein except ohne Bedingungen, so wie bei dir in Zeile 6, verwendet werden sollte. Damit werden wirklich alle möglichen Ausnahmen abgefangen, auch Programmierfehler. In diesem Fall solltest du nur den möglichen ValueError abfangen.
Die ganze Berechnung der Zinsen solltest du auch noch in eine Funktion stecken, dann wird das ganze etwas übersichtlicher. Bei der Gelegenheit auch noch ein Hinweise auf PEP 8, das ist ein Style Guide für Python Code. Den solltest du dir mal durchlesen und dich ein wenig dran orientiern.
Re: Kleines Problem
Verfasst: Freitag 31. Oktober 2014, 00:46
von BlackJack
Ergänzend: Es macht keinen Sinn `float()` mit einer literalen Gleitkommazahl als Argument aufzurufen. Da kommt als Ergebnis nur die gleiche Gleitkommazahl wieder heraus die man als Argument übergeben hat.
Re: Kleines Problem
Verfasst: Freitag 31. Oktober 2014, 03:03
von Py19917062
Das liegt noch in meinem Fähigkeitsbereich. Deswegen nochmal ein Lösungsansatz von mir.
Code: Alles auswählen
def zins_berechnen():
zins = 1.1225
durchlauf = 1
while True:
try:
guthaben = float(input("Guthaben eingeben: "))
break
except ValueError:
print("Ungültiger Wert.")
while True:
neues_guthaben = guthaben * zins ** durchlauf
if neues_guthaben < guthaben * 3:
print("Durchlauf: {0}, Guthaben: {1:.2f}".format(durchlauf, neues_guthaben))
durchlauf += 1
else:
break
if __name__ == '__main__':
zins_berechnen()
Re: Kleines Problem
Verfasst: Freitag 31. Oktober 2014, 08:57
von /me
Die Funktion zins_berechnen sollte auch wirklich nur berechnen. Die Eingabe als solche gehört logisch an eine andere Stelle.
Das ist eine der grundsätzlichen Regeln die ich in über 30 Jahren Coding gelernt habe: Mische niemals Verarbeitung und Ein-/Ausgabe.
Re: Kleines Problem
Verfasst: Freitag 31. Oktober 2014, 11:49
von BlackJack
Ein funktionaler Ansatz:
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
from itertools import takewhile
def ask_float(prompt, minimum_value=None):
while True:
try:
result = float(raw_input(prompt))
except ValueError:
print('Bitte eine Gleitkommazahl eingeben.')
else:
if minimum_value is not None and result <= minimum_value:
print('Zahl muss grösser als {0} sein.'.format(minimum_value))
else:
return result
def iter_balances(amount, rate):
factor = rate + 1
while True:
yield amount
amount *= factor
def main():
start_balance = ask_float('Bitte Guthaben eingeben: ', 0)
for n, balance in enumerate(
takewhile(
lambda x: x < 3 * start_balance,
iter_balances(start_balance, 12.25 / 100)
)
):
print('{0:3d} {1:.2f}'.format(n, balance))
if __name__ == '__main__':
main()