Shunting-Yard-Algorithmus (Funktionsplotter)

  • Hallo Ihr lieben,


    ich bin momentan in der Endphase meiner Studienarbeit. Die Aufgabe besteht darin, einen Funktionsplotter in Android zu realisieren. Mithilfe vom Shunting-Yard-Alogrithmus möchte ich die eingegebene Funktion in die Umgekehrte Polnische Notatoin überführen und dann mit verschiedenen x-Werten auswerten. Dazu möchte ich das Ergebnis des Shunting-Yards (also bei 5+3 bspw. 53+) in einem Textview ausgeben. Der Code sieht folgendermaßen aus:



    Leider erhalte ich als Ergebnis nur genau das eingegebene, nichts verändertes. Weiß jemand, woran das liegen könnte?

  • Der Code ist von der Seite :) habe ihn nur ein wenig umgeändert, den "Hauptteil" ins TextView gesteckt, dort die Variablenübergabe aus der vorigen Activity eingesetzt und am Ende den Output wieder in ein TextView gesteckt...Wäre super wenn du meinen Fehler findest :)

  • Du kannst deine eigenen Eintragungen in das Textfeld oben vornehmen, auf den Button klicken und eine Ausgabe erhalten - Fehler werden nicht abgefangen. :D


    ShuntingYard.java (dein eigenes Package nicht vergessen ganz oben zu belassen!)




    activity_main.xml


  • Vielen Dank schonmal für die Antwort! Habe das EditText entfernt, weil die Funktion, mit der der Algorithmus durchgeführt wird, aus einer anderen Activity kommt und deswegen ja schon bestimmt ist...die methode onClick() sieht jetzt so aus:


    Code
    public void onClick(View view) {
            String Function = getIntent().getStringExtra("funktion"); 
     textView.setText("RPN: " + RPN(Function));    }



    Der String Function wird aus der anderen Activity geholt, dann soll der Algorithmus durchgeführt werden. An diesem selbst habe ich nichts verändert, nur leider kommt bei Eingabe von bspw. 6+4 auch als Ausgabe 6+4 und es müsste doch eigentlich 64+ als Ergebnis kommen..

  • Oh Gott ...
    Habe das voll verpennt - hier:


    Java
    for (String token : toNewNot.split("\\s"))


    Du splittest nach jedem Leerzeichen, ich habe das verwechselt, dachte \\s wäre einfach ein leerer String, haha. :D
    Dementsprechend erhält er Folgendes bei "6+4":
    Er erhält als "token" eben "6+4".


    Solltest du solche Schreibweisen bevorzugen, müsstest du das obige \\s durch ein "" austauschen; ich jedoch würde es so stehen lassen.
    Bei "6 + 4" durchläuft er die for-Schleife 3x, da er "6", "+" und "4" als "token" bekommt und diese dementsprechend abhandeln kann.

  • Wäre es nicht einfacher, via StringBuilder den jeweilige Operatoren zu suchen, herauszuschneiden und hinten an zu fügen?
    Oder habe ich nur die Möglichkeit einer komplexeren Gleichung übersehen?

    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Daraus folgt: je mehr Käse, desto weniger Käse.


    »Dies ist ein Forum. Schreibt Eure Fragen in das Forum, nicht per PN!«

  • Wäre es nicht einfacher, via StringBuilder den jeweilige Operatoren zu suchen, herauszuschneiden und hinten an zu fügen?
    Oder habe ich nur die Möglichkeit einer komplexeren Gleichung übersehen?


    Code
    infix:   3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3
    postfix: 3 4 2 * 1 5 - 2 3 ^ ^ / +


    Einfaches Anfügen ist da leider nicht so 'einfach'. Oder habe ich deine Idee nur halb-richtig interpretiert?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!