Math-Calc (Taschenrechner für Mittelstand) von D2006 |
Aloha, den Code hatte ich vor ein paar Tagen erstellt. Nun hat mich der Taschenrechner für Arme auf die Idee gebracht, ihn zu veröffentlichen. Vom Prinzip: Ihr gebt beispielsweise: "((8-3)*(4-7))/((2+3)*(4-7))" ein und der Code spuckt: "-3.666667" aus. [Was natürlich stimmt] Bisher volle Unterstützung von: Addition, Subtraktion, Multiplikation, Division, Klammern, 1 Variable ("x" oder "X") Unter Beachtung von Punkt vor Strich und Klammern immer zuerst. Die Variable wird im folgendem Code als "Antwortspeicher" genutzt, also das letzte Ergebnis. [code:1:92b8248ba7] ;##### Math-Calc ;##### © 2003 ;##### Daniel Liebetrau ;##### Bei Benutzung bitte Credits-Eintrag Graphics 1024,768,32 SetBuffer BackBuffer() Cls Flip Cls font=LoadFont("Arial",18) SetFont font While Not KeyHit(1) ;Aufruf der Eingaberoutine dat$=bbin(50,10) ;Aufruf der Lösung mit altem x#-Wert als x-Variable x#=math_calc(dat$,x#) Cls Text 50,10,dat$ Text 50+StringWidth(dat$),30,cl(x#) Flip WaitKey() WaitKey() Cls Flip Cls Flip Wend End ; für folgendes siehe 2 Float#-Funktionen (Code-Archiv) Function cl$(xdat#) dat$=Str$(xdat#) For t=Len(dat$) To 1 Step -1 g$=Mid$(dat$,t,1) h=g$ If h=0 Then dat$=Left$(dat$,Len(dat$)-1) If g$="." Then Exit Else Exit EndIf Next Return dat$ End Function ; die eigentliche Funktion Function math_calc#(dat$,var#) Local b2=0,b1=0, b=0 Local number$[100],nr=0, num=0, nummer$="", kl=0 ;kl steht für Klammern dat$=dat$+" " For t=1 To Len(dat$) g$=Mid$(dat$,t,1) If g$="x" Or g$="X" Then If num=1 Then num=0 nr=nr+1 number[nr]="*" EndIf If kl=0 Then nr=nr+1 number[nr]="N"+var# Else number[nr]=number[nr]+Str$(var#) EndIf EndIf b=0 If Asc(g$)>47 And Asc(g$)<58 Then b=1 If Asc(g$)=46 Or Asc(g$)=94 Then b=1 If b=1 Then If num=0 And kl=0 Then nr=nr+1:number[nr]="N" num=1 number[nr]=number[nr]+g$ EndIf b1=0 If g$="+" Or g$="-" Or g$="/" Or g$="*" Then b1=1 If num=1 And b1=1 Then num=0 If b1=1 And kl=0 Then nr=nr+1:number[nr]=g$ If b1=1 And kl>0 Then number[nr]=number[nr]+g$ b2=0 If g$="(" Or g$=")" Then b2=1 If b2=1 Then If num=1 And kl=0 Then num=0 nr=nr+1 number[nr]="*" EndIf num=2 If kl=0 Then nr=nr+1 If g$="(" Then kl=kl+1 If kl>1 Then number[nr]=number[nr]+"(" EndIf If g$=")" Then kl=kl-1 If kl>0 Then number[nr]=number[nr]+")" EndIf If kl=0 Then number[nr]="N"+math_calc#(number[nr],var#) num=1 EndIf EndIf If num=1 And b+b1+b2=0 Then num=0 Next For t=1 To nr g$=number[t] If g$="*" Then v1#=Right$(number[t-1],Len(number[t-1])-1) v2#=Right$(number[t+1],Len(number[t+1])-1) number[t-1]="N"+Str$(v1*v2) For i=t To nr number[i]=number[i+2] Next nr=nr-2 t=0 EndIf If g$="/" Then v1#=Right$(number[t-1],Len(number[t-1])-1) v2#=Right$(number[t+1],Len(number[t+1])-1) If v2#=0 Then Return 0 number[t-1]="N"+Str$(v1/v2) For i=t To nr number[i]=number[i+2] Next nr=nr-2 t=0 EndIf Next For t=1 To nr g$=number[t] If g$="+" Then v1#=Right$(number[t-1],Len(number[t-1])-1) v2#=Right$(number[t+1],Len(number[t+1])-1) number[t-1]="N"+Str$(v1+v2) For i=t To nr number[i]=number[i+2] Next nr=nr-2 t=0 EndIf If g$="-" Then v1#=Right$(number[t-1],Len(number[t-1])-1) v2#=Right$(number[t+1],Len(number[t+1])-1) number[t-1]="N"+Str$(v1-v2) For i=t To nr number[i]=number[i+2] Next nr=nr-2 t=0 EndIf Next If number[1]<>"" Then v#=Right$(number[1],Len(number[1])-1) Else v#=0 Return v# End Function ; Eingaberoutine Function bbin$(xdat,ydat) dat$="" Repeat adat=GetKey() If adat>47 And adat<58 Then dat$=dat$+Chr$(adat) If adat=46 Then dat$=dat$+Chr$(adat) op$=" +-*/()xX" For t=1 To Len(op$) h$=Mid$(op$,t,1) If adat=Asc(h$) Then dat$=dat$+Chr$(adat) Next Text xdat,ydat,dat$+" " Color 0,0,0 Rect xdat+StringWidth(dat$),ydat,StringWidth("0"),FontHeight() Color 255,255,255 Flip If KeyHit(14) And Len(dat$)>0 Then dat$=Left$(dat$,Len(dat$)-1) Until KeyHit(28) Or KeyHit(156) Return dat$ End Function [/code:1:92b8248ba7] Achtung, zur Zeit kann man noch keine Negativen Zahl eingeben, außer so: -x = "0-x" Warte auf Kritik und Ideen MfG |
von ??? |
Hallo. Ich hatte auch mal so was geschrieben. Da geht allerdings alles perfekt. :) EDIT: Dieser Code darf man auch ohne Credits verwenden. Hier der Code: [code:1:6e233a62f5]; 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:6e233a62f5] |
von ??? |
Mist jetzt auch noch konkurenz (und auch noch viel besser) :wink: |
von ??? |
nee. Des ganze war nur ein 30 Min. Projekt. Ich weis auch selber, dass man da noch viel Optimieren muss. cu |
von ??? |
sag mal, spielt das bei euch keine Rollen ob bei "Print" das "" fehlt oder bei Waitkey das (). Bei mir geht das dann nicht. (hab B+) MfG |
von ??? |
@D2006: Also bei B2D ist das völlig egal... |