MathToString$(...) -> Bugfixed Nr. 2! von ???
Hi.

Hier sind zunächst mal die Features aufgelistet:

- Braucht weder DIM, Type noch sonst was. Abgesehen von Local, dass man sich aber wahrscheinlich auch schenken kann.
- Punkt vor Strich Regel wird beachtet.
- Klammer Regel wird beachtet.
- Syntax Prüfung und bei fehler "SYNTAX ERROR!!!" ausgabe.

@bruZard: Gestern im Chat hattest du behauptet, dass das ohne Types ect. nicht ginge. Aha. DC sagte dann warum ich es nit machen könne. Nun denn. Dein Problem ist jetzt nur, dass ich so eine MathToString Funktion habe, und zwar ohne die benutzung von Types ect. Wenn ich sage, dass was geht, dann geht es gefälligst! Ich hoffe, dass du das jetzt verstanden hast.

Und wenn du jetzt mit dem Spruch kommts, dass du es längst probiert hättest: Dieser zieht nicht. Denn du hättest ja nie im Leben etwas getestet, wo du schon wusstest das es nicht ginge, oder? (siehe oben)

[code:1:1048df0547]; Written by ShadowTurtle aka KHP - 03. 05. 2002

Print "Term Emu. : 10+5 = " + MathToString$("10+5")
Print "BB Term : 10+5 = " + (10+5)
Print
Print "Term Emu. : 10-((1+(1-2))-1) = " + MathToString$("10-((1+(1-2))-1)")
Print "BB Term : 10-((1+(1-2))-1) = " + (10-((1+(1-2))-1))
Print
Print "Term Emu. : 5*3*(2+5)*3 = " + MathToString$("5*3*(2+5)*3")
Print "BB Term : 5*3*(2+5)*3 = " + (5*3*(2+5)*3)
Print
Print "Term Emu. : 2+(10+(10)*-1)*20+5 = " + MathToString$("2+(10+(10)*-1)*20+5")
Print "BB Term : 2+(10+(10)*-1)*20+5 = " + (2+(10+(10)*-1)*20+5)
Print
Print "Term Emu. : 5*3*(2+5)*3 = " + MathToString$("5*3*(2+5)*3")
Print "BB Term : 5*3*(2+5)*3 = " + (5*3*(2+5)*3)
Print
Print "Term Emu. : (5+2)*-1 = " + MathToString$("(5+2)*-1")
Print "BB Term. : (5+2)*-1 = " + ((5+2)*-1)
Print
Print "Term Emu. : (5+2)*-1 = " + MathToString$("(10*2)+(11*3)*(18-9*16+(2*4))")
Print "BB Term : (10*2)+(11*3)*(18-9*16+(2*4)) = " + ((10*2)+(11*3)*(18-9*16+(2*4)))

WaitKey
End

Function MathToString$(TheMath$, unit = 0, divnow = 0)
Local MyParam$ = "*/^+-", MyNumbs$ = "0123456789.", MyDivParam$ = "*/^"
Local Ziffer$, ScanPos, MathAnswer, MathArt$, MathPower#, OldMathPower#
Local Scan, ScanNumber$, OldScanNumber$, MathScan$, MyScanText$

Local bscan, bscannow, bscanhave, ScanPosA, ScanPosB

Local deScan, deMathScan$, deMath

Local debsScan

MathScan$ = Replace(TheMath$, " ", "") : debsScan = 1

While bscan < Len(MathScan$)
bscan = bscan + 1
If Mid$(MathScan$, bscan, 1) = "(" Then
ScanPosA = bscan : bscannow = 1
While bscannow
If Mid$(MathScan$, bscan, 1) = "(" Then bscanhave = bscanhave + 1
If Mid$(MathScan$, bscan, 1) = ")" Then bscanhave = bscanhave - 1
If bscanhave = 0 Then bscannow = 0
bscan = bscan + 1
If KeyDown(1) Then End
Wend

ScanPosB = bscan

MyScanText$ = Mid$(MathScan$, ScanPosA+1, ScanPosB - ScanPosA - 2)

MyScanText$ = MathToString$(MyScanText$, unit + 1)
MathScan$ = Replace(MathScan$, Mid$(MathScan$, ScanPosA, ScanPosB - ScanPosA), MyScanText$)
bscan = 0
End If

If KeyDown(1) Then End
Wend

.NewMathScan

deMathScan$ = MathScan$

Scan = InMid$(MathScan$, MyParam$)
If Scan Then
ScanNumber$ = Mid$(MathScan$, 1, Scan-1)
MathScan$ = Mid$(MathScan$, Scan)
MathAnswer = val2(ScanNumber$)
Else
Return MathScan$
End If

deScan = 1

While Not MathScan$ = ""
uu$ = MathScan$

MathArt$ = Mid$(MathScan$, 1, 1)
MathScan$ = Mid$(MathScan$, 2)

If Mid$(MathScan$,1,1) = "-" Then
MathPower# = -1
MathScan$ = Mid$(MathScan$, 2)
Else
MathPower# = 1
End If

Scan = InMid$(MathScan$, MyParam$)
OldScanNumber$ = ScanNumber$
OldMathPower# = MathPower#
ScanNumber$ = Mid$(MathScan$, 1, Scan-1)

MathScan$ = Mid$(MathScan$, Len(ScanNumber$)+1)

If MathArt$ = "+" Then
MathAnswer = MathAnswer + (val2(ScanNumber$)*MathPower#)
ElseIf MathArt$ = "-" Then
MathAnswer = MathAnswer - (val2(ScanNumber$)*MathPower#)
ElseIf MathArt$ = "*" Then
MathAnswer = (val2(OldScanNumber$)*OldMathPower#) * (val2(ScanNumber$)*MathPower#)
If MathPower# = -1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "*-" + ScanNumber$, "-" + Str$(MathAnswer))
ElseIf MathPower# = 1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "*" + ScanNumber$, Str$(MathAnswer))
End If
Goto NewMathScan
ElseIf MathArt$ = "/" Then
MathAnswer = (val2(OldScanNumber$)*OldMathPower#) / (val2(ScanNumber$)*MathPower#)
If MathPower# = -1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "/-" + ScanNumber$, "-" + Str$(MathAnswer))
ElseIf MathPower# = 1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "/" + ScanNumber$, Str$(MathAnswer))
End If
Goto NewMathScan
ElseIf MathArt$ = "^" Then
MathAnswer = (val2(OldScanNumber$)*OldMathPower#) ^ (val2(ScanNumber$)*MathPower#)
If MathPower# = -1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "^-" + ScanNumber$, "-" + Str$(MathAnswer))
ElseIf MathPower# = 1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "^" + ScanNumber$, Str$(MathAnswer))
End If
Goto NewMathScan
Else
Return "SYNTAX ERROR"
End If
Wend

Return Str(MathAnswer)
End Function

Function InMid$(A$, B$) ; in benutzung
Local C, Q, W
C = 0
For Q = 1 To Len(A$)
For W = 1 To Len(B$)
If (Mid$(A$, Q, 1) = Mid$(B$, W, 1)) And C = 0 Then C = Q : Exit
Next
If C>0 Then Exit
Next
Return C
End Function

Function val2#(sstring$)
Local temp#=0
Local decimal=0
Local sign=1
Local a
Local b
Local c
Local base=10
a=Instr(sstring$,"-",1)
If a Then negative=-1
b=Instr(sstring$,"&",a+1)
If b Then
Select Mid$(sstring$,a+1,1)
Case "B", "b"
base=2
a=b+1
Case "O", "o"
base=8
a=b+1
Case "H", "h"
base=16
a=b+1
Default
base=10
End Select
End If
decimal=0
For b=a+1 To Len(sstring$)
c=Asc(Mid(sstring$,b,1))
Select c
Case 44 ;","
Goto skip
Case 45 ;"-"
sign=-sign
Case 46 ;"."
decimal=1
Case 48,49,50,51,52,53,54,55,56,57 ;"0" To "9"
temp#=temp*base+c-48
If decimal Then decimal=decimal*base
Case 65,66,67,68,69,60 ;"A" to "F"
If base=16 Then
temp#=temp#*base+c-55
If decimal Then decimal=decimal*base
Else
Goto fini
EndIf
Case 97,98,99,100,101,102 ;"a" to "f"
If base=16 Then
temp#=temp#*base+c-87
If decimal Then decimal=decimal*base
Else
Goto fini
EndIf
Default
Goto fini
End Select
.skip
Next
.fini
If decimal Then temp#=temp#/decimal

If negative = -1 Then
Return -(temp#*sign)
Else
Return temp#*sign
End If
End Function[/code:1:1048df0547]

cu, ST
===
von ???
Sehr nett!
Allerdings nicht perfekt. Mit negativen Zahlen hat das Teil noch seine Probleme.

Z.b. bei: 2*(-1)
===
von ???
Hi.

DC: einfach die klammer weg lassen, dann sollte es gehn. Denke ich ^^

cu, ST.
===
von ???
Damit ist dein Code aber nicht [i:8c8e5379df]vollwertig[/i:8c8e5379df] :wink:. Und [b:8c8e5379df]2/3[/b:8c8e5379df] ist nicht [b:8c8e5379df]1[/b:8c8e5379df]!
===
von ???
2*-1 geht auch nicht. Da kommen nur Tausende Pfeile (->) :(
===
von ???
Hi.

DC: Ich weis. Ich hab da ein Bug. Naja. Sorry. Den werde ich (vieleicht) in den nächsten Stunden beheben.

cu
===
von ???
[quote:4b199e3628]@bruZard: Gestern im Chat hattest du behauptet, dass das ohne Types ect. nicht ginge. Aha. DC sagte dann warum ich es nit machen könne. Nun denn. Dein Problem ist jetzt nur, dass ich so eine MathToString Funktion habe, und zwar ohne die benutzung von Types ect. Wenn ich sage, dass was geht, dann geht es gefälligst![/quote:4b199e3628]

rofl, gaaaanz ruhig, ST... ^_^

btw: interessantes Programm, respektable Programmierleistung :)
===
von ???
Hi.

[quote:e6a4495fa4="Wunderkind"]Damit ist dein Code aber nicht [i:e6a4495fa4]vollwertig[/i:e6a4495fa4] :wink:. Und [b:e6a4495fa4]2/3[/b:e6a4495fa4] ist nicht [b:e6a4495fa4]1[/b:e6a4495fa4]![/quote:e6a4495fa4]

Such bei den Locals nach MathAnswer, und dann mache ein # dahinter. Also in etwa so MathAnswer# *g* Dann sollten auch Dezimalzahlen funzen.

cu
===
von ???
sooo, da die routine von der kröte nit richtig klappt is hier noch was von mir, der code ist nicht optimiert und schnell geschrieben (30mins). Klammern sowie +,-,*,/ und Potenzrechnungen(also ^) sollten klappen. Wer das ganze übersichtlich und schneller machen will oder einen Fehler findet, kann sich ja melden oder nen eigenen source schreiben

der speed von dem code hier liegt bei
nem term wie "3*2000+500*(1400*(1440+1200*(3456-120/5)))"
und bei 2000 Tests bei mir bei: Durchschnittszeit: 1.476000 Millisecs, und das reicht mir :)

[code:1:a39cf0c0b6]
Function calculate_term$(term$)
term$=Trim(term$)

anzahl=Len(term$)
If anzahl > 0

For stelle = 1 To anzahl
Select Mid(term,stelle,1)

Case "^"

anfangsstelle=1
For st = stelle-1 To 1 Step -1
inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
anfangsstelle=st+1
Exit
EndIf
Next
zahl1=Mid(term$,anfangsstelle,stelle-anfangsstelle)

endstelle=anzahl
For st = stelle+1 To anzahl
inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
endstelle=st
Exit
EndIf
Next
zahl2=Mid(term$,stelle+1,endstelle-stelle+1)

zahlneu=zahl1^zahl2
tempterm$=term
If endstelle < anzahl
term$=Mid(term$,1,anfangsstelle-1)+zahlneu+Mid(term$,endstelle,-1)
Else
term$=Mid(term$,1,anfangsstelle-1)+zahlneu
EndIf

stelle=1

End Select
Next



For stelle = 1 To anzahl

Select Mid(term,stelle,1)

Case "*"

anfangsstelle=1
For st = stelle-1 To 1 Step -1
inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
anfangsstelle=st+1
Exit
EndIf
Next
zahl1=Mid(term$,anfangsstelle,stelle-anfangsstelle)

endstelle=anzahl
For st = stelle+1 To anzahl
inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
endstelle=st
Exit
EndIf
Next
zahl2=Mid(term$,stelle+1,endstelle-stelle+1)

zahlneu=zahl1*zahl2
tempterm$=term
If endstelle < anzahl
term$=Mid(term$,1,anfangsstelle-1)+zahlneu+Mid(term$,endstelle,-1)
Else
term$=Mid(term$,1,anfangsstelle-1)+zahlneu
EndIf

stelle=1
Case "/"

anfangsstelle=1
For st = stelle-1 To 1 Step -1
inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
anfangsstelle=st+1
Exit
EndIf
Next
zahl1=Mid(term$,anfangsstelle,stelle-anfangsstelle)

endstelle=anzahl
For st = stelle+1 To anzahl
inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
endstelle=st
Exit
EndIf
Next
zahl2=Mid(term$,stelle+1,endstelle-stelle+1)

zahlneu=zahl1/zahl2


If endstelle < anzahl
term$=Mid(term$,1,anfangsstelle-1)+zahlneu+Mid(term$,endstelle,-1)
Else
term$=Mid(term$,1,anfangsstelle-1)+zahlneu
EndIf


stelle=1
End Select

Next

For stelle = 1 To anzahl

Select Mid(term,stelle,1)

Case "+"

anfangsstelle=1
For st = stelle-1 To 1 Step -1

inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
anfangsstelle=st+1
Exit
EndIf
Next
zahl1=Mid(term$,anfangsstelle,stelle-anfangsstelle)

endstelle=anzahl
For st = stelle+1 To anzahl
inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
endstelle=st
Exit
EndIf
Next
zahl2=Mid(term$,stelle+1,endstelle-stelle+1)

zahlneu=zahl1+zahl2
tempterm$=term

If endstelle < anzahl
term$=Mid(term$,1,anfangsstelle-1)+zahlneu+Mid(term$,endstelle,-1)
Else
term$=Mid(term$,1,anfangsstelle-1)+zahlneu
EndIf

stelle=1
Case "-"

anfangsstelle=1
For st = stelle-1 To 1 Step -1
inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
anfangsstelle=st+1
Exit
EndIf
Next
zahl1=Mid(term$,anfangsstelle,stelle-anfangsstelle)

endstelle=anzahl
For st = stelle+1 To anzahl
inh$=Mid(term$,st,1)
If Not Asc(inh$) >= 48 And Asc(inh$) <= 57
endstelle=st
Exit
EndIf
Next
zahl2=Mid(term$,stelle+1,endstelle-stelle+1)

zahlneu=zahl1-zahl2

tempterm$=term

If endstelle < anzahl
term$=Mid(term$,1,anfangsstelle-1)+zahlneu+Mid(term$,endstelle,-1)
Else
term$=Mid(term$,1,anfangsstelle-1)+zahlneu
EndIf

stelle=1
End Select

Next
Return term$

EndIf
End Function

Function calculate(term$)
term$=Trim(term$)

anzahl=Len(term$)
If anzahl > 0

For stelle = 1 To anzahl
If Mid(term$,stelle,1) = "("
For st = stelle+1 To anzahl

If Mid(term,st,1) = ")"
zw$=calculate_term(Mid(term$,stelle+1,st-stelle-1))
tempterm$=term$
term$=Mid(tempterm$,1,stelle-1)+zw$+Mid(tempterm$,st+1,-1)
stelle=1
ElseIf Mid(term,st,1) = "("
stelle=st
EndIf

Next
EndIf
Next

EndIf
Return calculate_term$(term$)
End Function


Repeat
Print "..........."
eingabe$=Input(":")
ergebnis=calculate(eingabe$)
Print eingabe$ + "=" + ergebnis
Forever
End
[/code:1:a39cf0c0b6]
===
von ???
Saubere Arbeit Jungs, ich werde mir gleich mal Eure Einfälle zu Gemüte führen.

@ST: Du rastest immer viel zu schnell aus, mach disch ma logger ;)
===
von ???
Hi.

bruZard: Mag sein, dass in dem Post von heut Morgen zwar der umgangston gerade zu "Idiotisch" ist, aber ist doch es das selbe. Kaum fangen wir an über etwas "komplexeres" wie diese sache zu reden, und schon haben wir uns in die Haarn weil es verschiedene Lösungswege gibt. Des ist nicht in Ordnung, und man sollte da nicht einfach darüber hinweg sehn.

Außerdem bin ich viel zu Müde. Ich bin ab 14:00 Uhr hier vorm Tisch eingepennt...

cu
===
von ???
Hi.

Ich habe den Bug gefunden. Es lag tatsächlich daran, dass meine Term routine bei Negative Zahlen (bei Dividieren ect.) ein bug hatte.

Dieser wurde nun behoben. Jetzt sollten die Komplexeste dingen funzen:

[code:1:bdf463234e]; Written by ShadowTurtle aka KHP - 03. 05. 2002

Print "Term Emu. : 10+5 = " + MathToString$("10+5")
Print "BB Term : 10+5 = " + (10+5)
Print
Print "Term Emu. : 10-((1+(1-2))-1) = " + MathToString$("10-((1+(1-2))-1)")
Print "BB Term : 10-((1+(1-2))-1) = " + (10-((1+(1-2))-1))
Print
Print "Term Emu. : 5*3*(2+5)*3 = " + MathToString$("5*3*(2+5)*3")
Print "BB Term : 5*3*(2+5)*3 = " + (5*3*(2+5)*3)
Print
Print "Term Emu. : 2+(10+(10)*-1)*20+5 = " + MathToString$("2+(10+(10)*-1)*20+5")
Print "BB Term : 2+(10+(10)*-1)*20+5 = " + (2+(10+(10)*-1)*20+5)
Print
Print "Term Emu. : 5*3*(2+5)*3 = " + MathToString$("5*3*(2+5)*3")
Print "BB Term : 5*3*(2+5)*3 = " + (5*3*(2+5)*3)
Print
Print "Term Emu. : (5+2)*-1 = " + MathToString$("(5+2)*-1")
Print "BB Term. : (5+2)*-1 = " + ((5+2)*-1)
Print
Print "Term Emu. : (5+2)*-1 = " + MathToString$("(10*2)+(11*3)*(18-9*16+(2*4))")
Print "BB Term : (10*2)+(11*3)*(18-9*16+(2*4)) = " + ((10*2)+(11*3)*(18-9*16+(2*4)))

WaitKey
End

Function MathToString$(TheMath$, unit = 0, divnow = 0)
Local MyParam$ = "*/^+-", MyNumbs$ = "0123456789.", MyDivParam$ = "*/^"
Local Ziffer$, ScanPos, MathAnswer, MathArt$, MathPower#, OldMathPower#
Local Scan, ScanNumber$, OldScanNumber$, MathScan$, MyScanText$

Local bscan, bscannow, bscanhave, ScanPosA, ScanPosB

Local deScan, deMathScan$, deMath

Local debsScan

MathScan$ = Replace(TheMath$, " ", "") : debsScan = 1

While bscan < Len(MathScan$)
bscan = bscan + 1
If Mid$(MathScan$, bscan, 1) = "(" Then
ScanPosA = bscan : bscannow = 1
While bscannow
If Mid$(MathScan$, bscan, 1) = "(" Then bscanhave = bscanhave + 1
If Mid$(MathScan$, bscan, 1) = ")" Then bscanhave = bscanhave - 1
If bscanhave = 0 Then bscannow = 0
bscan = bscan + 1
If KeyDown(1) Then End
Wend

ScanPosB = bscan

MyScanText$ = Mid$(MathScan$, ScanPosA+1, ScanPosB - ScanPosA - 2)

MyScanText$ = MathToString$(MyScanText$, unit + 1)
MathScan$ = Replace(MathScan$, Mid$(MathScan$, ScanPosA, ScanPosB - ScanPosA), MyScanText$)
bscan = 0
End If

If KeyDown(1) Then End
Wend

.NewMathScan

deMathScan$ = MathScan$

Scan = InMid$(MathScan$, MyParam$)
If Scan Then
ScanNumber$ = Mid$(MathScan$, 1, Scan-1)
MathScan$ = Mid$(MathScan$, Scan)
MathAnswer = val2(ScanNumber$)
Else
Return MathScan$
End If

deScan = 1

While Not MathScan$ = ""
uu$ = MathScan$

MathArt$ = Mid$(MathScan$, 1, 1)
MathScan$ = Mid$(MathScan$, 2)

If Mid$(MathScan$,1,1) = "-" Then
MathPower# = -1
MathScan$ = Mid$(MathScan$, 2)
Else
MathPower# = 1
End If

Scan = InMid$(MathScan$, MyParam$)
OldScanNumber$ = ScanNumber$
OldMathPower# = MathPower#
ScanNumber$ = Mid$(MathScan$, 1, Scan-1)

MathScan$ = Mid$(MathScan$, Len(ScanNumber$)+1)

If MathArt$ = "+" Then
MathAnswer = MathAnswer + (val2(ScanNumber$)*MathPower#)
ElseIf MathArt$ = "-" Then
MathAnswer = MathAnswer - (val2(ScanNumber$)*MathPower#)
ElseIf MathArt$ = "*" Then
MathAnswer = (val2(OldScanNumber$)*OldMathPower#) * (val2(ScanNumber$)*MathPower#)
If MathPower# = -1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "*-" + ScanNumber$, "-" + Str$(MathAnswer))
ElseIf MathPower# = 1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "*" + ScanNumber$, Str$(MathAnswer))
End If
Goto NewMathScan
ElseIf MathArt$ = "/" Then
MathAnswer = (val2(OldScanNumber$)*OldMathPower#) / (val2(ScanNumber$)*MathPower#)
If MathPower# = -1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "/-" + ScanNumber$, "-" + Str$(MathAnswer))
ElseIf MathPower# = 1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "/" + ScanNumber$, Str$(MathAnswer))
End If
Goto NewMathScan
ElseIf MathArt$ = "^" Then
MathAnswer = (val2(OldScanNumber$)*OldMathPower#) ^ (val2(ScanNumber$)*MathPower#)
If MathPower# = -1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "^-" + ScanNumber$, "-" + Str$(MathAnswer))
ElseIf MathPower# = 1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "^" + ScanNumber$, Str$(MathAnswer))
End If
Goto NewMathScan
Else
Return "SYNTAX ERROR"
End If
Wend

Return Str(MathAnswer)
End Function

Function InMid$(A$, B$) ; in benutzung
Local C, Q, W
C = 0
For Q = 1 To Len(A$)
For W = 1 To Len(B$)
If (Mid$(A$, Q, 1) = Mid$(B$, W, 1)) And C = 0 Then C = Q : Exit
Next
If C>0 Then Exit
Next
Return C
End Function

Function val2#(sstring$)
Local temp#=0
Local decimal=0
Local sign=1
Local a
Local b
Local c
Local base=10
a=Instr(sstring$,"-",1)
If a Then negative=-1
b=Instr(sstring$,"&",a+1)
If b Then
Select Mid$(sstring$,a+1,1)
Case "B", "b"
base=2
a=b+1
Case "O", "o"
base=8
a=b+1
Case "H", "h"
base=16
a=b+1
Default
base=10
End Select
End If
decimal=0
For b=a+1 To Len(sstring$)
c=Asc(Mid(sstring$,b,1))
Select c
Case 44 ;","
Goto skip
Case 45 ;"-"
sign=-sign
Case 46 ;"."
decimal=1
Case 48,49,50,51,52,53,54,55,56,57 ;"0" To "9"
temp#=temp*base+c-48
If decimal Then decimal=decimal*base
Case 65,66,67,68,69,60 ;"A" to "F"
If base=16 Then
temp#=temp#*base+c-55
If decimal Then decimal=decimal*base
Else
Goto fini
EndIf
Case 97,98,99,100,101,102 ;"a" to "f"
If base=16 Then
temp#=temp#*base+c-87
If decimal Then decimal=decimal*base
Else
Goto fini
EndIf
Default
Goto fini
End Select
.skip
Next
.fini
If decimal Then temp#=temp#/decimal

If negative = -1 Then
Return -(temp#*sign)
Else
Return temp#*sign
End If
End Function[/code:1:bdf463234e]

cu

PS. Den Code oben habe ich auch editiert.
===
von ???
Geile sache das...

Krasses teil...

Nicht Schlecht!
===
von ???
Gut gemacht *thumbs up*
===
von ???
hehe... mir ist eben was aufgefallen. Das erste mal habe ich "goto" mal nützlich benutzt. 8)

cu, ST.
===
von ???
Hi.

Ich hatte eben einen Schrecklichen Bug in der Klammer routine gefunden. Ich habe diesen nun behoben. Hier ist der richtige Code:

[code:1:7858c72578]; Written by ShadowTurtle aka KHP - 03. 05. 2002

Print "Term Emu. : 10+5 = " + MathToString$("10+5")
Print "BB Term : 10+5 = " + (10+5)
Print
Print "Term Emu. : 10-((1+(1-2))-1) = " + MathToString$("10-((1+(1-2))-1)")
Print "BB Term : 10-((1+(1-2))-1) = " + (10-((1+(1-2))-1))
Print
Print "Term Emu. : 5*3*(2+5)*3 = " + MathToString$("5*3*(2+5)*3")
Print "BB Term : 5*3*(2+5)*3 = " + (5*3*(2+5)*3)
Print
Print "Term Emu. : 2+(10+(10)*-1)*20+5 = " + MathToString$("2+(10+(10)*-1)*20+5")
Print "BB Term : 2+(10+(10)*-1)*20+5 = " + (2+(10+(10)*-1)*20+5)
Print
Print "Term Emu. : 5*3*(2+5)*3 = " + MathToString$("5*3*(2+5)*3")
Print "BB Term : 5*3*(2+5)*3 = " + (5*3*(2+5)*3)
Print
Print "Term Emu. : (5+2)*-1 = " + MathToString$("(5+2)*-1")
Print "BB Term. : (5+2)*-1 = " + ((5+2)*-1)
Print
Print "Term Emu. : (5+2)*-1 = " + MathToString$("(10*2)+(11*3)*(18-9*16+(2*4))")
Print "BB Term : (10*2)+(11*3)*(18-9*16+(2*4)) = " + ((10*2)+(11*3)*(18-9*16+(2*4)))

WaitKey
End

Function MathToString$(TheMath$, unit = 0, divnow = 0)
Local MyParam$ = "*/^+-", MyNumbs$ = "0123456789.", MyDivParam$ = "*/^"
Local Ziffer$, ScanPos, MathAnswer, MathArt$, MathPower#, OldMathPower#
Local Scan, ScanNumber$, OldScanNumber$, MathScan$, MyScanText$

Local bscan, bscannow, bscanhave, ScanPosA, ScanPosB

Local deScan, deMathScan$, deMath

Local debsScan

MathScan$ = Replace(TheMath$, " ", "") : debsScan = 1

While bscan < Len(MathScan$)
bscan = bscan + 1
If Mid$(MathScan$, bscan, 1) = "(" Then
ScanPosA = bscan : bscannow = 1
While bscannow
If Mid$(MathScan$, bscan, 1) = "(" Then bscanhave = bscanhave + 1
If Mid$(MathScan$, bscan, 1) = ")" Then bscanhave = bscanhave - 1
If bscanhave = 0 Then bscannow = 0
bscan = bscan + 1
If KeyDown(1) Then End
Wend

ScanPosB = bscan

MyScanText$ = Mid$(MathScan$, ScanPosA+1, ScanPosB - ScanPosA - 2)

MyScanText$ = MathToString$(MyScanText$, unit + 1)
MathScan$ = Replace(MathScan$, Mid$(MathScan$, ScanPosA, ScanPosB - ScanPosA), MyScanText$)
bscan = 0
End If

If KeyDown(1) Then End
Wend

.NewMathScan

deMathScan$ = MathScan$

Scan = InMid$(MathScan$, MyParam$)
If Scan Then
ScanNumber$ = Mid$(MathScan$, 1, Scan-1)
MathScan$ = Mid$(MathScan$, Scan)
MathAnswer = val2(ScanNumber$)
Else
Return MathScan$
End If

deScan = 1

While Not MathScan$ = ""
uu$ = MathScan$

MathArt$ = Mid$(MathScan$, 1, 1)
MathScan$ = Mid$(MathScan$, 2)

If Mid$(MathScan$,1,1) = "-" Then
MathPower# = -1
MathScan$ = Mid$(MathScan$, 2)
Else
MathPower# = 1
End If

Scan = InMid$(MathScan$, MyParam$)
OldScanNumber$ = ScanNumber$
OldMathPower# = MathPower#
ScanNumber$ = Mid$(MathScan$, 1, Scan-1)

MathScan$ = Mid$(MathScan$, Len(ScanNumber$)+1)

If MathArt$ = "+" Then
MathAnswer = MathAnswer + (val2(ScanNumber$)*MathPower#)
ElseIf MathArt$ = "-" Then
MathAnswer = MathAnswer - (val2(ScanNumber$)*MathPower#)
ElseIf MathArt$ = "*" Then
MathAnswer = (val2(OldScanNumber$)*OldMathPower#) * (val2(ScanNumber$)*MathPower#)
If MathPower# = -1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "*-" + ScanNumber$, "-" + Str$(MathAnswer))
ElseIf MathPower# = 1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "*" + ScanNumber$, Str$(MathAnswer))
End If
Goto NewMathScan
ElseIf MathArt$ = "/" Then
MathAnswer = (val2(OldScanNumber$)*OldMathPower#) / (val2(ScanNumber$)*MathPower#)
If MathPower# = -1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "/-" + ScanNumber$, "-" + Str$(MathAnswer))
ElseIf MathPower# = 1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "/" + ScanNumber$, Str$(MathAnswer))
End If
Goto NewMathScan
ElseIf MathArt$ = "^" Then
MathAnswer = (val2(OldScanNumber$)*OldMathPower#) ^ (val2(ScanNumber$)*MathPower#)
If MathPower# = -1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "^-" + ScanNumber$, "-" + Str$(MathAnswer))
ElseIf MathPower# = 1 Then
MathScan$ = Replace(deMathScan$, OldScanNumber$ + "^" + ScanNumber$, Str$(MathAnswer))
End If
Goto NewMathScan
Else
Return "SYNTAX ERROR"
End If
Wend

Return Str(MathAnswer)
End Function

Function InMid$(A$, B$) ; in benutzung
Local C, Q, W
C = 0
For Q = 1 To Len(A$)
For W = 1 To Len(B$)
If (Mid$(A$, Q, 1) = Mid$(B$, W, 1)) And C = 0 Then C = Q : Exit
Next
If C>0 Then Exit
Next
Return C
End Function

Function val2#(sstring$)
Local temp#=0
Local decimal=0
Local sign=1
Local a
Local b
Local c
Local base=10
a=Instr(sstring$,"-",1)
If a Then negative=-1
b=Instr(sstring$,"&",a+1)
If b Then
Select Mid$(sstring$,a+1,1)
Case "B", "b"
base=2
a=b+1
Case "O", "o"
base=8
a=b+1
Case "H", "h"
base=16
a=b+1
Default
base=10
End Select
End If
decimal=0
For b=a+1 To Len(sstring$)
c=Asc(Mid(sstring$,b,1))
Select c
Case 44 ;","
Goto skip
Case 45 ;"-"
sign=-sign
Case 46 ;"."
decimal=1
Case 48,49,50,51,52,53,54,55,56,57 ;"0" To "9"
temp#=temp*base+c-48
If decimal Then decimal=decimal*base
Case 65,66,67,68,69,60 ;"A" to "F"
If base=16 Then
temp#=temp#*base+c-55
If decimal Then decimal=decimal*base
Else
Goto fini
EndIf
Case 97,98,99,100,101,102 ;"a" to "f"
If base=16 Then
temp#=temp#*base+c-87
If decimal Then decimal=decimal*base
Else
Goto fini
EndIf
Default
Goto fini
End Select
.skip
Next
.fini
If decimal Then temp#=temp#/decimal

If negative = -1 Then
Return -(temp#*sign)
Else
Return temp#*sign
End If
End Function[/code:1:7858c72578]

cu, ST.



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: