Français
Forum

Probleme avec Matheparser (heul!)

 

Jac
de
Lad
allô Community. j'écris grad à einem Matheparser. malheureusement scheitere je à suivant Situation (Voir le texte source unten): qui Parser berechnet alles richtig, mais chez qui numéro 1087 berechnet il 7 aus dem String (probierts la fois aus!). Es muss à qui Procédure GetBefore liegen, car qui gibt comme Startbuchstaben pour qui numéro 4 zurück, devrait mais 1 zurückgeben. peux mir quelqu'un aider? (quelqu'un qui viel Zeit hat, car qui Voir le texte source ist äußerst experimentell, pas kommentiert et gibt jusqu'à maintenant Unmengen de Debug-Infos aus, vielle kanns oui la fois quelqu'un ausprobieren, Feedback, aussi Fragen, wär mir hilfreich, ichsitze maintenant nämlich déjà Stunden à dem Problem)!
KompilierenMarqueSéparation
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
Du devrait versuchen, cela Ganze avec Bleistift et papier nachzuvollziehen. SEI DER COMPUTER.

ici Dein Code avec Kommentaren et nachfolgend qui schrittweise Auflösung des Programmes (jedenfalls qui wichtigen Schritte).
KompilierenMarqueSéparation
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
Fin

et eh bien im 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 ) ** ist cela so gewollt? Val() löst faute aus et 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

Imprimer: 0.0000,345.0000=345.0000
Imprimer: Neue Teilformel: 345.0000

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

(((3+5)*2+3*345.0000+12)
....................^ ** ici fehlt maintenant une schließende Klammer
...
... usw.


Es peux naturellement son, qui je mich là verhaspelt habe. un Papiercomputer (so nennt on cet Herangehensweise) ist naturellement seulement si bien comment qui Ausführende qui Funktionen kennt.

Votre Vermutung hat sich incidemment bestätigt: größter Übeltäter ist cela GetBefore().

belle Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
09.02.2006  
 




Jac
de
Lad
Erstmal merci pour qui Mühe. avec Papiercomputern peux je irgendwie rien anfangen et je kommentiere déjà toujours mal. jusqu'à maintenant habe je mais alle Probleme lösen peut. Hm, je probiers la fois chez GetBefore avec Neq(Instr(...),0), peut-être hilft cela. je melde mich wieder!

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
eh, verdammt. Hab grad seulement trouvé...je baue erstmal alles um, quoi du déjà angekreidet la hâte. déjà pénible wieviele faute du sur einmal findest...mais ist aussi encore pas 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
eh, verdammt. Hab grad seulement trouvé...je baue erstmal alles um, quoi du déjà angekreidet la hâte. déjà pénible wieviele faute du sur einmal findest...mais ist aussi encore pas 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
allô Michael!

merci pour qui grand Aider, j'ai alle faute trouvé et qui Parser fonctionne maintenant avec den 5 Grundrechenarten (bof, 4 Grundrechenarten plus Potenz) einwandfrei. ah incidemment: qui Procédure Operator ermittelt seulement, si es sich beim übergebenen String lediglich um une numéro ou bien une Term handelt. plus pas. bof, je werde cela partie maintenant zuende entwickeln...

Hat überhaupt quelqu'un daran intérêt???

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  
 



on a alle intérêt à einer Compute-Funktion!
 
09.02.2006  
 




Jac
de
Lad
eh, hm...

bof je hab aujourd'hui l'après-midi certains Stunden tour geschrieben. seulement malheureusement c'est moi kurz vorm Ende aufgefallen, dass je negative payons gar pas betrachtet habe. alors fange je maintenant nochmal entier de vorne à! je melde mich wieder!

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  
 



répondre


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

702 Views

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

Themeninformationen

cet Thema hat 3 participant:

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


Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie