Eingabemaske entwickeln



  • cout << "Hallo Welt"; 😉

    Ok, habe Folgendes:
    Ich habe ein kleines Matheprogramm geschrieben, welches eine numerische Integration einer Funktion durchführt, und dies funktioniert auch alles wunderbar.

    Mein Ziel ist es nun das ich die Funktion aber nicht im Queltext definieren möchte, sondern das diese vom Benutzer eingegeben werden kann, und zwar keine langweiligen linearen Funktion bzw. Funktionen n-ten Grades, sondern, schon etwas anspruchsvollere Gebilde.

    Hier setzt dann das Problem ein:
    Die Funktion kann natürlich als String eingelesen werden, aber wie mache ich aus einzelnen Zeichen, welche ja Ziffern,Zahlen,Operatoren etc. sind wieder genau diese (würde ich unter Umständen über die ASCII-Tabelle hinbekommen) vor allem aber, wie bekomme ich die Funktionalität der Operatoren von +,-,+,(,) etc. wieder, um die eingelesene Funktion im Quelltext weiterverarbeiten zu können?

    best thx
    pat



  • ich hoffe ich hab dich richtig verstanden...

    angenommen du kriegst sowas wie 5x+7=1, dann muss dein programm das x als die gesuchte variable erkennen und erkennen, dass 5 dieser "ixe" plus 7 gleich eins ist. das hört sich jetzt dummsimpel an, aber programmier das erstmal! (ich weiss... ich sollte dir lieber helfen... aber ich versuch es ja)



  • Ja, hast du ganz richtig verstanden.
    Aber sowas als einfach Version hab ich schonmal programmiert und das klappt auch solange es nur Ziffern! sind.
    Jetzt geht um Logarithmus- und Exponentialfunktionen, und wie man einen string so zerlegt das z.B. ln,exp,+,-,*,/ und Klammern nach dem Einlesen als Operatoren weiterverarbeiten kann 😉

    Pat



  • ...wir kommen der sache näher.

    ok, dann überleg dir doch erstmal ein bestimmtes eingabeformat. ich studiere zwar nicht mathe, aber die mathematik gibt bestimmte regeln und schreibweisen vor. die musst du auf dein programm abbilden. WIE du das machst, ist allein deine sache! ein vorschlag:

    $dein_programm> LN(1293) + EULER(15) - ROOT(23) = x

    Das wäre dann gleichbedeutend mit ln(1293) + e^15 - wurzel aus 23 = x, naja, ist ja offensichtlich. jedenfalls solltest du dir vorher überlegen, anhand welcher EINDEUTIGEN konstrukte du die jeweiligen operationen unterscheidest. das wäre in meinen augen erstmal wichtig.



  • Danke für die Antwort,
    aber das ist mir schon klar.
    Ich suche lediglich nach einer Methode einen string auswerten zu können.
    Kleines Beispiel:

    main() {
    char f[50];
    cin >> f; // Eingabe der Funktion: exp(x+1)
    }

    Heraus kommt dann ja für f[0]-f[2] die Zeichenkette "exp", für f[3] eine Klammer etc.

    Ich suche jetzt nach einer Möglichkeit dem Compiler zu erklären das er aus den Zeichen f[0]-f[2] die Funktion "exp()" interpretiert, oder nach einer Möglichkeit ein Ausführen dieser Funktion zu erwirken.

    😉

    thx



  • gut, gut...

    nun also bist du am kritischen punkt angelangt (zumindest sehe ich das so). ich denke mal kurz nach... [...zzz...]

    also... wenn ich dich richtig verstehe, dann existiert in deinem programm schon eine logik, die einen ausdruck wie exp(x+1) auswerten kann. du willst dem compiler ja nur sagen, dass er sie aufrufen soll (mit dem entsprechenden parameter, nehme ich an).

    das "trennen" von funktionsname/-aufruf und dem parameter musst du schon selbst programmieren, d.h. diesen parser musst du selbst schreiben. ich sehe zumindest keine andere möglichkeit.

    und das genannte problem ist ja ein recht kleines. ich kenne mich damit zuwenig aus, aber für sowas muss es doch literatur im netz geben, oder nicht? ich google mal los, vielleicht finde ich was.



  • das "trennen" von funktionsname/-aufruf und dem parameter

    Genau DAS ist aber das Problem 😉
    Hilft mir leider nicht weiter



  • Such mal mit Google zu den Stichworten

    Parser oder Funktionsparser, wenns ein bissl theortischer werden darf auch
    Grammitk oder Automat(-entheorie).

    Da wird dir geholfen werden.



  • jep,automatentheorie is für dichd as richtige.
    aber das is net so einfach, damit wirste en paar wochen beschäftigt sein(wenn dus richtig machen willst)

    aber mal ein bischen zur theorie:
    verwendete ausdrücke:
    zahl
    bezeichner
    temp(eine hilfszahl(das ergebnis einer rechnung))
    term(einmal term im mathematischen sinne, kann aber auch eine zahl oder ein bezeichner sein)

    es geht um folgendes problem:
    1+1*2(da sind erstmal alle grundlegenden schwierigkeiten enthalten)
    wenn man sich das so ansieht,sieht man, dass 1*2 als erstes ausgerechnet werden muss,da wir ansonsten (1+1)*2 berechnen würden.

    dh, wir müssten den oberen ausdruck wie folgt übersetzen:
    zahl+term
    bei folgendem ausdruck müsste es bezeichner+term heissen:
    x+1*2

    x1+2 ist auch nicht weiter kompliziert.
    das ist nur temp=zahl
    term(1)
    temp+term(2)
    temp ist direkt äquivalent zu zahl, es war leider nicht anders darzustellen

    das waren jetzt die grundlagen, merke:
    zahlen und bezeichner können nur am anfang eines ausdrucks auftreten, jeder ausdruck endet mit einem term.
    ausdrücke können nie mehr als einen operator haben.
    das hört sich zwar jetzt sehr trivial an, ist aber im folgenden ungemein wichtig.

    wenn man einen mathematischen ausdruck mal als "baum" betrachtet, kommt man bei a=1+1*2 zu folgendem ergebnis:

    =
     / \
    a   temp//rückgabewert von 1+1*2
         \
          +
         / \
       zahl temp//dies ist der rückgabewert, wenn man den term,also 1*2 ausrechnet
             \
              *
            /  \
       zahl  zahl
    

    was sieht man daran?
    1.es ist der beweis dafür, dass ein ausdruck nie mehr als einen operator haben kann,es ist schlicht nicht möglich(und auch nicht sinnvoll, da es einfach zuviele möglichkeiten gäbe die operatoren zu kombinieren)
    2. um eine mathematische Aufgabe lösen zu können muss man in einem baum rekursiv zum rechten knoten des tiefsten operators gehen,und sich dann über den operator rechnenderweise wieder nach oben hangeln.

    aufjedenfall musst du nun deinem programm "nurnoch" beibringen, eine mathematische aufgabe in ein baumschema zu unterteilen.
    kleiner tipp dazu:
    1+23 ist äquivalent zu:
    1 2 3
    +



  • Na das ist doch mal ne Antwort, genau über so eine Aufteilung grüble ich schon die ganze Zeit.

    Fertige Codes gibts ja viele, aber sowas selbst zu schreiben ist für mich ne kleine Herausforderung.
    Danke für die Hinweise 😉

    Pat



  • hier die literatur aus der ich mein wissen hab(ist die referenz auf dem markt, aber verdammt kryptisch geschrieben)
    das Drachenbuch


Anmelden zum Antworten