string als Teil des Quellcodes nutzen



  • Hi,
    ich bin grade dabei, mich in C einzuarbeiten und programmiere dafür die Newton Iteration.

    Tja, an sich klappt alles gut, nur will ich jetzt das Programm so erweitern, dass der Nutzer die zu bearbeitende Gleichung selber eingeben kann.
    Das heiß ich bekomm durch die Eingabe nen String, z.B. sowas wie "x*(x-2)"

    Das Problem: das "x" in diesem string soll immer wieder durch Werte ersetzt werden (logischerweise in einem integer x gespeichert, der während der Iteration immer neue Werte bekommt).

    Ich hab daran gedacht, den string irgendwie in den Quellcode zu setzen, so dass dann alles seinen Gang geht (x wird automatisch durch den Variablenwert ersetzt).
    Die Frage ist nur: Wie? 😕



  • C ist eine compilierte Sprache, da geht sowas nicht direkt (du könntest höchstens die Eingabe parsen und daraus eine Datenstruktur erstellen, mit der du anschließend rechnen kannst).



  • Hmm, ich glaub da komm ich nicht ganz mit.
    warum soll ich das Ding den parsen? Die eingabe ist an sich ja ok, da müssen keine störenden Elemente beseitigt werden...
    aber vieleicht erschließt sich mir das ganze besser,wenn ich wüsste, wie genau du die Umwandlung in eine Datenstruktur meinst. 😉



  • Du mußt das ganze schonmal parsen, um zu erkennen, daß es etwas sinnvolles ist - für dein Programm ist die Eingabe zunächst nur ein Haufen an Zeichen. Nach dem Parsen könntest du dann daraus eine Art Syntaxbaum herausbekommen, den du dann rekursiv "berechnen" kannst:

    '*'
      /   \
     x     '-'
          /   \
         x     2
    

    durch so ein Gebilde könntest du schonmal rekursiv durchlaufen:

    typedef struct elem
    {
      union{char op;int val}value;
      struct elem *l,*r;
    }element;
    
    int calc(elem* root)
    {
      if(root->r == NULL)
        //Behandlug der Wurzelknoten - Konstanten oder Variablen
      else switch(root->value.op)
      {
        case '+': return calc(root->l)+calc(root->r);
        ...
      }
    }
    

Anmelden zum Antworten