Frage zu while- Schleife

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.
Antworten
Kampfkeiler
User
Beiträge: 9
Registriert: Montag 31. Oktober 2011, 20:54

Hallo,
ich bin ein totaler Neuling in Python 3.
Wir haben die Aufgabe bekommen, ein Programm zu schreiben, dass eine beliebige positive Zahl annimmt
und diese solange um 1% erhöht, bis sich der Wert verdoppelt hat.
➢ Schreiben Sie ein Programm, das eine Gleitkommazahl
„Kapital“ entgegennimmt.
➢ Wenn diese Zahl größer als null ist, soll sie so lange um 1
Prozent vergrößert werden, bis sich ihr Wert verdoppelt hat.
➢ Geben Sie die Variable nach jeder Erhöhung mittels
„print(Kapital)“ aus.
Das habe ich auch versucht, allerdings funktioniert es nicht so wie gewünscht.
Die Zahlen werden zwar um 1% erhöht, allerdings stoppt das Programm nicht mehr.
Jetzt stellt sich mir die Frage, was genau ich falsch gemacht habe.

Code: Alles auswählen

print("Dieses Programm erhöht eine beliebige positive Zahl (Kapital) solange um 1%, bis sich der Wert verdoppelt hat!")
Kapital = float(input("Geben Sie den Startwert von 'Kapital' an: "))
while True:
    Kapital = Kapital*1.01
    print(Kapital)
    if Kapital == 2*Kapital:
        break
Mit meinen Python 3 Kenntnissen kann ich da leider keine Lösung finden :(
Zuletzt geändert von Kampfkeiler am Montag 31. Oktober 2011, 21:51, insgesamt 2-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

1. Regel: Prüfe niemals Gleitkommazahlen auf Gleichheit (mittels ==). Das klappt auf Grund einer endlichen Rechengenauigkeit oft nicht. Benutze >= oder <= (z.B. a >= b - epsilon mit epsilon = 1e-15).
2. Überlege nochmal scharf warum Kapital == 2*Kapital auch sonst niemals wahr sein kann. Tipp: Versuch mal nach Kapital aufzulösen
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Code: Alles auswählen

print("Dieses Programm erhöht eine beliebige positive Zahl (Kapital) solange um 1%, bis sich der Wert verdoppelt hat!")
Kapital = float(input("Geben Sie den Startwert von 'Kapital' an: "))
while True:
   Kapital = Kapital*1.01
   print(Kapital)
   if Kapital == 2*Kapital:
      break
--
Weiterer Hinweis:
1 == 2?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Kampfkeiler
User
Beiträge: 9
Registriert: Montag 31. Oktober 2011, 20:54

Stimmt, die if Bedingung macht keinen Sinn. Das fällt mir auch gerade auf :wink:
Ich habe jetzt probiert, dass die Variable von input() anders ist, aber jetzt macht er ständig das Selbe.
Wenn ich z.B. 3 eingebe, wiederholt er immer nur 3.03......

Code: Alles auswählen

print("Dieses Programm erhöht eine beliebige positive Zahl (Kapital) solange um 1%, bis sich der Wert verdoppelt hat!")
Startwert = float(input("Geben Sie den Startwert von 'Kapital' an: "))
while Startwert >= 0:
    Kapital = Startwert*1.01
    print(Kapital)
    if Kapital >= 2*Startwert:
        break
BlackJack

@Kampfkeiler: Dann spiel doch mal Python-Interpeter und geh das Programm Zeile für Zeile durch. Warum sollte denn Deiner Meinung nach bei dem Code *nicht* immer das selbe ausgegeben werden?
Kampfkeiler
User
Beiträge: 9
Registriert: Montag 31. Oktober 2011, 20:54

BlackJack hat geschrieben:@Kampfkeiler: Dann spiel doch mal Python-Interpeter und geh das Programm Zeile für Zeile durch. Warum sollte denn Deiner Meinung nach bei dem Code *nicht* immer das selbe ausgegeben werden?
Okay, ich verstehe, wieso er immer das selbe anzeigt. Kapital wurde von mir ja mit Startwert*1.01 festgelegt. Von daher zeigt er das immer an.

Ich hab jetzt gesagt, dass Kapital= Startwert ist. Das Programm endet jetzt sobald der Wert 2*Startwert erreicht.

Code: Alles auswählen

print("Dieses Programm erhöht eine beliebige positive Zahl (Kapital) solange um 1%, bis sich der Wert verdoppelt hat!")
Startwert = float(input("Geben Sie den Startwert von 'Kapital' an: "))
Kapital = Startwert
while Startwert >=0:
    Kapital = Kapital*1.01
    print(Kapital)
    if Kapital >= 2*Startwert:
        break
Das sollte doch eigentlich die Erfüllung der Aufgabe sein oder? Mathematisch ist es ja nicht möglich, dass da exakt das doppelte rauskommt.
Ein paar Kommazahlen gibt es ja immer.
BlackJack

@Kampfkeiler: Unschön ist vielleicht noch die Bedingung der ``while``-Schleife. Da wird etwas immer wieder getestet was sich niemals ändert. Da könntest Du vielleicht eher eine Bedingung formulieren, die das ``if`` und das ``break`` am Ende der Schleife ersetzt.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Kampfkeiler hat geschrieben:Mathematisch ist es ja nicht möglich, dass da exakt das doppelte rauskommt.
Ein paar Kommazahlen gibt es ja immer.
Du übersiehst Startwert=0. Gibt bei dir auch eine Endlosschleife.
Kampfkeiler
User
Beiträge: 9
Registriert: Montag 31. Oktober 2011, 20:54

Ich wüsste nicht wie ich das if und break weglassen sollte. Das haben wir auch noch nicht besprochen, bzw. denke ich nicht, dass wir das noch machen werden.

Wenn ich 0 eingebe, dann bekomme ich als Ergebnis 0. Aber nur einmal. Ich habe jetzt einfach in die Erklärung des "Programms" rein geschrieben, dass der Startwert >0 sein muss. So wurde es ja auch in der Aufgabe verlangt.

Schon mal danke an alle für die Hilfe!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mal ohne if und break:

Code: Alles auswählen

while kapital < 2*startwert:
    kapital *= 1.01
    print kapital
Das Verhalten für startwert=0 ist natürlich nun ein wenig anders.
Das Leben ist wie ein Tennisball.
Antworten