String-Rechen-Funktion

Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Neue Antwort erstellen

Cardonic

Betreff: String-Rechen-Funktion

BeitragMi, Nov 28, 2007 19:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich hab die String-Rechen-Funktion im BiltzBasic Codearchiv gsehen und festgestellt, dass es sowas im BlitzMax Codearchiv noch nicht gibt.
Daher schadet es sicher nicht, wenn ich meine Funktion, die ich für meinen geplanten Funktionsplotter programmiert habe, hier poste.

Bis jetz ist möglich:
Addieren
Subtrahieren
Multiplizieren
Dividieren
Potenzieren
Quadratwurzel (mit a^(1/x) lässt sich auch die xte wurzel ausrechnen)
Fakultät
Sinus
Cosinus
Tangens

Neue Funktionen lassen sich relativ einfach einbauen ...

Code: [AUSKLAPPEN]
Function Calculate:Double(Term:String)
   
   Local Array:String[] =["!", "^", "sqr", "sin", "cos", "tan", "*", "/", "+", "¬"]
   Local Amount:Int = Array.Length - 1
   
   Local Position:Int
   Local Length:Int
   
   Local Before:String
   Local After:String
   Local Bracket:String
   Local Result:String
   
   Local I:Int
   Local J:Int
   
   Term = Term.ToLower()
   Term = Term.Replace(" ", "")
   
   While Term.Contains("--") Or Term.Contains("+-")
      Term = Term.Replace("--", "+")
      Term = Term.Replace("+-", "-")
   Wend
   Term = Term.Replace("-", "¬")
   Term = Term.Replace("sqr¬", "sqr-")
   Term = Term.Replace("sin¬", "sin-")
   Term = Term.Replace("cos¬", "cos-")
   Term = Term.Replace("tan¬", "tan-")
   
   ' Klammern
   While Term.Contains("(")
      
      ' Länge des Terms
      Length = Term.Length
      
      ' Klammer suchen
      For Position = 0 To Length
         If Mid(Term, Length - Position, 1) = "(" Then
            I = Length - Position
            J = Term.Find(")", I)
            Exit
         End If
      Next
      
      ' Klammer ausrechnen und ersetzen
      Bracket = Term[I..J]
      Term = Term.Replace("(" + Bracket + ")", Calculate(Bracket))
      
      Term = Term.Replace("--", "+")
      Term = Term.Replace("+-", "-")
      
   Wend
   
   ' Funktionen und Operationen
   For I = 0 To Amount
      Repeat
      
         ' Funktion oder Operator suchen
         Position = Term.Find(Array[I] )
         If Position < 0 Then Exit
         
         ' Länge des Terms
         Length = Term.Length
         
         ' Zahl davor
         Before = ""
         J = Position - 1
         While J >= 0
            If Term[J] >= 48 And Term[J] <= 57 Or Term[J] = 46 Then
               Before = Chr(Term[J] ) + Before
               J:-1
            Else If Term[J] = 45 Then
               Before = "-" + Before
               Exit
            Else
               Exit
            End If
         Wend
         
         ' Zahl danach
         After = ""
         J = Position + Array[I].Length
         While J < Length
            If Term[J] >= 48 And Term[J] <= 57 Or Term[J] = 46 Then
               After = After + Chr(Term[J] )
               J:+1
            Else If After = "" And Term[J] = 45 Then
               After = "-"
               J:+1
            Else
               Exit
            End If
         Wend
         
         ' Ergebnis
         Select Array[I]
            Case "+"
               Result = Double(Before) + Double(After)
            Case "¬"
               Result = Double(Before) - Double(After)
            Case "*"
               Result = Double(Before) * Double(After)
            Case "/"
               Result = Double(Before) / Double(After)
            Case "^"
               Result = Double(Before) ^ Double(After)
            Case "!"
               Result = Factorial(Double(Before))
               After = ""
            Case "sqr"
               Result = Sqr(Double(After))
               Before = ""
            Case "sin"
               Result = Sin(Double(After) * 180 / Pi)
               Before = ""
            Case "cos"
               Result = Cos(Double(After) * 180 / Pi)
               Before = ""
            Case "tan"
               Result = Tan(Double(After) * 180 / Pi)
               Before = ""
         End Select
         
         If Result.Contains("e-") Then Result = 0
         
         'Ergebnis ersetzen
         Term = Term.Replace(Before + Array[I] + After, Result)
         
         Term = Term.Replace("--", "+")
         Term = Term.Replace("+-", "-")
         
      Forever
   Next
   
   Return Double(Term)
   
End Function

Function Factorial:Double(N:Double)
   
   If N < 0 Then Return 0
   If N = 0 Then Return 1
   Return (N * Factorial(N - 1))
   
End Function


Falls ihr Fehler findet; bitte hier melden, danke

mfg Cardonic
 

#Reaper

Newsposter

BeitragSo, Dez 02, 2007 18:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh, toll, danke. Kann man immer mal wieder gebrauchen Very Happy

Hab bislang noch keine Fehler gefunden
AMD Athlon 64 3500+, ATI AX800 Pro/TD, 2048 MB DRR 400 von Infineon, ♥RIP♥ (2005 - Juli 2015 -> sic!)
Blitz3D, BlitzMax, MaxGUI, Monkey X; Win7

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Codearchiv & Module

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group