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" €"
Basic nach Python - Sprunganweisungen
- __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.
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
[ok, habs portiert,
noch nicht richtig formatiert, auch noch nicht fertig ...
#!/usr/bin/env python3
def main():
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()
"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 ...
.... man kann zwischen 1 und 12 Monaten eingeben ...
- __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