Burdy Geschrieben 15. Mai 2009 Geschrieben 15. Mai 2009 Hallo Ich möchte einen Stapelrechner für die UPN schreiben (also sowas wie 5 3 - = -2) Das sieht zur Zeit so aus: (LinkedListSTack ist eine Stapelliste) public class IntRechner { /** Nimmt die beiden obersten Zahlen vom Stapel und rechnet mit ihnen gemäß 'operator' und legt das Ergebnis auf den Stapel zurück * @param ll ein LinkedListStack, von dem die Zahlen genommen werden * @param operator der Operator, der auf die Zahlen angewendet wird */ public static void Rechner(LinkedListStack ll, char operator) { int a = 0, b = 0; try { a = (Integer) ll.top(); ll.pop(); b = (Integer) ll.top(); ll.pop(); } catch (StackException e) { // Leerer-Stapel-Fehler abfangen System.out.println("Kein gültiger Aufruf mit UPN! Bitte Argumente prüfen."); System.exit(0); } switch (operator) { // Ergebnis abhängig vom Operator bestimmen und zurück auf den Stapel legen case '+': ll.push(a+; break; case '-': ll.push(a-; break; case '*': ll.push(a*; break; case '/': try { // Division durch 0 abfangen ll.push(a/b); } catch (ArithmeticException e) { System.out.println("Division durch 0!"); System.exit(0); } break; case '%': ll.push(a%; break; default: // operator ist kein gültiger Operator System.out.println("'" + operator + "' ist ein ungültiger Operator. Nur +, -, *, /, % sind erlaubt. Abbruch!"); System.exit(0); } } /** Liest die Zahlen und Operatoren in UPN, mit der IntRechner aufgerufen wurde und berechnet das Ergebnis */ public static void main(String[] args) { if (args.length == 0) { // Auruf ohne Argumente abfangen System.out.println("Aufruf mit 'Intrechner zahl zahl operand' (UPN)"); System.exit(0); } int i = 0; LinkedListStack<Integer> ll = new LinkedListStack<Integer>(); System.out.println(args.length); while (i < args.length) { try { ll.push(Integer.parseInt(args[i])); // Aufruf-Argumente werden von String in Int umgewandelt } catch (NumberFormatException n) { // Argument kein String -> Operator if (args[i].length() != 1) { System.out.println(args[i]+" ist weder Zahl noch Operand, abbruch"); System.exit(1); } char operator = args[i].charAt(0); Rechner(ll, operator); // Operator anwenden } i++; } if (ll.size() != 1) { // Stapel ist nach Abschluss aller Operationen leer oder es liegen noch mehr Zahlen, als das Endergebnis auf ihm System.out.println("Kein gültiger Aufruf, auf dem Stapel liegt nicht nur noch das Ergebnis (" + ll +")"); } else { try { System.out.println("Das ergebnis ist " + ll.top()); } catch (StackException e) { } } } }[/code] Das funktioniert so weit. Aufruf unter Linux mit zB "java IntRechner 5 4 -" gibt "-1" aus. Addition geht, Subtraktion geht, Division auch. Aber wenn ich "5 4 *" eingebe, kommt es zu einem Fehler. Den Grund hab ich schon herausgefunden. Wenn ich ein '*' verwende, ist die Länge vom String-Feld "args" bei "5 4 *" nicht 3, sondern 16. Es werden alle Dateien in dem Ordner, in dem IntRechner liegt als Argument mitübergeben und es kommt zu einem Fehler, weil dann in "args" Strings stehen, die weder Zahl noch Operator sind. Kann mir jemand sagen, wieso bei Stern '*' die Dateien im Ordern mitübergeben werden als Argumente und wie ich das verhindern kann? Zitieren
toobeee Geschrieben 15. Mai 2009 Geschrieben 15. Mai 2009 (bearbeitet) wenn ich mich recht erinnere war das ein build-in command der shell, mit * werden alle dateien (auch versteckte) dateien das verzeichnisses ausgelesen. du kannst jetzt entweder vereinbaren das ein anderes zeichen für die Multiplikation verwendet wird z.b. der buchstabe x oder du kannst das * in Anführungszeichen setzen. bei letzterem müsste das zeichen als string-constante interpretiert werden. edit: build-in commando ist es nicht, aber das asterix wird als wild-card benutzt und bewirkt u.a. das oben beschriebene verhalten. Bearbeitet 15. Mai 2009 von toobeee Zitieren
perdian Geschrieben 15. Mai 2009 Geschrieben 15. Mai 2009 Die Bash löst '*' auf bevor das eigentliche Executable (in diesem Falle java) aufgerufen wird und übergibt alle auf die Wildcard passenden Dateien als Parameter an die main Funktion. It's not a bug, it's a feature ;-) Zitieren
Burdy Geschrieben 15. Mai 2009 Autor Geschrieben 15. Mai 2009 Ok. Danke. Werd ich das * mal zu einem x ändern. Zitieren
flashpixx Geschrieben 16. Mai 2009 Geschrieben 16. Mai 2009 Hallo Ich möchte einen Stapelrechner für die UPN schreiben (also sowas wie 5 3 - = -2) Ich verstehe nicht, mal abgesehen von dem Problem, warum Du so etwas als Stack realisieren willst. Phil Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.