Befehl, um Rechnungen zu lösen?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Froggy

Betreff: Befehl, um Rechnungen zu lösen?

BeitragSo, Okt 08, 2006 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Gibt es einen Befehl, um einen String in der Art "3^2*(4-5+Pi)*sin(44)" zu lösen?

Edit: Kann auch nur "1+1" sein Wink
 

Dreamora

BeitragSo, Okt 08, 2006 21:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein
Wenn du mathematische Ausdrücke parsen willst, musst du dir wohl einen eigenen Schreiben.
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

Blitzcoder

Newsposter

BeitragSo, Okt 08, 2006 21:32
Antworten mit Zitat
Benutzer-Profile anzeigen
solchen komplexen strings kannst du nur sehr schwer lösen. Zumindest, wenn sie im Programm eigegeben werden sollen. Ansonsten:
Code: [AUSKLAPPEN]

print 3^2*(4-5+Pi)*sin(44)
Code: [AUSKLAPPEN]
print 1+1


MfG Blitzcoder
P4 3 Ghz@3,55Ghz|GF 6600GT 256MB|Samsung 80GB | 2x Samsung 160GB|2048MB DDR-400 RAM|6 Mbit Flatrate | Logitech G15 | Samsung 225BW-TFT | Ubuntu Gutsy Linux | Windows Vista | Desktop | Blog | CollIDE | Worklog
________________
|°°°°°°°°°°°°°°||'""|""\__,_
|______________ ||__ |__|__ |)
|(@) |(@)"""**|(@)(@)****|(@)
  • Zuletzt bearbeitet von Blitzcoder am So, Okt 08, 2006 21:47, insgesamt einmal bearbeitet
 

Froggy

BeitragSo, Okt 08, 2006 21:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Schade, habs nämlich schon versucht, bin aber bei schwierigeren Rechnungen gescheitert.

SoNenTyp

BeitragSo, Okt 08, 2006 21:36
Antworten mit Zitat
Benutzer-Profile anzeigen
So etwas habe ich mir selber mal vor langer zeit geschrieben. Ist eigentlich recht einfach.Einfach erstmal überprüfen ob es nur eine einfache Rechnung wie "1+1" ist. wenn ja dann das lösen. Wenn nicht schnappst du dir einfach alle klammern und giebst sie deiner eigenen Funktion. Dann Punkt vor Strich und vertig ist das Mondge... ähh die Funktion.
Gruss Der Typ.

User posted image
 

Froggy

BeitragSo, Okt 08, 2006 21:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich bin bei Rechnungen wie "-34*-45/-534" gescheitert.
Ausserdem wird das recht lang.

Edit:
das ist die Funktion. Kann sie jemand verbessern?
Wenn ihr hochrechnen wollt, solltet ihr ' eingeben, denn die Input-Funktion erkennt die ^-Taste nicht.

Code: [AUSKLAPPEN]

Graphics 800,800,32,2

Print calc("-34*-45/-15")
Print "oben sollte -102 stehen."
Print calc(Input("Rechnung: "))

WaitKey
End

;calc
Function calc#(r$)

r=Lower(r)
r=Replace(r,"'","^")
r=Replace(r,"[","(")
r=Replace(r,"]",")")
r=Replace(r,"{","(")
r=Replace(r,"}",")")
r=Replace(r,"pi","3.14159")

While Instr(r$,"(")>0
ltaster = Len(r)
Repeat
ltaster = ltaster-1
Until Mid(r,ltaster,1)="("

rtaster = ltaster
Klammern = 1
Repeat
rtaster = rtaster+1
If Mid(r,rtaster,1)=")" Then Klammern = Klammern-1
If Mid(r,rtaster,1)="(" Then Klammern = Klammern+1
Until Klammern = 0

genommen=0
If ltaster-4>0 Then
Select Mid(r,ltaster-4,4)
Case "asin" r=Left(r,ltaster-5)+Str(ASin(Float(calc2(Mid(r,ltaster+1,rtaster-1-ltaster)))))+Mid(r,rtaster+1):genommen=1
Case "acos" r=Left(r,ltaster-5)+Str(ACos(Float(calc2(Mid(r,ltaster+1,rtaster-1-ltaster)))))+Mid(r,rtaster+1):genommen=1
Case "atan" r=Left(r,ltaster-5)+Str(ATan(Float(calc2(Mid(r,ltaster+1,rtaster-1-ltaster)))))+Mid(r,rtaster+1):genommen=1
End Select
EndIf

If ltaster-3>0 And genommen=0 Then
Select Mid(r,ltaster-3,3)
Case "sin" r=Left(r,ltaster-4)+Str(Sin(Float(calc2(Mid(r,ltaster+1,rtaster-1-ltaster)))))+Mid(r,rtaster+1):genommen=1

End Select
EndIf

If genommen=0 Then r=Left(r,ltaster-1)+calc2(Mid(r,ltaster+1,rtaster-1-ltaster))+Mid(r,rtaster+1)


Wend

r=calc2(r)

Return Float(r)
End Function


;calc2
Function calc2$(r$)

While Instr(r,"^")>0
r=calc3(r,5)
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,1)
Else
r=calc3(r,2)
EndIf
Wend

While Instr(r,"+")>0 Or Instr(r,"-")>1
If Instr(r,"+")>0 And Instr(r,"+")<Instr(r,"-") Or Instr(r,"-")=0 Then
r=calc3(r,3)
Else
r=calc3(r,4)
EndIf
Wend

Return Str(r)
End Function



;calc3
Function calc3$(r$,a)


If a=1 Then zeichen = Instr(r,"*")
If a=2 Then zeichen = Instr(r,"/")
If a=3 Then zeichen = Instr(r,"+")
If a=4 Then zeichen = Instr(r,"-")
If a=5 Then zeichen = Instr(r,"^")

ltaster = zeichen

Repeat
ltaster = ltaster-1
If ltaster <= 1 Then Exit
Until ltaster-zeichen<-1 And (Mid(r,ltaster-1,1) = "+" Or Mid(r,ltaster-1,1) = "-" Or Mid(r,ltaster-1,1) = "*" Or Mid(r,ltaster-1,1) = "/" Or Mid(r,ltaster-1,1) = "^") And calcdztest(r,ltaster)=1
z1# = Mid(r,ltaster,zeichen-1)
If Mid(r,ltaster,zeichen-1)="" Then z1=0

rtaster = zeichen
Repeat
rtaster = rtaster+1
If rtaster+1>Len(r) Then Exit
Until rtaster-zeichen>1 And Mid(r,rtaster+1,1) = "+" Or Mid(r,rtaster+1,1) = "-" Or Mid(r,rtaster+1,1) = "*" Or Mid(r,rtaster+1,1) = "/" Or Mid(r,ltaster+1,1) = "^"
z2# = Mid(r,zeichen+1,rtaster)

If a=1 Then r=Left(r,ltaster-1)+Str(z1*z2)+Mid(r,rtaster+1)
If a=2 Then r=Left(r,ltaster-1)+Str(z1/z2)+Mid(r,rtaster+1)
If a=3 Then r=Left(r,ltaster-1)+Str(z1+z2)+Mid(r,rtaster+1)
If a=4 Then r=Left(r,ltaster-1)+Str(z1-z2)+Mid(r,rtaster+1)
If a=5 Then r=Left(r,ltaster-1)+Str(z1^z2)+Mid(r,rtaster+1)

Return Str(r)

End Function


;calcdztest
Function calcdztest(r$,ltaster)
If ltaster-2 < 1 Then
Return 1
ElseIf Mid(r,ltaster-2,2)<>"*-" And Mid(r,ltaster-2,2)<>"/-" And Mid(r,ltaster-2,2)<>"^-" Then
Return 1
Else
Return 0
EndIf
End Function

Triton

BeitragSo, Okt 08, 2006 22:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Hat recht wenig mit 2D zu tun.

Arrow verschoben nach Allgemein.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Clonker

BeitragSo, Okt 08, 2006 23:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe auch mal soetwas geschrieben:


Code: [AUSKLAPPEN]


Graphics 800,800,32,2

Print calc("-34*-45/-15")
Print "oben sollte -102 stehen."
Print calc(Input("Rechnung: "))

WaitKey
End

;calc
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)
         ;DebugLog 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)))*18*Pi)
            Case 1: tresult$ = Cos(Float(calc(Mid(term,pos,c)))*18*Pi)
            Case 2: tresult$ = Tan(Float(calc(Mid(term,pos,c)))*18*Pi)
            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
         ;DebugLog n1+ " " + op + " " + n2+ " | " + result + " ||| "+ term
      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

Function RoundTo#(zahl#,a)
   Return Int(zahl*10^a)/10^a
End Function
Die exzessive Akkumulation von Fremdwörtern suggeriert pseudointellektuelle Kompetenz.

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

PowerProgrammer

BeitragMo, Okt 09, 2006 9:21
Antworten mit Zitat
Benutzer-Profile anzeigen
Sowas ähnliches findest du auchnoch im Codearchiv. Da wird aber zusätzlich noch Assembler-Code bei generiert, da das für Compiler gedacht war. Das klappt auch gut. Meine, das war von Vertex. Bin mir aber nicht sicher. Konnte es gerade nicht finden...

Ich denke aber, soviele verschiedene und doch gleiche Codes benötigst du nicht Wink
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter!

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group