# UPN Rechner



## prof_m (6. Jan 2010)

Guten Abend!
Folgendes Problem, soll ein Java Programm schreiben, welches einen UPN (UPN = umgekehrte polnische Notation) Taschenrechner Simuliert. Habe bereits folgenden Quellcode geschrieben:

```
import java.io.*;

public class stapel {
    private static int[] stack;
    private static int size;
    int Vorzeichen;
    boolean ende;

    public static void init(){
        stack = new int[10];
        size = 0;
    }

    public static boolean empty(){
        return size == 0;
    }

    public static int peek(){
        return stack[size-1];
    }

    public static int pop(){        
        return stack[--size];       
    }

    public static void push(int value){
        if(size == stack.length){
            reSize();
        }
        stack[size++] = value;
    }

    public static void reSize(){
        int[] tmp = new int[stack.length * 2];
        for(int i = 0; i < stack.length; i++){
            tmp = stack;
        }
        stack = tmp;
    }

    public static int getSize(){
        return size;
    }

    public static void readFirst() throws IOException{

        int input = System.in.read();
        
        if(input >= '0' && input <= '9'){
            int tmp = readZahl(input - '0');
            if(tmp != -1){
                if(Vorzeichen == '-'){
                    tmp *= -1;
                }
                stapel.push(tmp);
                Vorzeichen = 0;
            }
        } else if (input == '+' || input == '-' || input == '*' || input == '/') {
            Vorzeichen = input;

        } else if (input == '\n' || input == '\r'){
            if(Vorzeichen == '+' || Vorzeichen == '-' || Vorzeichen == '*' || Vorzeichen == '/'){
                rechne(Vorzeichen);
                Vorzeichen = 0;
            } else if(!stapel.empty()){
                ende = true;
            }

        } else {
            System.out.println("böse eingabe!");
            eatEvil();
        }
    }

     public static int readZahl(int number) throws IOException{
        int input;
        while(true){            
            input = System.in.read();
            if(input >= '0' && input <= '9'){
                number = number * 10 + (input - '0');
            } else if(input == '\n'){
                break;
            } else {
                System.out.println("Fehler!");
                eatEvil();
                return -1;
            }
        }
        return number;
    }

     public static void eatEvil() throws IOException{
        while(true){
            int input = System.in.read();
            
            if (input == '\r') {
            } else if (input == '\n') {
                break;
            } else {
            }
        }
    }

     public static void rechne(int operator){
        int ergebnis = 0;
        
        if(stapel.getSize() >= 2){
            int zahl2 = stapel.pop();
            int zahl1 = stapel.pop();
        
            switch (operator){
            case '+':
                ergebnis = zahl1 + zahl2;
                System.out.println(zahl1 + " + " +zahl2 + " = " + ergebnis);
                break;
            case '-':
                ergebnis = zahl1 - zahl2;
                System.out.println(zahl1 + " - " +zahl2 + " = " + ergebnis);
                break;
            case '*':
                ergebnis = zahl1 * zahl2;
                System.out.println(zahl1 + " * " +zahl2 + " = " + ergebnis);
                break;
            case '/':
                if(zahl2 != 0){
                    ergebnis = zahl1 / zahl2;
                    System.out.println(zahl1 + " / " +zahl2 + " = " + ergebnis);
                } else {
                    System.out.println("Ungültige Operation: Division durch 0");
                    stapel.push(zahl1);
                }
                break;
            }
            stapel.push(ergebnis);
        } else {
            System.out.println("Zu wenige Elemente für diese Aktion vorhanden!");
        }
    }
```

Allerdings bekomme ich in der Funktion ReadFirst ab Zeile 52 überall wo "Vorzeichen" steht die Fehlermeldung:
non-static variable Vorzeichen cannot be referenced from a static context

Wo liegt der Fehler?


----------



## prof_m (6. Jan 2010)

Okay hab den Fehler selber gefunden. Einfach das static bei den Klassenvariablen vergessen.
Jetzt bereitet mir allerdings der Aufruf der readFirst Methode innerhalb der Main Methode Probleme.
Weiß einfach nicht wie die Schleife dazu aussehen muss.


----------

