basic-Programm nach Python

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: 2
Registriert: Freitag 17. Februar 2023, 19:52

Hallo, bin absoluter python-Anfänger!

ich hatte vor Jahren ein Programm erstellt, welches mir Zins+Zinseszinsen berechnete.
Das "Besondere" daran war, daß

1. die komplette Tabelle immer "fest" auf dem Bildschirm zu sehen war,
2. ich durch die Taste "k" das Kapital erhöhen konnte
3. ich durch die Tasten "+" und "-" den Zinssatz um jeweils 0,25 % verändern konnte.

Leider finde ich bei python nicht, wie ich immer an die gleiche Position ausgeben kann.
Wenn jmd Tips hat, danke im voraus

hier das Basic-listing:
0 KEY OFF
20 LOCATE 25,1:PRINT SPACE$(80);
30 CLS
40 LAUF=1
50 PRINT:PRINT " Zinseszinsberechnung fÅr 20 Jahre"
60 PRINT:INPUT " Kapital : ";EINGABE
70 PRINT:INPUT " Zinssatz : ";ZINS
80 CLS
90 LOCATE 2,7:COLOR 0,7:PRINT " Zinseszinsen ";:COLOR 7,0
100 LOCATE 24,1:PRINT STRING$(80,"Õ");
110 LOCATE 25,7:COLOR 0,7
120 PRINT "+/-";
130 COLOR 7,0
140 PRINT " Zinssatz um 0.25% verÑndern",
150 COLOR 0,7
160 PRINT "K";
170 COLOR 7,0
180 PRINT "apital verÑndern ";
190 COLOR 0,7
200 PRINT "E";
210 COLOR 7,0
220 PRINT "nde";
230 LOCATE 4,7
240 PRINT "Kapital :" EINGABE;
250 LOCATE 2,30
260 PRINT "Jahr Kapital Zinsen Endkapital Zinseszinsen";
270 WHILE A$<>"e"
280 LOCATE 6,7
290 PRINT "Zinssatz :" ZINS "% ";
300 KAPITAL = EINGABE
310 WHILE LAUF <=20
320 SUM = KAPITAL * ZINS / 100
330 ZINSESZINS = ZINSESZINS + SUM
340 KAPITALNEU = KAPITAL + SUM
350 LOCATE LAUF+3,30
360 PRINT USING "##";LAUF,
370 PRINT USING " ######.##";KAPITAL,
380 PRINT USING " #####.##";SUM,
390 PRINT USING " ######.##";KAPITALNEU,
400 PRINT USING " ######.##";ZINSESZINS
410 KAPITAL=KAPITALNEU
420 LAUF=LAUF+1
430 WEND
440 LAUF=1
450 A$=INKEY$:IF A$="" THEN 450
460 IF A$="-" THEN ZINS=ZINS-.25
470 IF A$="+" THEN ZINS=ZINS+.25
480 IF A$="k" THEN LOCATE 4,18:PRINT SPACE$(10):LOCATE 4,18:INPUT "", EINGABE
490 ZINSESZINS = 0
500 WEND
510 END
Benutzeravatar
noisefloor
User
Beiträge: 3571
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

`print` gibt in Python einfach fortlaufen aus, d.h. damit kannst du nicht angeben "gebe den Text in Zeile X beginnend in Spalte Y aus". Wenn du dir ein TUI (text user inface) bauen willst gibt es dafür z.B. das `curses` Modul, was Python standardmäßig an Bord hat. Tutorial: https://docs.python.org/3/howto/curses.html

Gruß, noisefloor
Benutzeravatar
sparrow
User
Beiträge: 3855
Registriert: Freitag 17. April 2009, 10:28

Wobei mein letzter Stand ist, dass "curses" unter Windows eben nicht an Bord ist und über pip "windows-curses" nachinstalliert werden muss.
__deets__
User
Beiträge: 13405
Registriert: Mittwoch 14. Oktober 2015, 14:29

War da nicht urwird das Mittel der Wahl?

Aber es geht auch ein bisschen weniger schwergewichtig: https://pypi.org/project/colorama/

Damit kann man von Hand den Cursor positionieren, und auch die Farben setzen. Ich vermute, dass ist dem TE lieber. Weniger Abstraktion.
gerdk
User
Beiträge: 2
Registriert: Freitag 17. Februar 2023, 19:52

Hallo,
vielen Dank für die Antworten.
Ich vergaß zu erwähnen, daß ich an einem Mac sitze,
import cures funktioniert dort nicht (angeblich implementiert ...)
Wäre da nicht tkinter eine gute Idee, das Programm zu portieren?
__deets__
User
Beiträge: 13405
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ob das eine gute Idee ist, musst du ja wissen. Es wird sehr anders werden mit tkinter, weil GUIs eine komplett andere Art zu programmieren vorraussetzen. Aber wenn du dich dieser Herausforderung stellen willst, ist das natuerlich moeglich.

Eigentlich sollte curses dabei sein. Du schreibst "cures". Das existiert nicht. Kann natuerlich nur hier ein Fehler sein, aber die genau Schreibweise ist wichtig.
Benutzeravatar
noisefloor
User
Beiträge: 3571
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

wenn du Tkinter nutzen möchtest, dann ist das eine gute Gelegenheit, tiefer bei Python in Objektorientierung, Klassen und deren Instanzen abzutauchen. Weil alles außer eine mega-trivialnen GUI solltest du in eine Klasse packen.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 11749
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@gerdk: Die wahrscheinlich einfachste Art das Programm mit Python zum laufen zu bekommen ist PC-BASIC: http://robhagemans.github.io/pcbasic/

Das ist ein in Python geschriebener GW-BASIC-Interpreter. 😎
“The object-oriented version of 'Spaghetti code' is, of course, 'Lasagna code'. (Too many layers)“ — Roberto Waltman
Benutzeravatar
__blackjack__
User
Beiträge: 11749
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Anmerkungen zu dem BASIC Quelltext:

Es wurde ein Quelltext in einer DOS-Kodierung (CP437) als Text für den Mac dekodiert, weshalb die Umlaute falsch dargestellt sind, und die Trennlinie, die eigentlich aus "═"-Zeichen besteht.

Die Platzierung der Ein- und Ausgaben ist fast überall ein bisschen falsch. Wie man an folgendem ”Bildschirmfoto” sehen kann:

Code: Alles auswählen

       Zinseszinsen          Jahr Kapital Zinsen Endkapital Zinseszinsen

      Kapital : 15000         1   5000.00   150.00   5150.00    150.00
                              2   5150.00   154.50   5304.50    304.50
      Zinssatz : 3 %  %       3   5304.50   159.13   5463.64    463.64
                              4   5463.64   163.91   5627.54    627.54
                              5   5627.54   168.83   5796.37    796.37
                              6   5796.37   173.89   5970.26    970.26
                              7   5970.26   179.11   6149.37   1149.37
                              8   6149.37   184.48   6333.85   1333.85
                              9   6333.85   190.02   6523.87   1523.87
                             10   6523.87   195.72   6719.58   1719.58
                             11   6719.58   201.59   6921.17   1921.17
                             12   6921.17   207.64   7128.80   2128.80
                             13   7128.80   213.86   7342.67   2342.67
                             14   7342.67   220.28   7562.95   2562.95
                             15   7562.95   226.89   7789.84   2789.84
                             16   7789.84   233.70   8023.53   3023.53
                             17   8023.53   240.71   8264.24   3264.24
                             18   8264.24   247.93   8512.17   3512.17
                             19   8512.17   255.36   8767.53   3767.53
                             20   8767.53   263.03   9030.56   4030.56
════════════════════════════════════════════════════════════════════════════════
      +/- Zinssatz um 0.25% verändern     Kapital verändern Ende
Die Werte in der Tabelle stehen nicht ganz passend unter den Überschriften. Beim erneuten eingeben des Kapitals erfolgt die Eingabe ein Zeichen zu spät. Darum ist da noch eine 1 vor der 5000 von der initialen Eingabe des Kapitals. Beim Zinssatz werden nach dem Prozentzeichen nicht immer genügend Zeichen danach überschrieben, so dass es in bestimmten Fällen vorkommen kann, das ein weiteres "%"-Zeichen auf dem Bildschirm stehen bleibt.

Bei der Ersteingabe von Kapital und Zinssatz steht ein Semikolon beim INPUT wo eigentlich ein Komma stehen sollte, damit kein Fragezeichen nach der Eingabeaufforderung ausgegeben wird. Bei der erneuten Eingabe eines Kapitalwertes wird das ja schon so gemacht.

LAUF wird viel zu früh mit 1 initialisiert. So etwas macht man direkt vor der Schleife wo das verwendet wird, dann muss man das auch nicht *nach* der Schleife *noch mal* auf 1 setzen. Genau Ebenfalls einmal vor der Schleife sollte man ZINSESZINS intitialisieren.

LAUF sollte aber auch gar nicht eigens auf 1 gesetzt werden, denn die innere WHILE-Schleife ist eigentlich eine FOR-Schleife.

`SUM` ist gar keine Summe. Das ist der ZINS. Und was im Programm ZINS heisst, ist der ZINSSATZ.

Das END am Ende kann man sich sparen, da ist das Programm ja auch so am Ende angekommen.

Überarbeitete Version:

Code: Alles auswählen

10 KEY OFF:LOCATE 25,1:PRINT SPACE$(80);:CLS
20 PRINT:PRINT " Zinseszinsberechnung für 20 Jahre"
30 PRINT:INPUT " Kapital : ",EINGABE
40 PRINT:INPUT " Zinssatz : ",ZINSSATZ
50 CLS:LOCATE 2,7:COLOR 0,7:PRINT " Zinseszinsen ":COLOR 7,0
60 LOCATE 24,1:PRINT STRING$(80,"═");
70 LOCATE 25,7
80 COLOR 0,7:PRINT "+/-";:COLOR 7,0:PRINT " Zinssatz um 0.25% verändern",
90 COLOR 0,7:PRINT "K";:COLOR 7,0:PRINT "apital verändern ";
100 COLOR 0,7:PRINT "E";:COLOR 7,0:PRINT "nde";
110 LOCATE 4,7
120 PRINT "Kapital :";EINGABE;
130 LOCATE 2,30
140 PRINT "Jahr   Kapital   Zinsen Endkapital Zinseszinsen";
150 WHILE A$<>"e"
160 LOCATE 6,7:PRINT "Zinssatz :";ZINSSATZ;"%   ";
170 KAPITAL=EINGABE:ZINSESZINS=0
180 FOR LAUF=1 TO 20
190 ZINS=KAPITAL*ZINSSATZ/100
200 ZINSESZINS=ZINSESZINS+ZINS
210 KAPITALNEU=KAPITAL+ZINS
220 LOCATE LAUF+3,30
230 PRINT USING "  ##";LAUF,
240 PRINT USING " ######.##";KAPITAL;
250 PRINT USING " #####.##";ZINS;
260 PRINT USING "  ######.##";KAPITALNEU;
270 PRINT USING "    ######.##";ZINSESZINS
280 KAPITAL=KAPITALNEU
290 NEXT
300 A$=INKEY$:IF A$="" THEN 300
310 IF A$="+" THEN ZINSSATZ=ZINSSATZ+.25
320 IF A$="-" THEN ZINSSATZ=ZINSSATZ-.25
330 IF A$="k" THEN LOCATE 4,17:PRINT SPACE$(10):LOCATE 4,17:INPUT "",EINGABE
340 WEND
`colorama` alleine wird wohl nicht reichen, weil das nur die Ausgabe abdeckt, aber nicht die direkte Eingabe von einzelnen Zeichen. Da ist das blessed-Modul das Leichtgewichtigste was mir einfällt. Damit sollte sich das Programm relativ leicht von BASIC nach Python portieren lassen. Einzig die Eingabe mitten auf dem Bildschirm könnte problematisch werden. Entweder löst man das anders, oder man schreibt sich eine eigene Eingaberoutine, die den Rest der Zeile nicht verändert.
“The object-oriented version of 'Spaghetti code' is, of course, 'Lasagna code'. (Too many layers)“ — Roberto Waltman
Benutzeravatar
grubenfox
User
Beiträge: 181
Registriert: Freitag 2. Dezember 2022, 15:49

__blackjack__ hat geschrieben: Dienstag 21. Februar 2023, 10:16 `colorama` alleine wird wohl nicht reichen, weil das nur die Ausgabe abdeckt, aber nicht die direkte Eingabe von einzelnen Zeichen. Da ist das blessed-Modul das Leichtgewichtigste was mir einfällt. Damit sollte sich das Programm relativ leicht von BASIC nach Python portieren lassen. Einzig die Eingabe mitten auf dem Bildschirm könnte problematisch werden. Entweder löst man das anders, oder man schreibt sich eine eigene Eingaberoutine, die den Rest der Zeile nicht verändert.
Offenbar kann "blessed" da auch die Ausgabe übernehmen. Also so nach den Demos auf der Projektseite. Wobei gleich das erste Beispiel, das mit

Code: Alles auswählen

with term.cbreak(), term.hidden_cursor():
    inp = term.inkey()
ist das nicht schon so eine "Eingabe mitten auf dem Bildschirm"?
Benutzeravatar
__blackjack__
User
Beiträge: 11749
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@grubenfox: Das liest *einen* Tastendruck. Daraus müsste man sich dann ein `input()` nachbauen das den *Rest* der Zeile nicht stört/verändert. Wenn man in dem BASIC-Programm "k" drückt, dann springt der Cursor hinter das "Kapital :" links oben und man kann *dort* eine neue Zahl eingeben und das ohne die Tabelle die rechts davon steht zu stören bzw. ohne das das was dort in der gleichen Zeile steht, die Eingabe beeinflusst.

In BASIC bekommt man die gesamte Eingabe einfach mit einem INPUT (in Zeile 330 ganz am Ende), in Python mit `blessed` müsste man sich so eine Eingaberoutine schreiben. Oder es wie gesagt anders lösen, so dass man einfach `input()` verwenden kann, in einer Zeile wo sonst nichts weiter steht was man durch die Eingabe (inklusive Entfernen-Taste um Fehler zu korrigieren) ”zerstören” kann.
“The object-oriented version of 'Spaghetti code' is, of course, 'Lasagna code'. (Too many layers)“ — Roberto Waltman
Benutzeravatar
grubenfox
User
Beiträge: 181
Registriert: Freitag 2. Dezember 2022, 15:49

Aha... Danke! Hach... "BASIC" 8) verdammt lang her... ;)
Benutzeravatar
__blackjack__
User
Beiträge: 11749
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal mit `blessed` portiert:

Code: Alles auswählen

#!/usr/bin/env python3
from blessed import Terminal


def main():
    screen = Terminal()
    with screen.fullscreen():
        print(f"{screen.clear}\n Zinseszinzberechnung für 20 Jahre")
        eingabe = float(input("\n Kapital : "))
        zinssatz = float(input("\n Zinssatz : "))
        print(
            f"{screen.clear}{screen.move_yx(1, 7)}"
            f"{screen.reverse} Zinseszinsen {screen.normal}"
            f"{screen.move_yx(23, 0)}" + "=" * 80 + f"{screen.move_yx(24, 6)}"
            f"{screen.reverse}+/-{screen.normal} Zinssatz um 0.25% verändern"
            f"\t{screen.reverse}K{screen.normal}apital verändern "
            f"{screen.reverse}E{screen.normal}nde"
            f"{screen.move_yx(3, 6)}Kapital : {eingabe}"
            f"{screen.move_yx(1, 29)}"
            f"Jahr   Kapital   Zinsen Endkapital Zinseszinsen"
        )
        while True:
            print(f"{screen.move_yx(5, 6)}Zinssatz : {zinssatz:.2f}%   ")
            kapital = eingabe
            zinseszins = 0
            for lauf in range(1, 21):
                zins = kapital * zinssatz / 100
                zinseszins += zins
                kapital_neu = kapital + zins
                print(
                    f"{screen.move_yx(lauf + 2, 29)}"
                    f"{lauf:4d}{kapital:10.2f}{zins:9.2f}{kapital_neu:11.2f}"
                    f"{zinseszins:13.2f}"
                )
                kapital = kapital_neu

            with screen.cbreak():
                key = screen.inkey().lower()

            if key == "e":
                break
            
            if key == "+":
                zinssatz += 0.25
            elif key == "-":
                zinssatz -= 0.25
            elif key == "k":
                eingabe = float(
                    input(
                        f"{screen.move_yx(3, 16)}"
                        + " " * 10
                        + f"{screen.move_yx(3,16)}"
                    )
                )


if __name__ == "__main__":
    main()
“The object-oriented version of 'Spaghetti code' is, of course, 'Lasagna code'. (Too many layers)“ — Roberto Waltman
Antworten