Foro | | | | 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óndeclare 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ónDeclare 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! |
| | | | |
| | 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 ▲ |
| |
|
RespuestaThemeninformationenDieses Thema ha 3 subscriber: |