Eingabe von Termen

Dieses Programm ist in der Lage, einen von der Tastatur eingegebenen mathematischen Term zu analysieren und zu berechnen. Es beherrscht die Addition, die Subtraktion, die Klammerrechnung, die Potenzrechnung, die Multiplikation, die Division und verarbeitet einfache komplexe Zahlen. Weiter kann es trigonometrische Funktionen berechnen. Dieser Parser setzt die eingegebenen Komponenten sehr schnell zum gewünschten Ergebnis zusammen.

Das Programm hat viele Anwendungsmöglichkeiten. Es kann sowohl von Schülern, Studenten und weniger versierten Anwendern, als auch von Fachleuten in den unterschiedlichsten Branchen eingesetzt werden und unterstützt die verschiedensten Rechenprobleme des Alltags. Die Bedienung des Interpreters ist dem des im Direktmodus laufenden GFA-BASIC sehr ähnlich. Es können alle Rechenoperationen, die im Startup-Menü angegeben sind, verwendet werden, z.B *,-,+ usw. Häufig vorkommende Zahlen in der Mathematik sind ebenfalls integriert, wie z.B “pi” und “e”. Die aufgeführten Sonderfunktionen “sin,cos,abs...” können wie in der linken Reihe angegeben benützt werden. Hier einige Beispiele.

Diese Terme können wie folgt eingegeben werden:

1.) OK->1+1-6 oder OK->(1+1)-6 oder OK->((1+1)-+6)
2.) OK->2/9+6 oder OK->(2/9)+6 oder OK->((2/9)+6)
3.) OK->29+4A5 oder OK->(29)+(4^5) oder OK->((2*9)+4^5)

Der Interpreter beherrscht auch ohne Klammerrechnung die Regeln der Mathematik. Natürlich kann man sie durch Setzen von Klammem umgehen.

Es werden weiterhin die Vorzeichen berücksichtigt, die im Term vorkommen z.B :

OK->--5+6 oder OK->5+-8

u.s.w siehe Beispiel oben. Einige Beispiele zu den Sonderfunktionen. Der sin(45) soll berechnet werden:

1.) OK->s(45) oder OK->s45 (Ergebnis in Grad)

Alle anderen Sonderfunktionen werden wie bei “sin” eingegeben, nur mit dem ersten kleinen Buchstaben.

2.) OK->c(80)OK->t(80) OK->w(6) usw.

Sonderfunktionen kombinieren

Das ist aber noch nicht alles, was das Programm kann! Alle Sonderfunktionen können natürlich auch beliebig miteinander kombiniert werden:

z.B: OK->a(c(45)A2+s(45)A2) usw.

Der Interpreter prüft, ob ein Term richtig eingegeben ist, indem er einen kompletten “Syntax-Check” durchführt. Auftretende Fehler werden größtenteils abgefangen.

z.B: OK->-*+ oder OK->1/0 oder OK->((((((((1+6) usw.

Es können auch Variabeln definiert werden, und zwar alle GROSSBUCHSTABEN von A-Z, das sieht dann so aus :

OK->A=5 oder OK->D=s(7)+5*9 oder OK->L=d(7) usw.

Eine weitere Attraktion weist der Parser auf: Er ist in der Lage, einfache komplexe Zahlen zu verarbeiten. Es ist möglich, eine negative Wurzel oder einen negativen Logarithmus zu berechnen.

Beispiel: es soll die 2.te Wurzel aus (-8) berechnet werden

OK->w(-8) oder OK->(-8)^(1/2) oder OK->-8^(1/2)

Es erscheint eine komplexe Lösung, die aus einer imaginären und reellen Lösung besteht. Es soll eine 8. Wurzel aus einer negativen Zahl berechnet werden.

Das sieht dann so aus: OK->(-5)^(1/8) usw.

Es können alle negativen Zahlen mit allen Elementen der natürlichen Zahlen potenziert werden: Vorsicht: den Exponenten nicht als Dezimalzahl schreiben, (-8)^(0.5) z.B. führt zum Überlauf!

OK->(-21)^(5/16) usw.

Eine Logarithmierung einer negativen Zahl ist ebenfalls möglich, das sieht dann so aus:

OK->l(-9) oder OK-> d (-9) oder OK->d-9.

Klammern sind in diesem Fall auch nicht nötig. Es erscheinen komplexe Lösungen von zl -zn, die aus imaginären und reellen Lösungen bestehen. Ich hoffe, daß einige Anwender dieses Programm verwerten können. Mit einem kleinen Tip möchte ich diese Dokumentation zu meinem Programm schließen: Der Parser-Interpreter macht sich gut in einem Tabellenkalkulations-Programm!

' ----------------------------------------------
' Parse Interpreter written by P.S. Bauer, 
' Romberstr.8 , 5000 Köln 41 
' Version 4.00 08.05.89
' (c) MAXON Computer GmbH
' ----------------------------------------------
DIM var$(60)
SETCOLOR 0,0
DO                      ! Menu Steuerung
    @text
    v=INP(2)            ! Tastaturklick
    IF v=27             ! ESC Taste
        SETCOLOR 0,1 
        END 
    ENDIF
    CLS                 ! Bild Löschen
    DO
        ADD pose,3      ! Icon Lage OK=>
        IF pose>=24     ! Letzte Zeile
            pose=3      ! 3 Addieren (Zeile+3)
            CLS         ! Bild Löschen
            IF LEN(re$)>0
                PRINT AT (1,2+pose); ! Icon setzen
                PRINT "OK >"
                PRINT AT(5,2+pose);unt$ ! Term
                PRINT re$               ! Ergebnis falls schon vorhanden
                pose=pose+3
            ENDIF
        ENDIF
        @eingabe            ! Zur Hauptschleife
        EXIT IF ASC(re$)=27 ! Esc
    LOOP
    CLR re$ ! Ergebnis Löschen
    pose=0 ! zeile =0
    CLS 
LOOP
PROCEDURE eingabe ! Hauptprozedur
    GRAPHMODE 4 
    DEFTEXT 1,0,0,13
    TEXT 5,15,"       Bitte Term Eingeben       "
    TEXT 5,31,"          mit Esc zurück         "
    GRAPHMODE 0 
    ERASE sx$()
    DIM sx$(80)         !Feld vorbereiten
    nrt:
    DEFFILL 1,2,8       ! Daten für falsche Syntax
    tabe%=0             ! Syntax Flag=0 
    sqo:
    DATA "*)","(*","(/","(^","()","**","//","ss","ww","cc","tt","^^","sw","tw","cw"
    DATA "/)","^)","/)","s)","w)","c)","t)","+)", "-)","..",".)","(.",".(",")."
    DATA "-.","./","s.",".s","w.",".c",".t","w.","c.","t.","+.","*.","/.","^.",".^"
    DATA ".-",".+",".*","./","a)","i)",".a",".i",")a",")i","ia","is","ic","it","iw"
    DATA "aa","ii","sa","ca","ta","wa","i+","i-","i*","i^","i/","a-","a+","a*","a/","a^"
    DATA "d*","d/","d)",".d","d.",")d","di","da","ds","dc","dt","dw","d^"
    DATA "l+","l*","l/","l)",".l","l.",")l","li","la","ls","lc","lt","lw"
    DATA "1^","ld","/*","/^"
    PRINT AT(1,2+pose); ! Icon positonieren
    PRINT "OK >"
    PRINT AT(5,2+pose);
    FORM INPUT 40,re$   ! Term Eingeben
    unt$=re$            ! Unt$=term
    IF INSTR(1,re$,"=")>0 ! Variablen Untersuchen 
        IF LEN(re$)>=1 AND ASC(re$)<65 OR ASC(re$)>90 
            tabe%=1
        ENDIF               ! Var zuordnen?
        lio%=INSTR(1,re$,)+1
        IF INSTR(1,re$,"=")>0 AND ASC(re$)>=65 AND ASC(re$)<=90 
            IF LEN(STR$(VAL(MID$(re$,lio%,LEN(re$)))))=LEN(MID$(re$,lio%,LEN(re$))) AND VAL(MID$(re$,lio%,LEN(re$)))>0 
                @variable
                re$=MID$(re$,lio%,LEN(re$)) ! String erneuern
            ELSE
                varflag%=1 ! Variable Flag Setzen
                varterm$=MID$(re$,0,lio%-1) ! Termvariable Bestimmen 
                re$=MID$(re$,lio%,LEN(re$)) ! Term Retten wenn Var Vorhanden
            ENDIF 
        ELSE
            tabe%=1     ! Oh oh Fehler
        ENDIF 
    ENDIF
    IF ASC(re$)<>27     ! ESC untersuchen
        IF LEN(re$)>0   ! Exp und E unterschieden
            CLR anzklam%,anzklam2%
            IF INSTR(0,re$,"E")>0
                exop$=MID$(re$,INSTR(0,re$,"E")-1,1)
            ENDIF
            FOR varwo%=1 TO LEN(re$)
                FOR wova%=ASC("A")-65 TO ASC("Z")-65 
                    obvar%=INSTR(varwo%,re$,CHR$(wova%+65)) !wo ist eine variable ?
                    IF INSTR(0,re$,"E")>0 AND ASC(exop$)>ASC("0") AND ASC(exop$)<=ASC("9") 
                        obvar%=0 
                    ENDIF
                    IF obvar%>0     ! Wert in Var einsetzen 
                        re$=MID$(re$,0,obvar%-1)+var$(wova%)+MID$(re$,obvar%+1,LEN(re$))
                    ENDIF 
                NEXT wova%
            NEXT varwo%
            CLR lop$
            pei%=INSTR(wobin%,re$,"pi") !wo ist pi ?
            IF pei%>0
                re$=MID$(re$,0,pei%-1)+STR$(PI)+MID$(re$,pei%+2,LEN(re$))
            ENDIF
            expo%=INSTR(wobin%,re$,"e") ! wo ist e
            IF expo%>0
                re$=MID$(re$,0,expo%-1)+STR$(EXP(1))+MID$(re$,expo%+1,LEN(re$))
            ENDIF
            IF INSTR(1,re$," ") >0 ! Leerstellen suchen 
                FOR spce%=1 TO LEN(re$) 
                    ase$=MID$(re$,spce%, 1)
                    IF ase$<>CHR$(32) ! selbe entfernen
                        f$=f$+ase$
                    ENDIF 
                NEXT spce% 
                re$=f$
            ENDIF
            FOR synklam%=0 TO LEN(re$)  ! Anzahl Klammern Überprüfen 
                IF MID$(re$,synklam%+1,1)="("           !(
                    ADD anzklam%,1  !( ist gefunden
                ENDIF
                IF MID$(re$,LEN(re$)-synklam%,1)=")"    !)
                    ADD anzklam2%,1 !) ist gefunden
                ENDIF 
            NEXT synklam%
            IF anzklam%<>anzklam2%  ! Klammer vergessen ?
                tabe%=1             ! Syntax Flag=1
            ENDIF
            IF LEN(re$)>0           ! Syntax prüfen
                FOR pol%=1 TO LEN(re$)
                    polx%=ASC(MID$(re$,pol%,1))     ! String aufspalten 
                    IF polx%>57 OR polx%<=36 AND polx%<>94 AND polx%<>46 AND polx%<>115 AND polx%<>99 AND polx%<>116 AND polx%<>119 AND polx%<>105 AND polx%<>97 AND polx%<>100 AND polx%<>108 AND polx%<>69 
                        tabe%=1     ! Syntaxfehler Flag=1
                    ENDIF
                    EXIT IF polx%>57 OR polx%<=36 AND polx%<>94 AND polx%<>46 AND polx%<>115 AND polx%<>99 AND polx%Oll6 AND polx%<>119 AND polx%<>105 AND polx%<>97 AND polx%<>100 AND polx%<>108 AND polx%<>69 
                NEXT pol%
                RESTORE sqo
                FOR g=0 TO 107          ! Syntaxdata Einlesen
                    READ syntax$
                    IF INSTR(1,re$,syntax$)>0 
                        IF syntax$<>"/0"
                            tabe%=1     ! Falls Fehler Syntax Flag=1 
                        ENDIF 
                    ENDIF
                    EXIT IF INSTR(1,re$,syntax$)>0 
                NEXT g
                IF tabe%=1              ! Syntax Anzeigen
                    PRINT "Syntax Fehler "
                    ADD pose,3          ! nächste Position
                    GOTO nrt            ! Neu eingeben
                ENDIF 
                @fidel
                IF INSTR(1,re$,")")>0 AND INSTR(1,re$,"(")>0 ! Klammer erkennen
                    hint%=LEN(re$) 
                    c$=re$
                    DO
                        IF INSTR(1,C$,"(")>0 AND INSTR(1,C$, ")")>0 ! Klammer auswerten 
                            suche%=LEN(c$)
                            DO          ! Klammer von Innen nach Aussen
                                SUB suche%,1
                                hint%=INSTR(suche%,c$,"(")
                                EXIT IF hint%>0 
                            LOOP
                            CLR suche%
                            tor%=INSTR(hint%+1,c$,")")  ! ) Entfernen
                            re$=MID$(c$,hint%+1,tor%) 
                            tor2%=INSTR(1,re$,")")      ! ( Entfernen
                            re$=MID$(re$,1,tor2%-1)     ! String ohne ()
                        ENDIF
                        @fidel
                        @num
                        c$=MID$(c$,0,hint%-1)+SPACE$(LEN(re$))+MID$(c$,tor%+1,LEN(c$))
                        MID$(c$,hint%,LEN(re$))=re$     ! String zusammenbauen 
                        EXIT IF INSTR(1,C$,")")=0 AND INSTR(1,C$,"(")=0
                    LOOP
                    re$=c$      !String retten
                ENDIF 
                @fidel 
                @num
                DEFFILL 1,2,8
                IF varflag%=1   ! Termflag abfrage
                    var$(ASC(varterm$)-65)=re$ ! Termvar setzen 
                    varflag%=0  ! Flag auf Null
                ENDIF
                IF nuuld%=0 AND llog%=0
                    PRINT re$   ! und ausgeben
                ENDIF
                CLR nuuld%,llog%
            ENDIF
        ENDIF
    ENDIF
    DEFFILL 1,2,8
    CLR sc$,rb$
    ERASE sx$()
RETURN
PROCEDURE num               ! Hier werden die Rechnungen ausgeführt
    tabe%=0
    DO
        EXIT IF INSTR(1,re$,"i")=0 ! Integer
        ADD w,1
        IF sx$(w)="i"       ! ist i dabei
            eg=LEN(sx$(w+1))
            isr=INSTR(1,re$,"i") ! wo ist i
            we=1+LEN(sx$(w+1))
            sx$(w-1)=STR$(INT(VAL(sx$(w+1)))) ! Ausführen
            @ordner 
            @fidel 
            CLR w 
        ENDIF 
    LOOP 
    DO
        EXIT IF INSTR(1,re$,"a")=0 ! Absolut
        ADD w,1
        IF sx$(w)="a" ! ist a dabei
            eg=LEN(sx$(w+1))
            isr=INSTR(1,re$,"a") ! wo ist i
            we=1+LEN(sx$(w+1))
            sx$(w-1)=STR$(ABS(VAL(sx$(w+1)))) ! Ausführen
            @ordner 
            @fidel 
            CLR w 
        ENDIF 
    LOOP 
    DO
        EXIT IF INSTR(1,re$,"1")=0 ! Logarithmus e
        ADD w,1 
        IF sx$(w)="l"
            eg=LEN(sx$(w+1)) 
            isr=INSTR(1,re$,"1") 
            we=1+LEN(sx$(w+1))
            IF VAL(sx$(w+1))<=0 
                nulllog%=l 
                @komplex 
            ELSE
                sx$(w-1)=STR$(LOG(VAL(sx$(w+1))))
                @ordner 
                @fidel 
            ENDIF 
            CLR w 
        ENDIF
        EXIT IF nulllog%=1 
    LOOP
    CLR nulllog%
    DO
        EXIT IF INSTR(1,re$,"d")=0 ! Logaritmus 10
        ADD w,1 
        IF sx$(w)="d"
            eg=LEN(sx$(w+1)) 
            isr=INSTR(1,re$, "d") 
            we=1+LEN(sx$(w+1))
            IF VAL(sx$(w+1))<=0 
                nulllog%=1 
                @komplex 
            ELSE
                sx$(w-1)=STR$(LOG10(VAL(sx$(w+1)))) 
                @ordner 
                @fidel 
            ENDIF 
            CLR w 
        ENDIF
        EXIT IF nulllog%=1 
    LOOP
    CLR nulllog%
    DO
        EXIT IF INSTR(1,re$,"s")=0 ! Sinus
        ADD w,1 
        IF sx$(w)="s"
            eg=LEN(sx$(w+1)) 
            isr=INSTR(1,re$,"s") 
            we=1+LEN(sx$(w+1))
            sx$(w-1)=STR$(SIN(VAL(sx$(w+1))*PI/180))
            @ordner
            @fidel
            CLR w
        ENDIF 
    LOOP
    DO
        EXIT IF INSTR(1,re$,"c")=0 ! Cosinus
        ADD w,1 
        IF sx$(w)="c"
            eg=LEN(sx$(w+1)) 
            isr=INSTR(1,re$,"c") 
            we=1+LEN(sx$(w+1))
            sx$(w-1)=STR$(COS(VAL(sx$(w+1))+PI/180)) 
            @ordner 
            @fidel 
            CLR w 
        ENDIF 
    LOOP 
    DO
        EXIT IF INSTR(1,re$,"t")=0 ! Tangens
        ADD w,1 
        IF sx$(w)="t"
            eg=LEN(sx$(w+1)) 
            isr=INSTR(1,re$,"t") 
            we=1+LEN(sx$(w+1))
            sx$(w-1)=STR$(TAN(VAL(sx$(w+1))+PI/180)) 
            @ordner 
            @fidel 
            CLR w 
        ENDIF 
    LOOP 
    DO
        EXIT IF INSTR(1,re$,"w")=0 ! Wurzelziehen
        ADD w,1 
        IF sx$(w)="w"
            eg=LEN(sx$(w+1)) 
            isr=INSTR(1,re$,"w") 
            we=1+LEN(sx$(w+1))
            IF VAL(sx$(w+1))<0 
                nullsqr%=1 
                wa%=2 
                @komplex 
            ELSE
                sx$(w-1)=STR$(SQR(VAL(sx$(w+1)))) 
                @ordner 
                @fidel 
            ENDIF 
            CLR w 
        ENDIF
        EXIT IF nullsqr%=1 
    LOOP
    CLR nullsqr%
    DO
        EXIT IF INSTR(1,re$,"1")=0 ! Potenzieren
        ADD w,1 
        IF sx$(w)="1"
            ad=LEN(sx$(w-1))
            eg=LEN(sx$(w+1))
            isr=INSTR(1,re$,"^")
            we=LEN(sx$(w-1))+1+LEN(sx$(w+1))
            minus%=0
            IF VAL(sx$(w-1))<0 AND INT(VAL(sx$(w+1)))<>VAL(sx$(w+1))
                nullsq2%=1
                wa%=anzzeig%
                @komplex
            ELSE
                IF VAL(sx$(w-1))<0 AND tor2%=0  ! negativ erkennen
                    minus%=1
                    sx$(w-1)=STR$(VAL(sx$(w-1))*-1)
                ENDIF
                sx$(w-1)=STR$(VAL(sx$(w-1))^(VAL(sx$(w+1))))
                IF minus%=1
                    sx$(w-1)=STR$(VAL(sx$(w-1))*-1)
                ENDIF 
                @ordner 
                @fidel 
            ENDIF 
            CLR w 
        ENDIF
        EXIT IF nullsq2%=1 
    LOOP
    CLR nullsq2%
    DO
        EXIT IF INSTR(1,re$,"/")=0  ! Teilen
        ADD w,1 
        IF sx$(w)="/"
            ad=LEN(sx$(w-1))
            eg=LEN(sx$(w+1))
            isr=INSTR(1,re$,"/")
            we=LEN(sx$(w-1))+1+LEN(sx$(w+1))
            IF VAL(sx$(w+1))<>0
                anzzeig%=VAL(sx$(w+1))
                sx$(w-1)=STR$(VAL(sx$(w-1))/(VAL(sx$(w+1))))
                @ordner 
                @fidel 
            ELSE
                GOSUB null 
            ENDIF 
            CLR w 
        ENDIF
        EXIT IF nulldiv%=1 
    LOOP
    CLR nulldiv%
    DO
        EXIT IF INSTR(1,re$,"*")=0 ! Multiplizieren
        ADD w,1 
        IF sx$(w)="*"
            ad=LEN(sx$(w-1))
            eg=LEN(sx$(w+1))
            isr=INSTR(1,re$,"*")
            we=LEN(sx$(w-1))+1+LEN(sx$(w+1))
            sx$(w-1)=STR$(VAL(sx$(w-1))*(VAL(sx$(w+1))))
            @ordner 
            @fidel 
            CLR w 
        ENDIF 
    LOOP 
    DO
        EXIT IF INSTR(1,re$,"-")=0  ! Subtrahieren
        EXIT IF INSTR(1,rb$,"-")=() ! Negation ?
        ADD w,1 
        IF sx$(w)="-"
            ad=LEN(sx$(w-1)) 
            eg=LEN(sx$(w+1)) 
            isr=INSTR(1,rb$,"-")
            IF VAL(sx$(w-1))<0 
                ADD isr,1 
            ENDIF
            we=LEN(sx$(w-1))+1+LEN(sx$(w+1))
            sx$(w-1)=STR$(VAL(sx$(w-1))-(VAL(sx$(w+1))))
            @ordner 
            @fidel 
            CLR w 
        ENDIF 
    LOOP 
    DO
        EXIT IF INSTR(1,re$,"+")=0 ! Addieren
        EXIT IF INSTR(1,rb$,"+")=0 ! positiv ?
        ADD w,1 
        IF sx$(w)="+"
            ad=LEN(sx$(w-1)) 
            eg=LEN(sx$(w+1)) 
            isr=INSTR(1,rb$ , "+")
            IF VAL(sx$(w-1))<0 
                ADD isr,1 
            ENDIF
            we=LEN(sx$(w-1))+1+LEN(sx$(w+1))
            sx$(w-1)=STR$(VAL(sx$(w-1))+(VAL(sx$(w+1))))
            @ordner 
            @fidel 
            CLR w 
        ENDIF 
    LOOP 
RETURN
PROCEDURE null 
    nulldiv%=1
    PRINT "Division durch Null " 
    nuuld%=1 
RETURN
PROCEDURE ordner ! String wieder zusammenbauen 
    leh=LEN(sx$(w-1))
    re$=MID$(re$,0,(isr-ad-1))+SPACE$(leh)+MID$(re$,isr+eg+1,LEN(re$))
    MID$(re$,(isr-ad),leh)=sx$(w-1)
    CLR ad 
RETURN
PROCEDURE fidel ! Zahlen und Rechenoperationen trennen
    CLR rb$
    DO
        ADD s,1
        anf$=MID$(re$,s,1)
        EXIT IF LEN(anf$)<=0 
        ADD e,1
        syn%=ASC(MID$(re$,s,1))
        IF MID$(re$,s,1)="-"     ! Negation Erkenntnisse 
            sn1%=ASC(MID$(re$,s-1,1))
            IF sn1%<=45 OR sn1%=47 OR sn1%=99 OR sn1%=116 OR sn1%=115 OR sn1%=119 OR sn1%=97 OR sn1%=105 OR sn1%=100 OR sn1%=108
                syn%=48 ! Programm Syntax ?
            ENDIF 
        ENDIF
        IF syn%>47 AND syn%<>94 AND syn%<>46 AND syn%<>115 AND syn%<>99 AND syn%<>116 AND syn%<>119 AND syn%<>97 AND syn%<>105 AND syn%<>100 AND syn%<>108 
            DO
                ADD s,1
                synt%=ASC(MID$(re$,s,1))
                IF MID$(re$,s,1)="--" ! Negativ erkennen
                    sn%=ASC(MID$(re$,s-1,1))
                    IF sn%<=45 OR sn%=47 
                        synt%=48 
                    ENDIF 
                ENDIF
                IF MID$(re$,s,2)= "E+" OR MID$(re$,s,2)="E-" ! Exponent erkennen
                    expo%=1 
                    synt%=48 
                ENDIF
                EXIT IF synt%<=45 OR synt%=47 OR synt%=94 OR synt%=115 OR synt%=99 OR synt%=116 
                EXIT IF synt%=119 OR synt%=97 OR synt%=105 OR synt%=100 OR synt%=108
                IF expo%=1 ! Exponent setzten
                    anf$=anf$+MID$(re$,s, 2)    ! mit Exponent
                    ADD s,1 
                ELSE
                    anf$=anf$+MID$(re$,s,1)     ! Ohne Exponent
                ENDIF 
                expo%=0 
            LOOP 
            SUB s,1 
        ENDIF
        sx$(e)=anf$             ! Aufspalten
        as%=INSTR(1,sx$(e),"E") 
        wisch$=sx$(e)
        IF as%>0                ! Exponent ?
            MID$(wisch$,as%+1,1)="0"
        ENDIF
        IF VAL(wisch$)>=0
            rb$=rb$+wisch$      ! Hilfstring bilden
        ELSE
            IF as%>0
                wisch$=STR$(ABS(VAL(wisch$)))
                MID$(wisch$,as%,1)="0" 
                rb$=rb$+wisch$
            ELSE
                rb$=rb$+STR$(ABS(VAL(wisch$)))  ! Hilfstring fertig
            ENDIF 
        ENDIF 
        CLR anf$
    LOOP 
    CLR s,e
RETURN              ! Aufspaltung beendet
PROCEDURE text ! Info für Benutzer
    GRAPHMODE 4 
    DEFTEXT 1,0,0,13
    TEXT 150,50,"   Parse-Interpreter written by P.Bauer "
    TEXT 150,66,"   Rombergstr.8, 5000 Köln 41. Vers: 4.00 "
    GRAPHMODE 0
    TEXT 150,110,"  Folgende Rechenoperationen sind möglich:"
    TEXT 148,140,"  Standardfunktionen :"
    TEXT 148,160,"      | + | - | / | * | ^ | pi | () |”
    TEXT 148,180,” Variablen = Alle GroPbuchstaben von A->Z"
    TEXT 148,200,"            Sonderfunktionen
    TEXT 450,360," Taste Drücken !!"
    TEXT 450,376,"   Esc =End"
    RESTORE 44 
    FOR bn%=1 TO 9 
        READ hel$
        TEXT 280,210+(bn%*17),hel$
    NEXT bn%
    44:
    DATA s()=Sin(),c()=Cos(),t()=Tan(),d(+-)=Log(),l(+-)=Ln()
    DATA w(+-)=Sqr(),i()=Int(),a()=Abs(),e=Exp(1) 
RETURN
PROCEDURE variable
    vai%=INSTR(1,re$,"=")-1     !wo ist = ?
    var$(ASC(MID$(re$,0,vai%))-65)=MID$(re$,vai%+2,LEN(re$)) ! Zuweisungs var (z.B. A=)
RETURN
PROCEDURE komplex 
    DIM z(100),h(100)
    DEFNUM 5 
    IF nulllog%=1
        PRINT "z=ln(";(ABS(VAL(sx$(w+1))));")+i*(";CHR$(227);"+2*k* ";CHR$(227);")(für k ";CHR$(238);" G)" 
        llog%=1 
    ENDIF
    IF nullsqr%=1 OR nullsq2%=1 
        nuuld%=1 
        pose=pose+wa%
        FOR kom%=1 TO wa%
            IF nullsq2%=1
                a=(ABS(VAL(sx$(w-1))))^(1/wa%)
            ELSE
                a=(ABS(VAL(sx$(w+1))))^(1/wa%)
            ENDIF
            al=180/wa%
            umr=(al+(((kom%-l)*(360/wa%)))) 
            z(kom%)=a*(COS(umr*PI/180)) 
            h(kom%)=a*(SIN(umr*PI/180))
            IF ABS((z(kom%)))<1.0E-07 
                z(kom%)=0 
            ELSE
                IF ABS((h(kom%)))<1.0E-07 
                    h(kom%)=0 
                ENDIF 
            ENDIF 
            ADD pos,1
            PRINT ;"z";kom%;"= ";z(kom%)+" +";h(kom%);"*i"
        NEXT kom%
    ENDIF 
    DEFNUM 12 
    ERASE h()
    ERASE z()
RETURN

Philip S. Bauer
Aus: ST-Computer 11 / 1989, Seite 93

Links

Copyright-Bestimmungen: siehe Über diese Seite