Mathe-Parser
Übersicht

![]() |
Cardonic |
![]() Antworten mit Zitat ![]() |
---|---|---|
Folgendes funktioniert nicht richtig:
Code: [AUSKLAPPEN] (-2)^2
Ergibt -4, obwohl es eigentlich +4 ergeben sollte ... Das Problem ist, dass du nicht zwischen dem Operator "-" und dem Vorzeichen "-" unterscheidest. Ich hab sowas für BMax programmiert; dort kannst du sehen, wie ich dieses Problem gelöst habe ([BMax] String-Rechen-Funktion) mfg Cardonic |
||
Froggy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Eigentlich ist der Thread schon recht alt. Trotzdem habe ich noch eine bessere Version von meiner Funktion gefunden:
Code: [AUSKLAPPEN] Function calc#(r$) ;Hauptfunktion r$=Lower(r$) r$=Trim(r$) r$=Replace(r$,"'","^") ;Klammern While Instr(r,"(") > 0 kla=1 While Mid(r,kla,1)<>"(" Or (Instr(Mid(r,kla+1),"(") < Instr(Mid(r,kla+1),")") And Instr(Mid(r,kla+1),"(") > 0) kla=kla+1 Wend klz=Instr(Mid(r,kla+1),")")+kla If kla = 1 Then r=Left(r,kla-1)+calc2(Mid(r,kla+1,klz-1-kla))+Mid(r,klz+1) ElseIf (Mid(r,kla-1,1)="+" Or Mid(r,kla-1,1)="-" Or Mid(r,kla-1,1)="*" Or Mid(r,kla-1,1)="/" Or Mid(r,kla-1,1)="^" Or Mid(r,kla-1,1)="(") Then r=Left(r,kla-1)+calc2(Mid(r,kla+1,klz-1-kla))+Mid(r,klz+1) Else fna = kla-1 While Mid(r,fna,1) <> "+" And Mid(r,fna,1) <> "-" And Mid(r,fna,1) <> "*" And Mid(r,fna,1) <> "/" And Mid(r,fna,1) <> "^" And Mid(r,fna,1) <> "(" fna = fna-1 If fna = 0 Then Exit Wend ;Funktionen If Mid(r,fna+1,3) = "sin" Then r=Left(r,fna)+Sin(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,3) = "cos" Then r=Left(r,fna)+Cos(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,3) = "tan" Then r=Left(r,fna)+Tan(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,4) = "asin" Then r=Left(r,fna)+ASin(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,4) = "acos" Then r=Left(r,fna)+ACos(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,4) = "atan" Then r=Left(r,fna)+ATan(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,3) = "sqr" Then r=Left(r,fna)+Sqr(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,3) = "abs" Then r=Left(r,fna)+Abs(Float(calc2(Mid(r,kla+1,klz-1-kla))))+Mid(r,klz+1) If Mid(r,fna+1,5) = "floor" Then r=Left(r,fna)+Floor(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,4) = "ceil" Then r=Left(r,fna)+Ceil(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,2) = "ln" Then r=Left(r,fna)+Log(calc2(Mid(r,kla+1,klz-1-kla)))+Mid(r,klz+1) If Mid(r,fna+1,3) = "log" Then r=Left(r,fna)+Log(calc2(Mid(r,kla+1,klz-1-kla)))/Log(10)+Mid(r,klz+1) EndIf Wend r$=calc2(r$) If r$="NaN" Then Return Sqr(-1) ElseIf r$="Infinity" Then Return 10^100 Else Return Float(r$) EndIf End Function Function calc2$(r$) ;Operationen koordinieren ;Operationen While Instr(r$,"^")>0 r$=calc3$(r$,Instr(r$,"^"),1) Wend ;Überflüssige Zeichen entfernen While Instr(r$,"---")>0 r$=Replace(r$,"---","-") Wend While Instr(r$,"++")>0 r$=Replace(r$,"++","+") Wend While Instr(r$,"--")>0 r$=Replace(r$,"--","+") Wend While Instr(r$,"+-")>0 r$=Replace(r$,"+-","-") Wend While Instr(r$,"-+")>0 r$=Replace(r$,"-+","-") Wend While Instr(r$,"*")>0 Or Instr(r$,"/")>0 If (Instr(r$,"*")>0 And Instr(r$,"*")<Instr(r$,"/")) Or Instr(r$,"/")=0 Then r$=calc3$(r$,Instr(r$,"*"),2) ElseIf Instr(r$,"/")>0 Then r$=calc3$(r$,Instr(r$,"/"),3) EndIf Wend While Instr(Replace(r$,"e+"," "),"+")>0 Or Instr(Replace(Mid(r$,2),"e-"," "),"-")>0 ;Negative, zu grosse und zu kleine Zahlen werden berücksichtigt If (Instr(Replace(r$,"e+"," "),"+")>0 And Instr(Replace(r$,"e+"," "),"+")<Instr(Replace(Mid(r$,2),"e-"," "),"-")) Or Instr(Replace(Mid(r$,2),"e-"," "),"-")=0 Then r$=calc3$(r$,Instr(Replace(r$,"e+"," "),"+"),4) ElseIf Instr(Replace(Mid(r$,2),"e-"," "),"-")>0 Then r$=calc3$(r$,Instr(Replace(Mid(r$,2),"e-"," "),"-")+1,5) EndIf Wend Return r$ ;Wert zurückgeben End Function Function calc3$(r$,is,o) ;Einzelne Operation ausführen ;Zahl1 bestimmen ia=is Repeat ia=ia-1 If ia<=0 Then ia=0: Exit Until Mid(Replace(r$,"e+"," "),ia,1)="+" Or (Mid(Replace(Replace(Replace(Replace(Replace(r$,"e-"," "),"+-","+ "),"--","- "),"*-","* "),"/-","/ "),ia,1)="-" And ia<>1) Or Mid(r$,ia,1)="*" Or Mid(r$,ia,1)="/" Or Mid(r$,ia,1)="^" z1#=Mid(r$,ia+1,is-1) ;Zahl2 bestimmen ib=is Repeat ib=ib+1 Until ib=Len(r$)+1 Or Mid(Replace(r$,"e+"," "),ib,1)="+" Or (Mid(Replace(r$,"e-"," "),ib,1)="-" And ib-is>1) Or Mid(r$,ib,1)="*" Or Mid(r$,ib,1)="/" Or Mid(r$,ib,1)="^" z2#=Mid(r$,is+1,ib-1) ;Operation ausführen und Rückgabe Select o Case 1 Return Left(r$,ia)+Str(z1^z2)+Mid(r$,ib) Case 2 Return Left(r$,ia)+Str(z1*z2)+Mid(r$,ib) Case 3 Return Left(r$,ia)+Str(z1/z2)+Mid(r$,ib) Case 4 Return Left(r$,ia)+Str(z1+z2)+Mid(r$,ib) Case 5 Return Left(r$,ia)+Str(z1-z2)+Mid(r$,ib) End Select End Function Ich bitte die Moderatoren, den Thread zu schliessen. |
||
![]() |
Triton |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ich habe lieber mal den Titel eindeutiger gemacht. | ||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group