Befehl, um Rechnungen zu lösen?
Übersicht

FroggyBetreff: Befehl, um Rechnungen zu lösen? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
![]() |
BlitzcoderNewsposter |
![]() Antworten mit Zitat ![]() |
---|---|---|
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) 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Schade, habs nämlich schon versucht, bin aber bei schwierigeren Rechnungen gescheitert. | ||
![]() |
SoNenTyp |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hat recht wenig mit 2D zu tun.
![]() |
||
Coding: silizium-net.de | Portfolio: Triton.ch.vu |
![]() |
Clonker |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
www.xairro.com Alles für Webmaster und Programmierer! Es gibt mehr als bloß einen Counter! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group