Zum Inhalt springen

Problem mit Konsolen-Aufruf mit *


Empfohlene Beiträge

Geschrieben

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?

Geschrieben (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 von toobeee
Geschrieben

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 ;-)

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...