Kleines Problem

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.
Olsen
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 17:46

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Das Leben ist wie ein Tennisball.
BlackJack

@Olsen: Was soll denn diese ``for``-Schleife bewirken?
Olsen
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 17:46

@BlackJack: Es sollen die Durchläufe gezählt und ausgegeben werden.
Das wollte ich damit realisieren. Geht es auch einfacher/besser?
BlackJack

@Olsen: Wie oft wird die ``for``-Schleife denn durchlaufen, und warum? Welchen Wert hat `x` dabei, und warum wird `x` nirgends verwendet?
Olsen
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 17:46

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)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
Olsen
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 17:46

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
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

@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.
Olsen
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 17:46

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.
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?
Olsen
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 17:46

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. :D
Zuletzt geändert von Olsen am Donnerstag 30. Oktober 2014, 22:45, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@Olsen: Dann mußt Du halt einen Schritt voraus berechnen.
Olsen
User
Beiträge: 17
Registriert: Donnerstag 16. Oktober 2014, 17:46

Jo danke, klappt jetzt alles.
Zett
User
Beiträge: 9
Registriert: Samstag 26. Januar 2013, 00:01

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
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.
Py19917062
User
Beiträge: 113
Registriert: Freitag 30. Januar 2009, 00:53
Wohnort: Dortmund
Kontaktdaten:

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()
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
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()
Antworten