Funktion zum Berechnen von Ausdrücken ...

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Alfadur

Betreff: Funktion zum Berechnen von Ausdrücken ...

BeitragDo, Apr 13, 2006 13:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi, war mir nicht sicher wonach ich da am Besten suchen soll, aber hat hier schonmal jemand ne Funktion geschrieben der man einfach nen String, z.B. "3 + 5 * 6 + 4 / 2" übergibt und die dann das Ergebnis liefert?

Wäre cool wenn jemand sowas parat hat Smile
A Cray is the only computer that runs an endless loop in less than four hours.
 

Dreamora

BeitragDo, Apr 13, 2006 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Da müsstest du Mal nach Stack Rechner oder etwas entsprechendem suchen
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Alfadur

BeitragDo, Apr 13, 2006 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ok, wie es geht weiß ich ja, dachte nur das jemand das hier schonmal gemacht hat, dachte Rallimen vllt, aber der hatte das mit den großen Zahlen gemacht ...
A Cray is the only computer that runs an endless loop in less than four hours.

Jan_

Ehemaliger Admin

BeitragDo, Apr 13, 2006 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Zu suchen auch nach "Script Language" wüsste nciht, das eine so Komplexe frei verfügbar ist für BB,
könntest ja mal im Englishen schaun.
between angels and insects

Clonker

BeitragDo, Apr 13, 2006 15:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe mal vor längerer Zeit soetwas geschrieben.
Es ist zwar nicht gerade schön geschrieben, aber erfüllt seinen Zweck.

Mit dem zweiten Parameter können auch noch Variabeln übergeben werden. Dies funktioniert folgendermaßen: calc("1+x","x=2")
BlitzBasic: [AUSKLAPPEN]

Print "3 + 5 * 6 + 4 / 2="+calc("3 + 5 * 6 + 4 / 2") : WaitKey()

Function calc$(term$,par$="")

;Variabeln
term$ = Replace(term$,"pi","3,141")
If par <> "" Then
While Instr(par$,"=") <> 0
pos = Instr(par$,"=")

n1$="" : i=pos-1
While checkchar(Mid(par$,i,1)) = 3
n1$=Mid(par$,i,1)+n1$
i=i-1
If i = 0 Then Exit
Wend
t_start=i

n2$ = "" : i = pos+1
While (checkchar(Mid(par$,i,1)) = 1) Or (checkchar(Mid(par$,i,1)) = 2)
n2$=n2$+Mid(par$,i,1)
i=i+1
If i = Len(par$)+1 Then Exit
Wend
t_end=i

par = Mid(par,1,t_start) + Mid(par$,t_end,-1)
term$ = Replace(term$,n1,n2)
Wend
EndIf

;Leerzeichen entfernen
term$ = Replace(term$," ","")

term$ = Replace(term$,"--","+")
term$ = Replace(term$,"++","+")
term$ = Replace(term$,"-+","-")
term$ = Replace(term$,"+-","-")

;Funktionen
For t=0 To 4
Select t
Case 0: fnk$ = "sin("
Case 1: fnk$ = "cos("
Case 2: fnk$ = "tan("
Case 3: fnk$ = "sqr("
Case 4: fnk$ = "abs("
End Select
While Instr(term$,fnk$) <> 0
pos = Instr(term$,fnk$)+Len(fnk$)
For i = pos To Len(term)
If(Mid(term,i,1)= ")") Then Exit
c=c+1
Next

Select t
Case 0: tresult$ = Sin(Float(calc(Mid(term,pos,c))))
Case 1: tresult$ = Cos(Float(calc(Mid(term,pos,c))))
Case 2: tresult$ = Tan(Float(calc(Mid(term,pos,c))))
Case 3: tresult$ = Sqr(Float(calc(Mid(term,pos,c))))
Case 4: tresult$ = Abs(Float(calc(Mid(term,pos,c))))
End Select

If Instr(tresult$,"e") <> 0 Then tresult$ = "0"
term = Mid(term,1,pos-1-Len(fnk$))+tresult+Mid(term,pos+c+1,-1)
Wend
Next

term$ = Replace(term$,"--","+")
term$ = Replace(term$,"++","+")
term$ = Replace(term$,"-+","-")
term$ = Replace(term$,"+-","-")

;Klammern
While Instr(term$,"(") <> 0
For i = 1 To Len(term)
If(Mid(term,i,1)= "(") Then pos1 = i
Next

c=0
For i = pos1 To Len(term)
c=c+1
If(Mid(term,i,1)= ")") Then Exit
Next
c=c-2

term$ = Mid(term$,1,pos1-1)+calc(Mid(term,pos1+1,c))+Mid(term$,pos1+c+2,-1)
Wend

term$ = Replace(term$,"--","+")
term$ = Replace(term$,"++","+")
term$ = Replace(term$,"-+","-")
term$ = Replace(term$,"+-","-")

;Rechnung
For j = 0 To 4
Select j
Case 0 op$ = "^"
Case 1 op$ = "/"
Case 2 op$ = "*"
Case 3 op$ = "-"
Case 4 op$ = "+"
End Select
term$ = Replace(term$,"&","-")

While Instr(term$,op$) <> 0
pos = Instr(term$,op$)

;Erste Zahl
n1$ = "" : i = pos-1
If i > 0 Then
While checkchar(Mid(term$,i,1)) = 1
n1$=Mid(term$,i,1)+n1$
i=i-1
If i = 0 Then Exit
Wend
t_start = i
EndIf
If op$ = "-" And n1$ = "" Then term$ = Mid(term$,1,pos-1)+"&"+Mid(term$,pos+1,-1) : e=1
If i <> 0 Then
If checkchar(Mid(term$,i,1)) = 2 Then n1$=Mid(term$,i,1)+n1$ : i=i-1 :t_start = i
EndIf

;Zweite Zahl
n2$ = "" : i = pos+1
If checkchar(Mid(term$,i,1)) = 2 Then n2$=n2$+Mid(term$,i,1) : i=i+1
While checkchar(Mid(term$,i,1)) = 1
n2$=n2$+Mid(term$,i,1)
i=i+1
If i = Len(term)+1 Then Exit
Wend
t_end = i

;Ergebnis
If Instr(n1,"e") <> 0 Then n1 = "0"
If Instr(n2,"e") <> 0 Then n2 = "0"
n1 = Replace(n1,"&","-")
n2 = Replace(n2,"&","-")

Select j
Case 0 result# = Float(n1) ^ Float(n2)
Case 1 result# = Float(n1) / Float(n2)
Case 2 result# = Float(n1) * Float(n2)
Case 3 result# = Float(n1) - Float(n2)
Case 4 result# = Float(n1) + Float(n2)
End Select

If Instr(result,"e") <> 0 Then result = "0"
If e = 0 Then
term$ = Mid(term$,1,t_start)+Str(result#)+Mid(term$,t_end,-1)
Else
e=0
EndIf
Wend
Next

Return term
End Function

Function checkchar$(char$)
If Asc(char)>=48 And Asc(char)<=57 Then Return 1
If Asc(char)=44 Or Asc(char)=46 Or Asc(char)=101 Then Return 1
If Asc(char)=45 Or Asc(char) = 38 Then Return 2
If Asc(char)>=97 And Asc(char)<=122 Then Return 3
End Function
Die exzessive Akkumulation von Fremdwörtern suggeriert pseudointellektuelle Kompetenz.

Athlon XP 2800|Radeon 9600 Pro|512MB DDR RAM|240GB Festplatte

Alfadur

BeitragDo, Apr 13, 2006 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, danke, ich wußte jemand hat sowas schonmal gemacht Smile thx
A Cray is the only computer that runs an endless loop in less than four hours.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group