Wie kan ich eienn string ausrechenen (hört sich irgendwie komsich an)
Also so mein ich das etwa:
ergebnis=ausrechnen("10*2+9/5*3")
Ich könnte das eigentlich auch programmieren nur das is mir zuviel arbeit also gibt es da irgendwas?
Code: Alles auswählen
Procedure.l Eval(Input.s)
Dim Priority.s(20)
k = 0
*pInput.BYTE = @Input
Repeat
If *pInput\b = '('
k+1
ElseIf *pInput\b = ')'
*r.BYTE = @Priority(k)
last_op = 0
number.s = ""
lastchrnum = 1
P2_Start_Op = -1
Repeat
If *r\b >= $30 And *r\b <= $39
number + Chr(*r\b)
lastchrnum = 1
Else ;*r\b ist keine ASCII-Ziffer
last_op2 = last_op
If lastchrnum
If *r\b = '+'
If last_op > 2
If last_op = 3
P2_Result * Val(number)
ElseIf last_op = 4
P2_Result / Val(number)
EndIf
If P2_Start_Op = 0
Result = P2_Result
ElseIf P2_Start_Op = 1
Result + P2_Result
ElseIf P2_Start_Op = 2
Result - P2_Result
EndIf
P2_Start_Op = -1
EndIf
last_op = 1
ElseIf *r\b = '-'
If last_op > 2
If last_op = 3
P2_Result * Val(number)
ElseIf last_op = 4
P2_Result / Val(number)
EndIf
If P2_Start_Op = 0
Result = P2_Result
ElseIf P2_Start_Op = 1
Result + P2_Result
ElseIf P2_Start_Op = 2
Result - P2_Result
EndIf
P2_Start_Op = -1
EndIf
last_op = 2
ElseIf *r\b = '*'
If last_op < 3
P2_Start_Op = last_op
P2_Result = Val(number)
EndIf
last_op = 3
ElseIf *r\b = '/'
If last_op < 3
P2_Start_Op = last_op
P2_Result = Val(number)
EndIf
last_op = 4
EndIf
If last_op2 = 0 And last_op < 3
Result = Val(number)
ElseIf last_op2 = 1 And last_op < 3
Result + Val(number)
ElseIf last_op2 = 2 And last_op < 3
Result - Val(number)
ElseIf last_op2 = 3
P2_Result * Val(number)
ElseIf last_op2 = 4
P2_Result / Val(number)
EndIf
number = ""
ElseIf *r\b = '-'
If number = ""
number = "-"
Else
number = ""
EndIf
EndIf
lastchrnum = 0
EndIf
*r+1
Until *r\b = 0
If last_op = 0
Result = Val(number)
ElseIf last_op = 1
Result + Val(number)
ElseIf last_op = 2
Result - Val(number)
ElseIf last_op = 3
P2_Result * Val(number)
ElseIf last_op = 4
P2_Result / Val(number)
EndIf
If P2_Start_Op = 0
Result = P2_Result
ElseIf P2_Start_Op = 1
Result + P2_Result
ElseIf P2_Start_Op = 2
Result - P2_Result
EndIf
k-1
If k < 0
ProcedureReturn 0
EndIf
Priority(k)+Str(Result)
ElseIf *pInput\b = 0 ; ---ENDE vom String---
*r.BYTE = @Priority(k)
last_op = 0
number = ""
lastchrnum = 1
P2_Start_Op = -1
Repeat
If *r\b >= $30 And *r\b <= $39
number + Chr(*r\b)
lastchrnum = 1
Else ;*r\b ist keine ASCII-Ziffer
last_op2 = last_op
If lastchrnum
If *r\b = '+'
If last_op > 2
If last_op = 3
P2_Result * Val(number)
ElseIf last_op = 4
P2_Result / Val(number)
EndIf
If P2_Start_Op = 0
Result = P2_Result
ElseIf P2_Start_Op = 1
Result + P2_Result
ElseIf P2_Start_Op = 2
Result - P2_Result
EndIf
P2_Start_Op = -1
EndIf
last_op = 1
ElseIf *r\b = '-'
If last_op > 2
If last_op = 3
P2_Result * Val(number)
ElseIf last_op = 4
P2_Result / Val(number)
EndIf
If P2_Start_Op = 0
Result = P2_Result
ElseIf P2_Start_Op = 1
Result + P2_Result
ElseIf P2_Start_Op = 2
Result - P2_Result
EndIf
P2_Start_Op = -1
EndIf
last_op = 2
ElseIf *r\b = '*'
If last_op < 3
P2_Start_Op = last_op
P2_Result = Val(number)
EndIf
last_op = 3
ElseIf *r\b = '/'
If last_op < 3
P2_Start_Op = last_op
P2_Result = Val(number)
EndIf
last_op = 4
EndIf
If last_op2 = 0 And last_op < 3
Result = Val(number)
ElseIf last_op2 = 1 And last_op < 3
Result + Val(number)
ElseIf last_op2 = 2 And last_op < 3
Result - Val(number)
ElseIf last_op2 = 3
P2_Result * Val(number)
ElseIf last_op2 = 4
P2_Result / Val(number)
EndIf
number = ""
ElseIf *r\b = '-'
If number = ""
number = "-"
Else
number = ""
EndIf
EndIf
lastchrnum = 0
EndIf
*r+1
Until *r\b = 0
If last_op = 0
Result = Val(number)
ElseIf last_op = 1
Result + Val(number)
ElseIf last_op = 2
Result - Val(number)
ElseIf last_op = 3
P2_Result * Val(number)
ElseIf last_op = 4
P2_Result / Val(number)
EndIf
If P2_Start_Op = 0
Result = P2_Result
ElseIf P2_Start_Op = 1
Result + P2_Result
ElseIf P2_Start_Op = 2
Result - P2_Result
EndIf
ProcedureReturn Result
Else
Priority(k) + Chr(*pInput\b)
EndIf
*pInput+1
ForEver
EndProcedure Code: Alles auswählen
Procedure.s GetContent(String.s, Pos.l, First.b, Last.b) ;String = "dd(hallo)xyz", 3, '(', ')'
Protected Content.s, *p.BYTE, AnzKl.l
*p = @String + Pos
While *p\b
If *p\b = First
AnzKl.l + 1
ElseIf *p\b = Last
AnzKl - 1
If AnzKl <= -1
Break
EndIf
EndIf
Content + Chr(*p\b)
*p + 1
Wend
ProcedureReturn Content
EndProcedure
Procedure.s CalcBiExpression(ContL.s, Op.s, ContR.s) ; A+b oder A*b ...
Protected Result.s
Select Op
Case "*"
Result = Str(Val(ContL) * Val(ContR))
Case "/"
Result = Str(Val(ContL) / Val(ContR))
Case "+"
Result = Str(Val(ContL) + Val(ContR))
Case "-"
Result = Str(Val(ContL) - Val(ContR))
EndSelect
ProcedureReturn Result.s
EndProcedure
Procedure.s ProcessExpression(Exp.s)
Protected *p.BYTE, v.s, zw.l, ContL.s, ContR.s, Op.s, Cont.s
*p = @Exp
;/ Search for ()
While *p\b
If *p\b = '('
Cont = GetContent(Exp, *p-@Exp+1, '(', ')')
v.s = ProcessExpression(Cont)
Exp = ReplaceString(Exp, "("+Cont+")", v)
*p = @Exp
ElseIf *p\b = ')'
Debug "Fehler: Klammer nicht geöffnet!"
EndIf
*p + 1
Wend
;/ Search for * bzw. /
*p = @Exp
While *p\b
If *p\b = '*' Or *p\b = '/'
zw = *p ;Zwischenspeichern
Op = Chr(*p\b)
; Gehe zurück bis ein Operator kommt
*p - 1
ContL = ""
While *p\b <> '*' And *p\b <> '/' And *p\b <> '+' And *p\b <> '-' And *p\b
ContL = Chr(*p\b) + ContL
*p - 1
Wend
*p = zw
; Gehe vorwärts bis Operator kommt
*p + 1
ContR = ""
While *p\b <> '*' And *p\b <> '/' And *p\b <> '+' And *p\b <> '-' And *p\b
ContR = ContR + Chr(*p\b)
*p + 1
Wend
v = CalcBiExpression(ContL, Op, ContR)
Exp = ReplaceString(Exp, ContL+Op+ContR, v)
*p = @Exp
EndIf
*p + 1
Wend
;/ Search for + bzw. -
*p = @Exp
While *p\b
If *p\b = '+' Or *p\b = '-'
zw = *p ;Zwischenspeichern
Op = Chr(*p\b)
; Gehe zurück bis ein Operator kommt
*p - 1
ContL = ""
While *p\b <> '*' And *p\b <> '/' And *p\b <> '+' And *p\b <> '-' And *p\b
ContL = Chr(*p\b) + ContL
*p - 1
Wend
*p = zw
; Gehe vorwärts bis Operator kommt
*p + 1
ContR = ""
While *p\b <> '*' And *p\b <> '/' And *p\b <> '+' And *p\b <> '-' And *p\b
ContR = ContR + Chr(*p\b)
*p + 1
Wend
v = CalcBiExpression(ContL, Op, ContR)
Exp = ReplaceString(Exp, ContL+Op+ContR, v)
*p = @Exp
EndIf
*p + 1
Wend
ProcedureReturn Exp
EndProcedure
Expression.s = "(2*2)+2*(3+4*(4+1))*2"
Expression = RemoveString(Expression, " ") ;im Parser
Res.s = ProcessExpression(Expression)
Debug "############# RESULTAT #############"
Debug Res
In diesem zusamenhang ist das das hier:http://de.wikipedia.org/wiki/Affix#Affi ... MathematikWas ist Infix und Postfix?