Español
Foro

Problemas con Matheparser (heul!)

 

Jac
de
Lad
¡Hola Comunidad. Yo escribir grad a una Matheparser. Leider scheitere Yo a folgender Situation (Ver código fuente unten): Der Parser berechnet alles correcto, pero en el Zahl 1087 berechnet él 7 de el String (probierts veces de!). Lo muss a el Procedimiento GetBefore mentira, porque el son como Startbuchstaben para el Zahl 4 zurück, debería aber 1 zurückgeben. Kann me alguien helfen? (Alguien el viel Tiempo ha, porque el Ver código fuente es äußerst experimentell, no kommentiert y son a ahora Unmengen de Debug-Infos de, vielle kanns sí veces alguien ausprobieren, Feedback, auch Fragen, wär me hilfreich, ichsitze ahora nämlich ya Stunden a el Problema)!
KompilierenMarcaSeparación
declare y1%,y2%

proc Operator

    Parameters f$
    declare a%

    whileloop 5

        if Instr(Mid$("+-*/^",&Loop,1),f$)

            inc a%
            Break

        endif

    wend

    Return a%

endproc

proc GetBefore

    Parameters b$,r%
    Print "Durchsuche ",b$
    y1%=r%-1

    while And(InStr(Mid$(b$,y1%,1),".9876543210"),GT(y1%,1))

        Dec y1%

    wend

    Return Val(Mid$(b$,y1%,2))

endproc

proc GetAfter

    Parameters b$,r%
    y2%=r%+1

    while Instr(Mid$(b$,y2%,1),".9876543210")

        Inc y2%

    wend

    Return Val(Mid$(b$,r%+1,y2%-r%))

endproc

proc Parse

    Parameters fx$
    declare z$,y$,d%,c%,x$,xl%,erg$,a%,erg!,x1!,x2!,in%
    fx$=Translate$(Translate$(Translate$(Translate$(Translate$(Translate$(fx$,",","."),"{","("),"[","("),"}",")"),"]",")")," ","")
    Print "Optimierte Formel: "+fx$
    Noch abfragen ob Anz("(")=Anz(")")!!!

    while Instr("(",fx$)

        d%=Len(fx$)

        while Neq$("(",Mid$(fx$,d%,1))

            Dec d%

        wend

        x$=Right$(fx$,Len(fx$)-d%)
        x$=Left$(x$,Instr(")",x$))
        xl%=Len(x$)
        x$=Del$(x$,Len(x$),1)

        if Operator(x$)

            Print "Parse "+x$+"..."

            whileloop 5

                in%=Instr(Mid$("^*/+-",&Loop,1),x$)
                c%=&Loop

                while in%

                    a%=in%
                    x1!=GetBefore(x$,a%)
                    x2!=GetAfter(x$,a%)

                    if Equ(c%,1)

                        Print "Potenz"
                        erg!=x1!^x2!

                    elseif Equ(c%,2)

                        Print "Mal"
                        erg!=x1!*x2!

                    elseif Equ(c%,3)

                        Print "Durch"
                        erg!=x1!/x2!

                    elseif Equ(c%,4)

                        Print "Plus"
                        erg!=x1!+x2!

                    else

                        Print "Minus"
                        erg!=x1!-x2!

                    endif

                    y$=Del$(x$,1,y2%-1)
                    z$=If(Equ(y1%,1),"",Left$(x$,y1%-1))
                    x$=z$+Str$(erg!)+y$
                    Print Str$(x1!)+","+Str$(x2!)+"="+Str$(erg!)
                    Print "Neue Teilformel: "+x$
                    in%=Instr(Mid$("^*/+-",c%,1),x$)
                    waitinput

                wend

            wend

        endif

        fx$=Left$(fx$,d%-1)+Str$(erg!)+Right$(fx$,Len(fx$)-d%-xl%)
        Print "Neue Formel: "+fx$

    wend

    Return fx$

endproc

declare s$
cls
s$="(((3+5)*2+3*(12+345))+12)"
Print "Formel: "+s$
Print "Ergebnis: "+Parse(s$)
waitinput

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
08.02.2006  
 




Michael
Wodrich
Usted debe versuchen, el Ganze con Bleistift y Papier nachzuvollziehen. SEI DER COMPUTER.

Hier Su Code con Kommentaren y nachfolgend el schrittweise Auflösung des Programmes (jedenfalls el wichtigen Schritte).
KompilierenMarcaSeparación
Declare Y1%,Y2%

Proc Operator

    Parameters F$
    Declare A%

    Whileloop 5

        If Instr(Mid$("+-*/^",&Loop,1),F$)

            Inc A%
            Break

        Endif

    Wend

    Return A%
    *** zeigt, wieviele unterschiedliche Operatoren vorhanden sind
    *** ermittelt aber nicht, wieviele Operatoren insgesamt da sind
    *** (jeder Operator wird nur einmal (als erstes Vorkommen) gezählt

Endproc

Proc Getbefore

    Parameters B$,R%
    Print "Durchsuche ",B$
    Y1% = R% - 1

    While And(Instr(Mid$(B$,Y1%,1),".9876543210"),Gt(Y1%,1))

        *** Abbruchbedingung "Y1% > 1" sollte VOR "Mid$(..,Y1%,..)" stehen.
        *** (auch der Eintritt in die Schleife muß beachtet werden: was, wenn Y1% = 0 am Anfang)
        Dec Y1%

    Wend

    Return Val(Mid$(B$,Y1%,2))
    *** FEHLER: die Länge von Mid$ steht fest auf 2
    *** Außderdem wird Y1% auf ein Zeichen vor der ersten Ziffer oder auf Pos.1 stehen

Endproc

Proc Getafter

    Parameters B$,R%
    Y2% = R% + 1

    While Instr(Mid$(B$,Y2%,1),".9876543210")

        *** Ein String ist irgendwann mal zu Ende: ABFANGEN (B$)
        *** (Microsoft patcht immer noch an seinen programmierten Pufferüberläufen herum.)
        *** (Das hätten sie sich gespart, wenn sie immer alle Sonderfälle abgefangen hätten.)
        Inc Y2%

    Wend

    Return Val(Mid$(B$,R%+1,Y2%-R%))
    *** Probe:
    *** B$ = "(12+345"
    *** R% = 4
    *** Y2% = 8
    *** Val( Mid$("(12+345",5,4) ) == 345 ** ABER: es wurde 1 Stelle zuviel berechnet (4)

Endproc

Proc Parse

    Parameters Fx$
    Declare Z$,Y$,D%,C%,X$,Xl%,Erg$,A%,Erg!,X1!,X2!,In%
    *** die folgenden Translates sehen bei mir wunderschön eingerückt aus
    *** und die Parameter dann wieder ausgerückt - war sehr übersichtlich  ;-(
    Fx$ = Translate$(
    Translate$(
    Translate$(
    Translate$(
    Translate$(
    Translate$(Fx$,",","."),   wandle Komma in Punkt
    "{","("),   wandle geschweifte Klammer in runde K.
    "[","("),   wandle eckige K. in runde K.
    "}",")"),   wandle geschweifte Klammer in runde K.
    "]",")"),   wandle eckige K. in runde K.
    " ","")  entferne alle Leerzeichen
    Print "Optimierte Formel: "+Fx$
    Noch abfragen ob Anz("(")=Anz(")")!!!
    ***   If NEq(
    ***          ( Len(Fx$) - Len(Translate$(Fx$,"(","")) ),
    ***          ( Len(Fx$) - Len(Translate$(Fx$,")","")) )
    ***         )
    ***     Teletubby_Modus(ein)
    ***       say "ohh-ohhh"
    ***     Teletubby_Modus(aus)
    ***   EndIf

    While Instr("(",Fx$)

        *** ohne Klammern macht der Parser dicke Backen...
        D% = Len(Fx$)

        While Neq$("(",Mid$(Fx$,D%,1))

            Dec D%

        Wend

        X$ = Right$(Fx$,Len(Fx$)-D%)
        X$ = Left$(X$,Instr(")",X$))
        Xl% = Len(X$)
        X$ = Del$(X$,Len(X$),1)

        If Operator(X$)

            Print "Parse "+X$+"..."

            Whileloop 5

                In%=Instr(Mid$("^*/+-",&Loop,1),X$)
                C%=&Loop

                While In%

                    A% = In%
                    X1! = Getbefore(X$,A%)
                    X2! = Getafter(X$,A%)

                    If Equ(C%,1)

                        Print "Potenz"
                        Erg! = X1! ^ X2!

                    Elseif Equ(C%,2)

                        Print "Mal"
                        Erg! = X1! * X2!

                    Elseif Equ(C%,3)

                        Print "Durch"
                        Erg! = X1! / X2!

                    Elseif Equ(C%,4)

                        Print "Plus"
                        Erg! = X1! + X2!

                    Else

                        Print "Minus"
                        Erg! = X1! - X2!

                    Endif

                    Y$ = Del$(X$,1,Y2%-1)
                    Z$ = If(Equ(Y1%,1),"",Left$(X$,Y1%-1))
                    X$ = Z$ + Str$(Erg!) + Y$
                    Print Str$(X1!) + "," + Str$(X2!) + "=" + Str$(Erg!)
                    Print "Neue Teilformel: "+X$
                    In% = Instr(Mid$("^*/+-",C%,1),X$)
                    Waitinput

                Wend

            Wend

        Endif

        Fx$ = Left$(Fx$,D%-1) + Str$(Erg!) + Right$(Fx$,Len(Fx$)-D%-Xl%)
        Print "Neue Formel: "+Fx$

    Wend

    Return Fx$

Endproc

Declare S$
Cls
S$ = "(((3+5)*2+3*(12+345))+12)"
Print "Formel: "+S$
Print "Ergebnis: "+Parsepan>S$)
Waitinput
End

Und nun en el Pseudo-Code nachvollziehen:

Fx$ = (((3+5)*2+3*(12+345))+12)

(((3+5)*2+3*(12+345))+12)
........................^
D% = 25

(((3+5)*2+3*(12+345))+12)
............^
D% = 13

X$ = (12+345))+12)
X$ = (12+345)
X1% = 8
X$ = (12+345
A% = 4

X1! = GetBefore( (12+345, 4 ) ** es el así gewollt? Val() löst Fehler de y liefert 0
Y1% = 1
X1! = 0.0

X2! = GetAfter( (12+345, 4 )
Y2% = 8
X2! = 345.0
Erg! = 345.0

Y$ =
Z$ =
X$ = 345.0000

Imprimir: 0.0000,345.0000=345.0000
Imprimir: Neue Teilformel: 345.0000

Fx$ = (((3+5)*2+3*345.0000+12)
Imprimir: Neue Formel: (((3+5)*2+3*345.0000+12)

(((3+5)*2+3*345.0000+12)
....................^ ** hier fehlt ahora una schließende Klammer
...
... usw.


Lo kann natürlich ser, Yo mich como verhaspelt habe. Ein Papiercomputer (así llamado esta Herangehensweise) es natürlich sólo tan bueno como el Ausführende el Características sabe.

Su Vermutung ha se de paso bestätigt: größter Übeltäter es el GetBefore().

Schöne Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
09.02.2006  
 




Jac
de
Lad
Erstmal danke para el Mühe. Mit Papiercomputern kann Yo irgendwie nichts anfangen y yo kommentiere ya siempre schlecht. Bis ahora Yo aber todos Problemas lösen puede. Hm, Yo probiers veces en GetBefore con Neq(Instr(...),0), tal vez hilft el. Yo melde mich otra vez!

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
09.02.2006  
 




Jac
de
Lad
Oh, verdammt. Hab grad sólo gefunden...Yo baue primero alles en, qué du ya angekreidet hast. Schon peinlich wieviele Fehler du en una vez findest...aber es auch todavía no fertig!

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
09.02.2006  
 




Jac
de
Lad
Oh, verdammt. Hab grad sólo gefunden...Yo baue primero alles en, qué du ya angekreidet hast. Schon peinlich wieviele Fehler du en una vez findest...aber es auch todavía no fertig!

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
09.02.2006  
 




Jac
de
Lad
¡Hola Michael!

Gracias para el große Ayuda, Yo todos Fehler gefunden y Parser se ejecuta ahora con el 5 Grundrechenarten (naja, 4 Grundrechenarten plus Potenz) einwandfrei. Ach de paso: El Procedimiento Operator ermittelt sólo, si se beim übergebenen String lediglich una Zahl oder una Term es. Más no. Naja, Yo voluntad el Teil ahora zuende entwickeln...

Sombrero überhaupt alguien daran Interesse???

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
09.02.2006  
 



Wir haben todos Interesse a uno Compute-Función!
 
09.02.2006  
 




Jac
de
Lad
Oh, hm...

Naja Yo tener heute nachmittag etliche Stunden dran geschrieben. Nur desafortunadamente me está kurz vorm Ende aufgefallen, dass Yo negative Pagar nada betrachtet habe. Also fange Yo ahora otra vez bastante de vorne a! Yo melde mich otra vez!

Jac
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
09.02.2006  
 



Respuesta


Título del Tema, max. 100 Signo.
 

Systemprofile:

Kein Systemprofil creado. [anlegen]

XProfan:

 Contribución  Font  Smilies  ▼ 

Bitte registro en una Contribución a verfassen.
 

Tema opciones

627 Views

Untitledvor 0 min.
RudiB.15.04.2020
Peter Max Müller18.05.2018
Michael W.23.12.2016
Julian Schmidt11.09.2012

Themeninformationen

Dieses Thema ha 3 subscriber:

Jac de Lad (6x)
iF (1x)
Michael Wodrich (1x)


Admins  |  AGB  |  Applications  |  Autores  |  Chat  |  Política de Privacidad  |  Descargar  |  Entrance  |  Ayuda  |  Merchantportal  |  Pie de imprenta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Juegos  |  Búsqueda  |  Support

Ein Projekt aller XProfan, el lo son!


Mi XProfan
Privado Noticias
Eigenes Ablageforum
Temas-Merkliste
Eigene Beiträge
Eigene Temas
Zwischenablage
Cancelar
 Deutsch English Français Español Italia
Traducciones

Política de Privacidad


Wir uso Cookies sólo como Session-Cookies wegen el technischen Notwendigkeit y en uns hay no Cookies de Drittanbietern.

Wenn du hier en unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung de Informationen en unseren Cookies en XProfan.Net a.

Weitere Informationen a unseren Cookies y dazu, como du el Kontrolle darüber behältst, findest du en unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Yo möchte no Cookie