Basic nach Python - Sprunganweisungen

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
gerdk
User
Beiträge: 12
Registriert: Freitag 17. Februar 2023, 19:52

Hallo, es gab in den 80er Jahren ein Buch "Basic in 100 Beispielen" das mich sehr begeisterte.
Hier gibt es u.a. ein Programm, das ich versuche, nach Python zu übertragen, scheitere aber an den Sprunganweisungen (goto, if ... then (goto)).

Gibt es irgendwelche Tipps, wie man das "gescheit" auflösen kann?

Hier ein Beispiel, das ich portieren möchte:

10 PRINT
30 INPUT "Hoehe des Darlehens "; darlehen
40 INPUT "Hoehe der Rueckzahlung "; hoehrueckzahlung
50 INPUT "wie oft im Jahr "; wieoftimjahr
60 INPUT "Jahreszinssatz "; zinssatz
70 zinssatz=zinssatz/100/12
90 PRINT "Jahr Zinsen Tilgung Restdarlehn "
100 jahr=0
110 summezinsen=0
120 neudarlehen=darlehen
130 zinsen=0
140 FOR ischleife=1 TO wieoftimjahr
150 zinsen=zinsen+darlehen*zinssatz
160 darlehen=darlehen-hoehrueckzahlung+darlehen*zinssatz
170 IF darlehen> THEN 200
180 darlehen=0
190 GOTO 210
200 NEXT ischleife
210 jahr=jahr+1
215 REM jahr , Zinsen:
220 PRINT jahr TAB( 7)INT(100*zinsen+.5)/100;
225 REM Tilgung:
230 PRINT TAB(16)INT(100*(neudarlehen-darlehen)+.5)/100;
235 REM Restdarlehen
240 PRINT TAB(26)INT(100*darlehen+.5)/100
250 summezinsen=summezinsen+zinsen
260 IF darlehen>0 THEN 120
270 PRINT
280 PRINT "Laufzeit "jahr-1" Jahre "12*ischleife/wieoftimjahr" Monate"
290 PRINT "Summe aller Zinsen";
300 PRINT INT(100*summezinsen+.5)/100" €"
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gerdk: Es gibt mit PC-BASIC einen in Python geschriebenen GW-BASIC-kompatiblen Interpreter. Damit könntest Du das ausführen — wenn Du den mindestens einen Fehler behebst. In Zeile 170 ist die IF-Bedingung unvollständig.

Dann ist ein Fehler drin: Wenn man ein Darlehen der Höhe 0 hat, wird die äussere Schleife trotzdem durchlaufen und es wird etwas zurückgezahlt, wenn ich das richtig sehe. Wenn man das anders formuliert, dann wird die Portierung einfacher. Ich bin mir ziemlich sich er der BASIC-Dialekt da kennt WHILE/WEND.

Ansonsten musst Du halt schauen was mit den Sprüngen dort gemacht wird. Beispielsweise etwas Überspringen wenn eine Bedingung zutrifft muss man in solchen BASIC-Varianten tun weil das IF/ELSE auf eine Zeile beschränkt ist oder es sogar gar kein ELSE gibt. Wobei das IF was hier so etwas macht ganz einfach umformuliert werden kann. Das hätte man also auch in dem antiken BASIC schon nicht so schreiben müssen.

Andere GOTOs brechen Schleifen ab, oder formen selbst eine Schleife. Für's abbrechen von Schleifen hat Python eine Anweisung. Und Schleifen kann man mit ``for`` und ``while`` schreiben.

Edit: Nachtrag: Das ist doch aber auch noch inhaltlich falsch den Zinssatz für einen Monat zu berechnen, dann aber nicht genau 12 mal das ganze durchzuführen, sondern den Benutzer auch mehr oder weniger als 12 Monate wählen zu lassen‽

Edit2: Und im Februar hattest Du doch ein total ähnliches Programm. Da musst Du jetzt mal selbst ran, sonst lernst Du ja nicht das auch mal selbst zu machen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
gerdk
User
Beiträge: 12
Registriert: Freitag 17. Februar 2023, 19:52

sollte natürlich heißen:
170 IF darlehen>0 THEN 200
gerdk
User
Beiträge: 12
Registriert: Freitag 17. Februar 2023, 19:52

[ok, habs portiert,
noch nicht richtig formatiert, auch noch nicht fertig ...

#!/usr/bin/env python3

def main():

Code: Alles auswählen

darlehen
    darlehen = int(input("Darlehen ?  "))
    zinssatz = float(input("Zinssatz ? "))
    rate     = int(input("monatliche Rate ? "))
    wieoft   = int(input("wie oft im Jahr ? "))
    
    rest_kapital = darlehen
    merke_wie_oft = wieoft
    summezinsen = jahr = anz_monate = 0
    
    print("Jahr", "\t\tZinsen", "\tTilgung", "\t\tRestschuld")

    while int(rest_kapital) > int(rate):
        jahr = jahr + 1
        jahr_zins = 0
        merkealtesdarlehen = darlehen
        for i in range(int(wieoft)):
            mon_zins = darlehen * zinssatz / 100 / 12
            jahr_zins = jahr_zins + mon_zins
            rest_kapital = rest_kapital + mon_zins - rate
            darlehen = rest_kapital
            if darlehen < wieoft * rate:
                if i == merke_wie_oft - 1:
                    anz_monate = int((darlehen / rate) + 1)
                    wieoft = anz_monate
        tilgung = merkealtesdarlehen - rest_kapital
        
        if darlehen >= merkealtesdarlehen:
            print("Zinssatz zu hoch oder Rate zu niedrig")
           
        if tilgung < rate * anz_monate:
            tilgung = merkealtesdarlehen
            rest_kapital = 0
            
        print("%2d" % jahr, "  ", end='')
        print('\t{0:9.2f}'.format(jahr_zins), '\t{0:8.2f}'.format(tilgung), '\t{0:8.2f}'.format(rest_kapital))

        summezinsen = round(summezinsen, 2) + round(jahr_zins, 2)
               
    print("Jahre", jahr-1, "Monate", anz_monate, "\tSummeZinsen", '{0:8.2f}'.format(summezinsen))
    
    

if __name__ == "__main__":
    main()
gerdk
User
Beiträge: 12
Registriert: Freitag 17. Februar 2023, 19:52

"Edit: Nachtrag: Das ist doch aber auch noch inhaltlich falsch den Zinssatz für einen Monat zu berechnen, dann aber nicht genau 12 mal das ganze durchzuführen, sondern den Benutzer auch mehr oder weniger als 12 Monate wählen zu lassen‽"

.... man kann zwischen 1 und 12 Monaten eingeben ...
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gerdk: Nö, man kann auch alles mögliche andere Eingeben. Und alles ausser 12 Monate ist falsch, also kann man eigentlich gar nichts auswählen sondern *muss* 12 eingeben, wenn man ein korrektes Ergebnis will.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten