Das ist aber verdammt schwer und ist so einfach ohne algebra funktionen nicht mehr zu realisieren, es sei denn du hast tausende von Abfragen.
Toll wäre es natürlich schon :), aber es gibt da schon sehr weit entwickelte Tools. Ich glaub nicht, dass das so einfach zu realisieren ist, die Grenze, was man mit dem Code von Der_Doc berechnen kann ist nicht gerade hoch :).
Terme berechnen
-
- [ offen ]
-
Lasse K. -
24. September 2008 um 15:34 -
Geschlossen -
Erledigt
-
-
Ich habe schon eine gui erstellt und will das Programm auf jeden Fall erweitern:
-mit Lösungsweg
-mit zwei Variablen
-dass man auch 2-stellige x-zahlen benutzen kann (geht nämlich nur, wenn die zahl durch das bereits vorhandene Ergebnis teilbar ist , aber das kann man ja ändern )Gruß,
Lasse -
[autoit]
#include <GuiConstants.au3>
[/autoit][autoit][/autoit][autoit]GUICreate("Termberechnung mit einem X",320,230)
[/autoit][autoit][/autoit][autoit]
$lbl = GUICtrlCreateLabel("Hier den Term mit einem X eingeben:",5,5,300)
$in = GUICtrlCreateInput("",5,30,310)
$edit = GUICtrlCreateEdit("",5,65,310,30,0x0800)
$btn = GUICtrlCreateButton("Term Auflösen",5,200,100)
$btn2 = GUICtrlCreateButton("Beenden",215,200,100)
$lbl3 = GUICtrlCreateLabel(" * = Multiplizieren",5,110,400)
$lbl4 = GUICtrlCreateLabel(" / = Dividieren",5,130,400)
$lbl5 = GUICtrlCreateLabel(" - = Subtrahieren",5,150,400)
$lbl6 = GUICtrlCreateLabel(" + = Addieren",5,170,400)GUICtrlSetFont($lbl,9)
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
GUICtrlSetFont($lbl3,9)
GUICtrlSetFont($lbl4,9)
GUICtrlSetFont($lbl5,9)
GUICtrlSetFont($lbl6,9)
GUICtrlSetFont($edit,9)
GUICtrlSetFont($in,9)
GUICtrlSetFont($edit,10)
GUISetState()While 1
[/autoit][autoit][/autoit][autoit]
$msg = GUIGetMsg()If $msg = $btn Then
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
$Term = GUICtrlRead($in)
$Term = StringReplace($Term,"x","(*$x)")
$Part = StringSplit($Term,"=")For $x = -100 To 100 Step 0.01
[/autoit][autoit][/autoit][autoit]
$x =StringFormat ( "%.2f",$x)
$a = Execute($Part[1])
$b = Execute($Part[2])
;~ MsgBox(0,"","$x " &$x&" Part1 "&$a &@crlf & " Part2 "&$b)
If $a = $b Then
GUICtrlSetData($edit," X = "&$x)
EndIf
NextEndIf
[/autoit][autoit][/autoit][autoit]
If $msg = $btn2 Then
Exit
EndIfWEnd
[/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit] -
Ich versuche jez das prog so zu verbessern, dass er den term ausrechnet und nicht ausprobiert. Wer schon was hat dann bitte posten. Danke!
Gruß,
Lasse -
Viel Glück dabei, wird wohl nicht so ganz einfach werden. Für einfache Terme so wie den den du gepostet hast wirds schon gehen, aber dann wirds .....
Gruß funkey
-
wird schon irgentwie gehen, Danke
Gruß,
Lasse -
Na dann wünsch ich mal viel Glück ... und net aufgeben wir warten schließlich gespannt auf eine funktionierende Lösung.
MfG
Der_Doc -
Hi,
Ich suche ein möglichkeit vll mit strings z.B dies zu zersteilen:
-45x +56 -7
Und zwar so das die vorzeichen immer vor der zahl stehen. Bsp.:
$zahl1 = -45x
$zahl2 = +56
$zahl3 = -7Also auch wenn es mehr als zweistellige zahlen sind.
Danke!Gruß,
Lasse -
- Offizieller Beitrag
Mit StringRegExp kannst Du einen solchen Term zerlegen:
[autoit]
[/autoit]
#include<Array.au3>
$a = '-4587x +5766 -777 *88888 /111'
$b = StringRegExp($a, '(\+\d+|-\d+|\*\d+|/\d+)', 3)
_ArrayDisplay($b) -
Perfekt! Danke!
Gruß,
Lasse -
Könntest du das auch noch so machen das er das vom _arraydisplay von hinten nach vorne ausliest?
Danke
Gruß,
Lasse -
- Offizieller Beitrag
Einfach _ArrayReverse($b) vor _ArrayDisplay($b) setzen. Oder meinst Du das anders?
-
Ja genau, aber er soll dann alle der umgedrehten arrays wieder auslesen.
also ich will:
das zb. der term
5x - 10 = 20mit dem gegenoperatoren ausgerechnet werden zb. so:
wenn ich den term eingebe:
5*x - 10 = 20
soll das dabei rauskommen:5*x - 10 = 20 | +10
=> 5*x = 30 | /5
=> x = 7
Danke!
Gruß,
Lasse -
- Offizieller Beitrag
Eine komplette Aufgabe zerlegen:
[autoit]
[/autoit]
#include<Array.au3>
$a = StringStripWS('5 + x - 10 + 8 = 20 + 5',
$b = StringSplit($a, '=')
If IsArray($b) Then
$c1 = StringRegExp($b[1], '(\+\d+|-\d+|\*\d+|/\d+|(?i)\D*x|(?i)\D*y|\d+)', 3)
$c2 = StringRegExp($b[2], '(\+\d+|-\d+|\*\d+|/\d+|(?i)\D*x|(?i)\D*y|\d+)', 3)
EndIf
_ArrayDisplay($c1)
_ArrayDisplay($c2) -
Danke aber ich meinte das er die teile von tem 1st. split,bis auf das x, mit dem gegenoperator mit dem 2 split aus rchnet:
5x +10 = 20 dann +10 als -10 mit 20 ausrechnen also 5x = 10 usw. bis nur noch das x da is.
Danke!
Gruß,
Lasse -
- Offizieller Beitrag
Ja, genau das ist das Komplizierte daran. Wie die anderen bereits gepostet haben, besteht die eigentliche Aufgabe bei diesem Script in genau diesem Teil. Wie kann man das lösen, sodass es für jede Aufgabe passt?
Erstmal musst Du wohl rauskriegen, auf welcher Seite "X" steht. Deswegen habe ich das in den RegExp-Pattern schon mit eingebaut. Aber für den Rest fällt mir auch keine brauchbare Lösung ein... -
- Offizieller Beitrag
Hi,
mal ein wenig Gedankengut von mir dazu :D.
Das Problem bei der Berechnung von Aufgaben, deren Form (Rechenart) und Inhalt ich vorab nicht kenne, ist hauptsächlich die Berücksichtigung der Vorrangsregeln.
Hier ist es sicher sinnvoll mit Taschenrechner-Logik zu arbeiten - d.h. nach jedem neu eingegebenen Element (Ziffer, Operator, Klammer) muß die Vorrangigkeit einzelner Operationen im Gesamtoperationsstring neu überprüft werden. Ob statt einer Ziffer auch eine Variable enthalten ist, ist für die Basis der Operation nebensächlich.
Wenn die Basis steht kann ich auch rechnen und brauch nicht näherungsweise Ergebnisse vergleichen. (Natürlich sollte ich Divisionen durch Null abfangen )
Aber ist auf jedenfall ein interessantes Projekt. Vielleicht werde ich mich auch mal etwas darin vertiefen.
Wünsche noch viel Erfolg. -
- Offizieller Beitrag
Sobald man Sachen wie 4/3 direkt berechnet, muss man einen Genauigkeitsverlust befürchten (bzw. hat ih faktisch). Eigentlich müsste man also Brüche verwalten und auch automatisch kürzen...
peethebee
-
Ist nur die Frage rechnet sich der ganze Aufwand?
Terme mit *,+ und - über die Varianten die gepostet wurden funktioniert ja. Aber mit Brüchen wird das wirklich super kompliziert. Programme die das können kosten net umsonst so einen Haufen Geld.Im Moment wird das Ergebnis ja auch net ausgerechnet sonder ausprobiert.
Schön wenn ich das in meiner Schulzeit auch in der Geschwindigkeit hinbekommen hätte.MfG
Der_Doc -
- Offizieller Beitrag
Sobald man Sachen wie 4/3 direkt berechnet, muss man einen Genauigkeitsverlust befürchten (bzw. hat ih faktisch). Eigentlich müsste man also Brüche verwalten und auch automatisch kürzen...
peethebee
"Dezimal" betrachtet stimme ich dir zu - aber wenn Brüche vorhanden sind, würde ich auch mit Brüchen rechnen und nur das Endergebnis dezimal ausgeben. Ich brauche ja bei der Betrachtung von Brüchen nicht nach sinnvollen Erweiterungen (also kgV / ggT) suchen. Schließlich brauch ich nicht von Hand rechnen. Also ist der gemeinsame Nenner einfach das Produkt der Nenner, Zähler entsprechend erweitern und fertig . Sofern die Brüche nicht in Dimensionen liegen, die den Zahlenrahmen von AutoIt sprengen halte ich diesen Weg für praktikabel.
-