2013-01-01 12 views
5

Ich bin sehr neu in Java und ich baue einen Rechner, der eine Gleichung nimmt und sie auswertet.Klammern geben

Ich benutze die Scanner-Methode, um eine Eingabe zu erhalten, aber das bedeutet, dass meine Eingabe ein Scanner-Typ ist. Was soll ich mit diesem Input tun, damit ich ihn bewerten kann? Und wenn ich es beurteilen kann, wie kann ich den Klammern Vorrang geben? Zum Beispiel, für die Gleichung (5 * (4 + 3)) * 2, möchte ich, dass das Programm zuerst (4 + 3) auswertet, dann wird es mit 4 multipliziert, dann wird alles mit multipliziert 2.

Vielen Dank.

+0

Sie müssen Ihren Ausdruck (keine Gleichung, da kein Gleichheitszeichen vorhanden ist) als String einlesen und parsen. Die Verwendung eines 'Scanners' bringt Sie nicht sehr weit in diesem Prozess, außer das Lesen einer Textzeile. –

+0

Was Sie getan haben, ist richtig, der Vorrang wird von links nach rechts gegeben. Oder Sie können ((4 + 3) * 5) * 2 verwenden. Die inneren Klammern werden zuerst ausgewertet. –

+1

Legen Sie Ihre Bediener, einschließlich Klammern, in einen Stapel. – user1929959

Antwort

3

Was Sie brauchen, ist Dijkstra Shunting Yard Algorithm. Dadurch wird die mathematische In-fix-Notation in eine Post-Fix-Notation umgewandelt, die alle Probleme mit Operatorenpriorität und Klammern sauber sortiert, da die Postfix-Notation für beide keinen Bedarf hat. Die Wikipedia-Seite enthält ein vollständiges Beispiel in C, das in Java übersetzt werden könnte.

1

@Simon Gs Vorschlag, Dijkstras Shunting Yard-Algorithmus zu verwenden, hat es geschafft. Sie müssen die "Mikrogrammatik" implementieren, um die Symbole zu analysieren, aber Scanner kann 95% der Arbeit erledigen.

Eine Alternative wäre, den Ausdrucksparser mit einem Parsergenerator wie ANTLR oder Javacc zu implementieren und dann die Auswertung als Traversierung des Baums zu implementieren. Aber das ist Schwergewicht, wenn Sie den Ausdruck einfach einmal auswerten wollen.

Schließlich möchte ich feststellen, dass, während dies ein bekanntes (gelöstes) Problem ist, es kein triviales ... in jeder Sprache ist. Und vielleicht sagt Ihnen das, dass Sie etwas mehr über Algorithmen und/oder Compiler lesen müssen, um Ihr Wissen zu vervollständigen.

+0

Rekursive Abstammung ist eine andere Möglichkeit, und wahrscheinlich meine erste Wahl, aber dann weiß ich schon, wie es geht ;-) – EJP