Mathe-Parser

Übersicht BlitzBasic Codearchiv

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen

Cardonic

BeitragMi, Nov 28, 2007 19:41
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Nov 29, 2007 22:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Dez 02, 2007 17:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe lieber mal den Titel eindeutiger gemacht.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Gehe zu Seite Zurück  1, 2

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group