# Taschenrechner



## Sabine.Quast (28. Okt 2020)

Hallo,

Wenn ich mit mehreren Zahlen rechnen will, rechnet das Programm nur die letzten 2 Zahlen, das gleiche auch bei der Methode mit Kommazahl.
Ich denke nach dem erster Operation sollte das Ergebnis gespeichert werden und für die nächste Operation wiedergegeben werden, jedoch weiß ich nicht wie ich vorgehen soll.
Irgentwelche Vorschläge?



```
public class Calculator {

    private String screen = "0";

    private double latestValue;

    private String latestOperation = "";

    public String readScreen() {
        return screen;
    }

    public void pressDigitKey(int digit) {
        if(digit > 9 || digit < 0) throw new IllegalArgumentException();
        if(screen.equals("0")){
            screen = String.valueOf(digit);
        }else{

        if(latestOperation.isEmpty()) {
           screen = screen + digit;

        } else {


            latestValue = Double.parseDouble(screen);
             screen = Integer.toString(digit);




        }
    }
    }
    public void pressClearKey() {
        screen = "0";
        latestOperation = "";
        latestValue = 0.0;
    }

    public void pressOperationKey(String operation)  {
        latestOperation = operation;
    }

    public void pressDotKey() {
        if(!screen.endsWith(".")) screen = screen + ".";
    }

    public void pressNegative() {
        screen = screen.startsWith("-") ? screen.substring(1) : "-";
    }

    public void pressEquals() {
        var result = switch(latestOperation) {
            case "+" -> latestValue + Double.parseDouble(screen);
            case "-" -> latestValue - Double.parseDouble(screen);
            case "x" -> latestValue * Double.parseDouble(screen);
            case "/" -> latestValue / Double.parseDouble(screen);
            default -> throw new IllegalArgumentException();
        };
        screen = Double.toString(result);
        if(screen.endsWith(".0")) screen = screen.substring(0,screen.length()-2);
    }
}
```


```
void calculatorCanDoTwoMinusTwo() {
        Calculator calc = new Calculator();
        calc.pressDigitKey(3);
        calc.pressOperationKey("+");
        calc.pressDigitKey(7);
        calc.pressOperationKey("/");
        calc.pressDigitKey(2);
        calc.pressEquals();
        assertEquals("5", calc.readScreen());
    }


    void calculatorCanDoDots() {
        Calculator calc = new Calculator();
        calc.pressDigitKey(1);
        calc.pressDotKey();
        calc.pressDigitKey(2);
        calc.pressOperationKey("+");
        calc.pressDigitKey(3);
        calc.pressDotKey();
        calc.pressDigitKey(4);
        calc.pressEquals();
        assertEquals("4.6", calc.readScreen());
```


----------



## kneitzel (28. Okt 2020)

Da musst Du erst einmal sagen, was Du genau für ein Verhalten erwartest.

Wenn Du einen ganz einfachen Taschenrechner betrachtest, der immer sofort eine Operation ausführt, dann ist es doch so:
Eingabe 3 -> Du hast die 3 in der Anzeige drin.
Eingabe + -> Du merkst Dir die gewählte Operation, die Zahl in der Eingabe und dass die Anzeige überschrieben wird.
Eingabe 4 -> Du hast die 4 in der Anzeige drin.
Eingabe * -> Da noch eine Operation gemerkt ist, führt er diese aus (gemerkte Eingabe und Anzeige verknüpfen mit gemerkter Operation und Zahl aus der Anzeige. Das Ergebnis merkst Du Dir, zeigst es an und merkst Dir, dass die Anzeige als nächstes überschrieben wird.
...

Du musst also Operationen direkt ausführen wenn die nächste Operation kommt. Da Zwischenergebnisse angezeigt werden, ist auch ein Flag wichtig, das angibt, ob die Anzeige noch ein Ergebnis anzeigt oder bereits im Editier-Modus ist.

Das wären meine Anregungen zu einem ganz einfachen Taschenrechner, der Operationen nicht merkt und daher keine Regeln befolgt. Eingabe von 3 + 5 * 2 ist also (3+5) *2 und damit 16 und nicht 13.


----------

