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 "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 "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 "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 "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 "Term Emu. : (5+2)*-1 = " + MathToString$("(5+2)*-1") Print "BB Term. : (5+2)*-1 = " + ((5+2)*-1) 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 "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 "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 "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 "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 "Term Emu. : (5+2)*-1 = " + MathToString$("(5+2)*-1") Print "BB Term. : (5+2)*-1 = " + ((5+2)*-1) 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 "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 "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 "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 "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 "Term Emu. : (5+2)*-1 = " + MathToString$("(5+2)*-1") Print "BB Term. : (5+2)*-1 = " + ((5+2)*-1) 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. |