Terme berechnen

  • 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 :).

  • 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)
    $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)

    [/autoit][autoit][/autoit][autoit]

    GUICtrlSetFont($lbl,9)
    GUICtrlSetFont($lbl3,9)
    GUICtrlSetFont($lbl4,9)
    GUICtrlSetFont($lbl5,9)
    GUICtrlSetFont($lbl6,9)
    GUICtrlSetFont($edit,9)
    GUICtrlSetFont($in,9)
    GUICtrlSetFont($edit,10)
    GUISetState()

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    While 1
    $msg = GUIGetMsg()

    [/autoit][autoit][/autoit][autoit]

    If $msg = $btn Then
    $Term = GUICtrlRead($in)
    $Term = StringReplace($Term,"x","(*$x)")
    $Part = StringSplit($Term,"=")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    For $x = -100 To 100 Step 0.01
    $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
    Next

    [/autoit][autoit][/autoit][autoit]

    EndIf
    If $msg = $btn2 Then
    Exit
    EndIf

    [/autoit][autoit][/autoit][autoit]

    WEnd

    [/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 :D

  • 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 = -7

    Also auch wenn es mehr als zweistellige zahlen sind.
    Danke!

    Gruß,
    Lasse

  • Könntest du das auch noch so machen das er das vom _arraydisplay von hinten nach vorne ausliest?

    Danke

    Gruß,
    Lasse

  • Ja genau, aber er soll dann alle der umgedrehten arrays wieder auslesen.

    also ich will:
    das zb. der term
    5x - 10 = 20

    mit 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]


    #include<Array.au3>
    $a = StringStripWS('5 + x - 10 + 8 = 20 + 5', 8)
    $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)

    [/autoit]
  • 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.

  • 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. :D
    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 :D - 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.