Postfix-Rechner: mehrere math. Operationen nacheinander ausführen

Haave

Top Contributor
Hallo,

ich habe einen kleinen Postfix-Rechner gebastelt, dieser kann beliebig viele Argumente nehmen und an diesen eine einzige mathematische Operation ausführen. Zwei Beispiele:
Code:
java PostfixRechner 3 8 4 7 +
ergibt 22,
Code:
java PostfixRechner 100 4 5 /
ergibt 5 (weil 100/4 = 25, 25/5 = 5).
Das ist der Code für das oben beschriebene, funktionierende Programm:
Java:
class PostfixRechner {
	
	public static void main(String[] args) {
		PostfixRechner kalki = new PostfixRechner();
		System.out.println("Ergebnis: "+kalki.calcMultiArgs(args));
	}
	
	private int result;
	
	public int calcMultiArgs(String[] args) {
		/*Alle Argumente werden ihren zugehoerigen Arrays zugewiesen:
		 *die ints ins eine, die Strings ins andere.
		 *Habe mal gelesen, dass es schwierig sein soll, zu ueberpruefen,
		 *ob etwas ein int ist oder etwas anderes. Darum mache ich es so
		 *mit try/catch. Hoffe, das ist nicht total fail…
		 */
		int[] argsAsInts = new int[args.length];
		String[] operators = new String[args.length];
		for(int i = 0; i < args.length; i++) {
			try {
				argsAsInts[i] = Integer.parseInt(args[i]);
			} catch(NumberFormatException n) {
				operators[i] = args[i];
			}
		}
		//System.out.println("Argumente: "+argsAsInts.length);
		
		//Berechnung
		result = argsAsInts[0]; //weise result den Wert des 1. Args zu, um damit Berechnungen auszufuehren
								//wichtig, da Kommutativgesetz bei Subtraktion & Division nicht gilt
		
		for(int i = 0; i < args.length; i++) {
			if(operators[i] != null) {
				if(operators[i].equals("+")) {
					for(int x = 1; x < i; x++) {
						result += argsAsInts[x];
					}
				} else if(operators[i].equals("-")) {
					for(int x = 1; x < i; x++) {
						result -= argsAsInts[x];
					}
				} else if(operators[i].equals("x")) {
					for(int x = 1; x < i; x++) {
						result *= argsAsInts[x];
					}
				} else if(operators[i].equals("/")) {
					for(int x = 1; x < i; x++) {
						try {
							result /= argsAsInts[x];
						} catch(ArithmeticException a) {
							System.out.println("Division durch 0 ist nicht zulaessig!");
						}
					}
				} else System.out.println("Das eingegebene Zeichen ist kein zulaessiger Operator."); //wird nicht ausgegeben bei "#", warum?
			}
		}
		return result;
	}
}

Nun folgendes:
Ich möchte das Programm dahingehend erweitern, dass es auch mit solchen Eingaben umgehen kann:
Code:
24 3 / 3 +
. Diese Eingabe sollte so rechnen: 24/3 = 8, 8+3 = 11.
Es hängt bei mir daran, dem Programm mitzuteilen, dass es bei allen Operatoren, die nach dem ersten Operator kommen, immer nur bis zum letzten Element vor dem letzten Operator zurückgehen soll. Es soll also bspw. so laufen:
Code:
1 2 3 4 + 3 1 1 -
Programm "guckt" bis Stelle 4 (Stelle d. Plus-Operators) und addiert alle Zahlen auf, bis der Anfang des Argumente-Arrays erreicht wird (Zwischenergebnis: 10). Dann guckt es bis Stelle 8 (Minus-Operator) und zieht von dem bisherigen Zwischenergebnis die gefundenen Zahlen ab (also 10-3-1-1) und hört auf, sobald er zur Stelle kommt, an der er zuvor das Plus fand.

Ich habe da nun schon kräftig rumgefrickelt, aber werde allmählich immer verwirrter… :(
Aktueller Code:
Java:
	private java.util.ArrayList<Integer> merkzahl; //NEU: dient zum Speichern der Positionen d. Operatoren
	
	public int calcMultiArgsExtended(String[] args) {
		int[] argsAsInts = new int[args.length];
		String[] operators = new String[args.length];
		java.util.ArrayList<Integer> merkzahl = new java.util.ArrayList<Integer>();
		int y = 0; //fuer den Zugriff auf die Elemente von merkzahl
		for(int i = 0; i < args.length; i++) {
			try {
				argsAsInts[i] = Integer.parseInt(args[i]);
			} catch(NumberFormatException n) {
				operators[i] = args[i];
				merkzahl.add(i); //Position d. Operators wird festgehalten
				System.out.println("Operator an Position "+merkzahl.get(y)); //ACHTUNG: Positionsnummer != Stelle im Array!!
				y++;
			}
		}
		y = 0; //wird wieder 0 gesetzt, um anschliessend damit arbeiten zu koennen
		System.out.println("Argumente: "+argsAsInts.length);
		
		//Berechnung
		//result = argsAsInts[0]; //weise result den Wert des 1. Args zu, um damit Berechnungen auszufuehren
								  //wichtig, da Kommutativgesetz bei Subtraktion & Division nicht gilt
								  //NEU: momentan auskommentiert, um die Addition lauffaehig zu kriegen
		
		for(int i = 0; i < args.length; i++) {
			if(operators[i] != null) {
				if(operators[i].equals("+")) {
					for(int x = 1; merkzahl.get(y)-x > merkzahl.get(y-1) || merkzahl.get(y)-x != 0; x++) { //ich hab mittlerweile den Ueberblick darueber
						result += argsAsInts[merkzahl.get(y)-x];										//verloren, was ich in diesen 2 Zeilen tue :(
						System.out.println("result ist jetzt gerade "+result);
					}
				} else if(operators[i].equals("-")) {
					for(int x = 1; x < i; x++) {
						result -= argsAsInts[x];
					}
				} else if(operators[i].equals("x")) {
					for(int x = 1; x < i; x++) {
						result *= argsAsInts[x];
					}
				} else if(operators[i].equals("/")) {
					for(int x = 1; x < i; x++) {
						try {
							result /= argsAsInts[x];
						} catch(ArithmeticException a) {
							System.out.println("Division durch 0 ist nicht zulaessig!");
						}
					}
				} else System.out.println("Das eingegebene Zeichen ist kein zulaessiger Operator."); //wird nicht ausgegeben bei "#", warum?
				y++;
			}
		}
		return result;
	}

Wahrscheinlich denke ich viel zu kompliziert. Gerade beim Tippen dieses Beitrags kam mir die Idee, erst mal alle eingegebenen Argumente in einen einzigen String zu packen und es dann mit Substrings zu machen… Ehe ich jetzt weiterfrickele: hat von euch jemand eine Idee und kann mir helfen?
 

Der Müde Joe

Top Contributor
Alle Zahlen in einen Stack hauen bis ein Zeichen kommt, dann alles mit dem Zeichen verrechneen -> Eine Zahl (lösung) im Stack.
Dann Stack wieder füllen mit Zahlen bis ein Zeichen kommt...verrechnen -> Eine Zahl im Stack
solange bis kein Zeichen mehr kommt --> Eine Zahl im Stack --> Lösung
 

Der Müde Joe

Top Contributor
vielleicht so:
Java:
import java.util.LinkedList;
import java.util.Queue;


public class Calc {

	private Queue<Integer> queue = new LinkedList<Integer>();

	private enum Sign {
		PLUS, MINUS;
	}

	public void push(Integer number) {
		queue.add(number);
	}

	public void calc(Sign sign) {
		int result = queue.poll();
		while (!queue.isEmpty()) {
			switch (sign) {
				case PLUS:
					result += queue.poll();
					break;
				case MINUS:
					result -= queue.poll();
					break;
			}
		}
		push(result);
	}

	public int getResult() {
		return queue.peek();
	}

	public static void main(String... _) {
		Calc calc = new Calc();
		// parse some: "1 2 3 + 3 -"
		calc.push(1);
		calc.push(2);
		calc.push(3);
		calc.calc(Sign.PLUS);
		System.out.println(calc.getResult());
		calc.push(3);
		calc.calc(Sign.MINUS);
		System.out.println(calc.getResult());
		calc.push(3);
		calc.calc(Sign.MINUS);
		System.out.println(calc.getResult());
	}
}

EDIT:
eigentlich wäre ne Deque besser und das (Zwischen-) Resultat dann mit getFirst hohlen.
 
Zuletzt bearbeitet:

Ark

Top Contributor
Hm, die Sache ist etwas kompliziert. Da nicht alle Operatoren explizit genannt werden (z.B. [c]1 2 3 4 5 +[/c] statt [c]1 2 + 3 + 4 + 5 +[/c]), muss man sich was überlegen (z.B. eine Markierung auf den Stack hauen bzw. selbst eingeben).

Denn wofür steht folgende Formel?
1 2 3 4 + *

Deutung 1:
1 * (2 + (3 + 4))

Deutung 2:
1 * (2 * (3 + 4))

Vielleicht habe ich das Problem gerade auch nur völlig falsch verstanden. :bahnhof:

Ark
 

Der Müde Joe

Top Contributor
Ich dachte eigentlich, das ist so eine Art primitiver Postfix. dh lese Zahlen bis ein Operator kommt und dann rechne alle Zahlen voher mit dem Operator zusammen.
???:L
 

Haave

Top Contributor
Danke erst einmal soweit für eure Antworten.

@Der Müde Joe:
Dankeschön für den Denkanstoß, da werde ich wohl mal API und Lehrbuch wälzen müssen, um deinen Code zu verstehen, habe noch keine Erfahrung mit Collections, enums und Zeug auf den Stack tun. Wahrscheinlich habe ich mir da zu viel vorgenommen… :oops:

@Ark:
Du bist schon einen Schritt zu weit. Ich habe mich auch schon gefragt, ob Klammerungen ermöglicht werden sollten, fand dann aber, dass ich erst einmal den aktuellen Ansatz lauffähig umsetzen sollte. Ich meinte es so, wie auch Der Müde Joe es offenbar verstanden hat.
 

Landei

Top Contributor
Soweit ich weiß ist das Hauptargument für die leicht gewöhnungsbedürftige UPN ja gerade, dass man keine Klammern braucht.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G InFix zu Postfix (upn) Java Basics - Anfänger-Themen 2
H Postfix Operatoren Java Basics - Anfänger-Themen 2
N BMI Rechner Was haltet ihr von dem Code habt ihr Verbesserungsvorschläge weil design teschnisch ist das nicht das geilste würde das gerne überarbeiten Java Basics - Anfänger-Themen 12
Renjiroo Java Bmi Rechner mit Methoden Java Basics - Anfänger-Themen 4
T BMI Rechner fehlerhaft Java Basics - Anfänger-Themen 18
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
Animal-Mother BMI Rechner erstellen für W/M Java Basics - Anfänger-Themen 7
Alan6 Java Editor BMI Rechner Java Basics - Anfänger-Themen 7
Nerdinfekt BMI Rechner, fehler beim Zurückgeben des Strings? Java Basics - Anfänger-Themen 2
M Rechner programmieren Java Basics - Anfänger-Themen 3
Z BMI-Rechner Java Basics - Anfänger-Themen 1
F Trinkgeld Rechner und Promillenrechener Hilfe Java Basics - Anfänger-Themen 3
R java.lang.ArrayIndexOutOfBoundsException: 0 Rechner Error Java Basics - Anfänger-Themen 4
S Erste Schritte Java GUI - Rechner erstellen Java Basics - Anfänger-Themen 4
$ Multiplikations-Rechner mit while Schleife Java Basics - Anfänger-Themen 8
J double_Problem im ZinsesZins Rechner Java Basics - Anfänger-Themen 33
K (Taschen)Rechner Java Basics - Anfänger-Themen 8
M Abitur-Noten-Rechner Java Basics - Anfänger-Themen 2
G Welche Java-Version auf meinem Rechner? Java Basics - Anfänger-Themen 2
B Strategy Pattern - Rechner Java Basics - Anfänger-Themen 6
N Einfacher Rechner (für mich nicht so einfach) Java Basics - Anfänger-Themen 5
thet1983 rechner anfaengerfehler? Java Basics - Anfänger-Themen 10
B BMI Rechner Java Basics - Anfänger-Themen 2
H DriveByZero Exception - BMI-Rechner Java Basics - Anfänger-Themen 12
B Co2 rechner hilfe beim programmieren Java Basics - Anfänger-Themen 10
P Bitte um hilfe bei einfachem Rechner Java Basics - Anfänger-Themen 7
B Std-Serialisierung - Speichern/Laden geht nur auf einem Rechner Java Basics - Anfänger-Themen 17
C Rechner Java Basics - Anfänger-Themen 19
B Verbindung zu einen anderen Rechner Java Basics - Anfänger-Themen 2
N Datenaustausch zweier rechner Java Basics - Anfänger-Themen 4
M BMI-Rechner NumberFormatException Java Basics - Anfänger-Themen 30
Jats Kosinussatz-Rechner Java Basics - Anfänger-Themen 9
C Bmi rechner programmieren Java Basics - Anfänger-Themen 72
B JavaWebStart - Anwendung läuft nur auf einem Rechner Java Basics - Anfänger-Themen 6
P Einfacher Rechner Java Basics - Anfänger-Themen 2
P UPN Rechner Java Basics - Anfänger-Themen 1
F Upn-Rechner Java Basics - Anfänger-Themen 15
B mit Wecker den Rechner aus Standby/Ruhemodus holen Java Basics - Anfänger-Themen 19
R Jar Datei läuft auf neuem Rechner nicht mehr Java Basics - Anfänger-Themen 15
Developer_X Applet auf lokalem Rechner mit der EingabeAufforderung Starten Java Basics - Anfänger-Themen 44
S Was ist falsch an meinem Rechner? Java Basics - Anfänger-Themen 7
M externes Programm auf anderen Rechner ausführen lassen Java Basics - Anfänger-Themen 2
kulturfenster Wie implementiert man einen Rechner in Java? Java Basics - Anfänger-Themen 5
kulturfenster Rechner und ActionListener Java Basics - Anfänger-Themen 11
C DM -> Euro Rechner aber nur mit Operanden des Typs intege Java Basics - Anfänger-Themen 12
G Java Rechner Java Basics - Anfänger-Themen 10
G frage bluej für bmi rechner programmieren Java Basics - Anfänger-Themen 5
T Rechner-Name abfragen Java Basics - Anfänger-Themen 6
C Problem mit dem Rechner Java Basics - Anfänger-Themen 4
G Rechner aus ! Java Basics - Anfänger-Themen 5
M Exel-Rechner in Java ausgeben Java Basics - Anfänger-Themen 13
N Java Rechner Java Basics - Anfänger-Themen 3
D Java Rechner und Einlesen Problem (mit hasNext) Java Basics - Anfänger-Themen 2
W Rechner von quadratzahlen ! fehler Java Basics - Anfänger-Themen 4
P Rechner ^^ Java Basics - Anfänger-Themen 10
K BMI Rechner - wo ist der Fehler? Java Basics - Anfänger-Themen 4
D Rechner programmieren Java Basics - Anfänger-Themen 5
P Mediacenter Userinterface auf langsamem Rechner Java Basics - Anfänger-Themen 5
M Windows Projekt auf Linux Rechner Java Basics - Anfänger-Themen 2
B komische NumberFormatException beim DezimalToBinär-Rechner Java Basics - Anfänger-Themen 4
lan2711 Class Dateien auf anderen Rechner zum Laufen kriegen. Java Basics - Anfänger-Themen 5
P Program funktioniert nur bei Rechner die jdk haben Java Basics - Anfänger-Themen 4
rambozola jar-datei von cd auf rechner ohne jvm starten Java Basics - Anfänger-Themen 2
N SSH-Verbindung zu entferntem Rechner aufbauen Java Basics - Anfänger-Themen 5
L Class-Datei auf anderem Rechner Java Basics - Anfänger-Themen 9
H JDK 1.4.2 UND 1.1.8 auf gleichem Rechner Java Basics - Anfänger-Themen 15
X Programmstart auf anderem Rechner... Java Basics - Anfänger-Themen 15
C Java soll Datei auf rechner Finden Java Basics - Anfänger-Themen 2
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
T Mehrere if bedingungen ohne & Java Basics - Anfänger-Themen 2
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
MiMa Java Doc mehrere Return Parameter Java Basics - Anfänger-Themen 11
javaBoon86 Array mehrere Dimensionen Java Basics - Anfänger-Themen 10
Buroto Klassen Mehrere .txt Datein verbienden und anschließend auslisten Java Basics - Anfänger-Themen 10
S mehrere TreeSets so speichern, dass man sie miteinander vergleichen kann Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
M Mehrere Daten/ Variablen Speichern Java Basics - Anfänger-Themen 9
C mehrere JPanel in ein JFrame bringen Java Basics - Anfänger-Themen 9
L Beim Java Programmstart, mehrere Parameter über die Kommandozeile übergeben Java Basics - Anfänger-Themen 9
D mehrere Berechnungen in einer Methode Java Basics - Anfänger-Themen 9
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
Kotelettklopfer Mehrere Projekte in einem Git verwalten Java Basics - Anfänger-Themen 10
I JAX-RS Mehrere Parameter in Query Java Basics - Anfänger-Themen 3
M mehrere Rückgabenwerte aus Methode Java Basics - Anfänger-Themen 7
A Input/Output Mehrere Csv-Dateien einlesen Java Basics - Anfänger-Themen 2
R Mehrere Buchstaben aus einem String entfernen Java Basics - Anfänger-Themen 1
TimoN11 Java - Eine oder mehrere Eingaben möglich machen Java Basics - Anfänger-Themen 6
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
S Mehrere Probleme im Code Java Basics - Anfänger-Themen 7
Ich lerne Java. Methoden Mehrere Methoden mit Punkt Java Basics - Anfänger-Themen 45
M Ausgabe einer Liste welche mehrere Stacks enthält Java Basics - Anfänger-Themen 3
D OOP- Eine Klasse in mehrere Klassen aufteilen Java Basics - Anfänger-Themen 7
F Mehrere Server Sockets in einer Anwendung Java Basics - Anfänger-Themen 9
T DoWhile Schleife über mehrere Mothoden Java Basics - Anfänger-Themen 5
B Methoden Mehrere ähnliche Methoden zusammenfassen Java Basics - Anfänger-Themen 24
E Mehrere Eingabezeilen gleichzeitig einlesen Java Basics - Anfänger-Themen 7
C Mehrere Zufallswerte Java Basics - Anfänger-Themen 4
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
R Error, wenn mehrere Clients gleichzeitig die Verbindung beenden Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Neue Themen


Oben