# Java Taschenrechner für die Konsole



## GustavusGans (30. August 2018)

Hallo,
Ich habe im Moment ein kleines Projekt einen Taschenrechner zu machen und wir haben auch schon ein paar Grundlagen gemacht wie Punkt vor Strich Rechnung, allerdings scheitert es bei uns an den Klammer (also Klammer-vor-Punkt-vor-Strich-Regel) und wollte deshalb fragen ob jemand von euch eine Idee hat wie das klappen könnte.
P.S.: Wir haben schon eine Sache herausgefunden und zwar entfernt er die Klammern nicht, was Voraussetzung für unsere Idee wäre ^^"

hier der Code:

```
import java.util.Scanner;

public class FindeBaum {
    public static void main(String[] args) {
        while (true) {
            FindeBaum fb = new FindeBaum();
            Scanner scan = new Scanner(System.in);
            System.out.print("Eingabe:");
            String input = scan.nextLine();
            int res = fb.plusminus(fb.Brackets(input));
            System.out.println("Ergebnis:" + res);
        }

    }

    public String Brackets(String input) {
        int inb = 0;
        FindeBaum fb = new FindeBaum();
        if(fb.braccheck(input) == false)return input;
        int bcount = 0;
        String[] putTogether = new String[input.length()];
        String inBrackets = "";
        boolean bbracs = false;
        
        for(int i = 0; i < input.length(); i++) {
            if(input.charAt(i) == '(')bcount++;
            if(input.charAt(i) == ')')bcount--;
            if(input.charAt(i) == '(' && bcount == 0 && bbracs == false) {
                bbracs = true;
                i++;
                inb++;
            }
            if(input.charAt(i) == ')' && bcount == 1) {
                i++;
                inb++;
            }
            putTogether[inb] = putTogether[inb] + input.charAt(i);
        }
        
        String res = "0+";
        for(int i = 0; i < putTogether.length; i++) {
            if(putTogether[i] != null)res = res + fb.plusminus(fb.Brackets(putTogether[i]));
            
        }
        System.out.println(res);
        
        
        return fb.Brackets(res);

    }

    public int timesby(String input) {
        FindeBaum fb = new FindeBaum();
        char[] split = new char[input.length()];
        String[] splitcalc = new String[input.length()];
        for (int i = 0; i < input.length(); i++) {
            split[i] = input.charAt(i);
        }

        int csign = 0;
        for (int i = 0; i < split.length; i++) {
            if (splitcalc[csign] == null)
                splitcalc[csign] = "";
            if (split[i] == '*' || split[i] == '/') {
                csign++;
                splitcalc[csign] = "";
                splitcalc[csign] = splitcalc[csign] + split[i];
                csign++;
                splitcalc[csign] = "";
                i++;
            }
            splitcalc[csign] = splitcalc[csign] + split[i];
        }

        return fb.calc(splitcalc);
    }

    public int plusminus(String input) {
        FindeBaum fb = new FindeBaum();
        char[] split = new char[input.length()];
        String[] splitcalc = new String[input.length() + 1];
        for (int i = 0; i < input.length(); i++) {
            split[i] = input.charAt(i);
        }

        int csign = 0;
        for (int i = 0; i < split.length; i++) {
            if (splitcalc[csign] == null)
                splitcalc[csign] = "";
            if (split[i] == '+' || split[i] == '-') {
                csign++;
                if (splitcalc[csign] == null)
                    splitcalc[csign] = "";
                splitcalc[csign] = splitcalc[csign] + split[i];
                csign++;
                if (splitcalc[csign] == null)
                    splitcalc[csign] = "";
                i++;
            }
            splitcalc[csign] = splitcalc[csign] + split[i];
        }
        for (int i = 0; i < splitcalc.length; i++) {
            if ((splitcalc[i].equals("+") || splitcalc[i].equals("-")) == false) {
                splitcalc[i] = Integer.toString(fb.timesby(splitcalc[i]));
            }
            if (splitcalc[i + 1] == null)
                break;
        }
        return fb.calc(splitcalc);
    }

    public int calc(String[] splitcalc) {
        int res = Integer.parseInt(splitcalc[0]);
        for (int i = 0; i < splitcalc.length - 2; i++) {
            if (splitcalc[i + 1] == null)
                break;
            if (splitcalc[i + 1].equals("+")) {
                res = res + Integer.parseInt(splitcalc[i + 2]);
                i++;
            } else if (splitcalc[i + 1].equals("-")) {
                res = res - Integer.parseInt(splitcalc[i + 2]);
                i++;
            } else if (splitcalc[i + 1].equals("*")) {
                res = res * Integer.parseInt(splitcalc[i + 2]);
                i++;
            } else if (splitcalc[i + 1].equals("/")) {
                res = res / Integer.parseInt(splitcalc[i + 2]);
                i++;
            }
        }
        return res;
    }

    public boolean braccheck(String input) {
        for (int i = 0; i < input.length(); i++) {
            if (input.charAt(i) == '(')
                return true;
        }
        return false;
    }

}
```


----------



## Bratkartoffel (30. August 2018)

Hi,

Was funktioniert denn nicht?
Bekommt ihr Exceptions?
Was macht er / was sollte er machen?
Hast du auch ein Beispiel?

Grüsse,
BK


----------



## GustavusGans (30. August 2018)

Es ist eine Endlosschleife bei einer Aufgabe mit klammer wie (1+1) irgendwo bei den Zeilen 41-43
und danke für die schnelle Antwort


----------



## GustavusGans (30. August 2018)

Update: die Klammern und Enlosschleife weg. Allerdings Fehlermeldung

Eingabe: "(1+1)"
null1+1 nullException in thread "main"
java.lang.NullPointerException
   at lulululumärkeristeinlappen.FindeBaum.plusminus(FindeBaum.java:108)
   at lulululumärkeristeinlappen.FindeBaum.Brackets(FindeBaum.java:48)
   at lulululumärkeristeinlappen.FindeBaum.main(FindeBaum.java:11)

Neuer Code:

```
package lulululumärkeristeinlappen;
import java.util.Scanner;

public class FindeBaum {
    public static void main(String[] args) {
        while (true) {
            FindeBaum fb = new FindeBaum();
            Scanner scan = new Scanner(System.in);
            System.out.print("Eingabe:");
            String input = scan.nextLine();
            int res = fb.plusminus(fb.Brackets(input));
            System.out.println("Ergebnis:" + res);
        }

    }

    public String Brackets(String input) {
        int inb = 0;
        FindeBaum fb = new FindeBaum();
        if(fb.braccheck(input) == false)return input;
        int bcount = 0;
        String[] putTogether = new String[input.length()];
        String inBrackets = "";
        boolean bbracs = false;
        int k = 0;
        putTogether[inb] = "";
        while(k < input.length()) {
            if(putTogether[inb] == null)putTogether[inb] = "0+";
            if(input.charAt(k) == '(')bcount++;
            if(input.charAt(k) == ')')bcount--;
            if(input.charAt(k) == '(' && bcount == 1 && bbracs == false) {
                bbracs = true;
                k++;
                inb++;
            }
            if(input.charAt(k) == ')' && bcount == 0) {
                k++;
                inb++;
            }
           
            if(k < input.length())putTogether[inb] = putTogether[inb] + input.charAt(k);
            k++;
        }
        System.out.println(putTogether[0] + " " + putTogether[1] + " " + putTogether[2]);
       
        String res = "0+";
        for(int i = 0; i < putTogether.length; i++) {
            if(putTogether[i] != null)res = res + fb.plusminus(fb.Brackets(putTogether[i]));
           
        }
       
       
        return fb.Brackets(res);

    }

    public int timesby(String input) {
        FindeBaum fb = new FindeBaum();
        char[] split = new char[input.length()];
        String[] splitcalc = new String[input.length()];
        for (int i = 0; i < input.length(); i++) {
            split[i] = input.charAt(i);
        }

        int csign = 0;
        for (int i = 0; i < split.length; i++) {
            if (splitcalc[csign] == null)
                splitcalc[csign] = "";
            if (split[i] == '*' || split[i] == '/') {
                csign++;
                splitcalc[csign] = "";
                splitcalc[csign] = splitcalc[csign] + split[i];
                csign++;
                splitcalc[csign] = "";
                i++;
            }
            splitcalc[csign] = splitcalc[csign] + split[i];
        }

        return fb.calc(splitcalc);
    }

    public int plusminus(String input) {
        FindeBaum fb = new FindeBaum();
        char[] split = new char[input.length()];
        String[] splitcalc = new String[input.length() + 1];
        for (int i = 0; i < input.length(); i++) {
            split[i] = input.charAt(i);
        }

        int csign = 0;
        for (int i = 0; i < split.length; i++) {
            if (splitcalc[csign] == null)
                splitcalc[csign] = "";
            if (split[i] == '+' || split[i] == '-') {
                csign++;
                if (splitcalc[csign] == null)
                    splitcalc[csign] = "";
                splitcalc[csign] = splitcalc[csign] + split[i];
                csign++;
                if (splitcalc[csign] == null)
                    splitcalc[csign] = "";
                i++;
            }
            splitcalc[csign] = splitcalc[csign] + split[i];
        }
        for (int i = 0; i < splitcalc.length; i++) {
            if ((splitcalc[i].equals("+") || splitcalc[i].equals("-")) == false) {
                splitcalc[i] = Integer.toString(fb.timesby(splitcalc[i]));
            }
            if (splitcalc[i + 1] == null)
                break;
        }
        return fb.calc(splitcalc);
    }

    public int calc(String[] splitcalc) {
        int res = Integer.parseInt(splitcalc[0]);
        for (int i = 0; i < splitcalc.length - 2; i++) {
            if (splitcalc[i + 1] == null)
                break;
            if (splitcalc[i + 1].equals("+")) {
                res = res + Integer.parseInt(splitcalc[i + 2]);
                i++;
            } else if (splitcalc[i + 1].equals("-")) {
                res = res - Integer.parseInt(splitcalc[i + 2]);
                i++;
            } else if (splitcalc[i + 1].equals("*")) {
                res = res * Integer.parseInt(splitcalc[i + 2]);
                i++;
            } else if (splitcalc[i + 1].equals("/")) {
                res = res / Integer.parseInt(splitcalc[i + 2]);
                i++;
            }
        }
        return res;
    }

    public boolean braccheck(String input) {
        for (int i = 0; i < input.length(); i++) {
            if (input.charAt(i) == '(')
                return true;
        }
        return false;
    }

}
```


----------



## Bratkartoffel (30. August 2018)

Hi,

In deiner Zeile 108 ist dein splitcalc[i]_ null_, von daher kannst du kein .equals() drauf machen.

```
// entweder
if(!"+".equals(splitcalc[i]) && !"-".equals(splitcalc[i])) {
// oder
if(!Objects.equals(splitcalc[i], "+") && !Objects.equals(splitcalc[i], "-")) {
```

In Zeile 111 hast du ausserdem eine IndexOutOfBounds, da dein i beim letzten Schleifendurchlauf auf das letzte Element der splitcalc zeigt. Dein [i + 1] liegt dann sicherlich ausserhalb.

Grüsse,
BK


----------



## GustavusGans (30. August 2018)

Das Problem hatte ich vorher auch allerdings ist es im code den ich geschickt habe schon extra mit   
	
	
	



```
String[] splitcalc = new String[input.length() + 1];
```
 definiert.


----------



## Bratkartoffel (30. August 2018)

Ok, das würde die IndexOutOfBounds verhindern, aber der Teil mit dem equals() gilt trotzdem.
Hast du schon einmal mit dem Debugger reingeschaut, was passiert?

Warum erzeugst du eigentlich immer wieder neue Instanzen von FindeBaum, wenn du eh innerhalb der Klasse bist?

Grüsse,
BK


----------



## GustavusGans (30. August 2018)

Nein ich habe noch nicht mit dem debugger reingeschaut
und ich mache das aus keinem bestimmten grund


----------



## GustavusGans (30. August 2018)

Ich habe nun deine erwähnte outOfBounds in zeile 113 (wegen neuem Code) und wollte wissen ob du eine Lösung dafür hättest

```
public int plusminus(String input) {
FindeBaum fb = new FindeBaum();
char[] split = new char[input.length()];
String[] splitcalc = new String[input.length() + 1];
for (int i = 0; i < input.length(); i++) {
split[i] = input.charAt(i);
}

int csign = 0;
for (int i = 0; i < split.length; i++) {
if (splitcalc[csign] == null)
splitcalc[csign] = "";
if (split[i] == '+' || split[i] == '-') {
csign++;
if (splitcalc[csign] == null)
splitcalc[csign] = "";
splitcalc[csign] = splitcalc[csign] + split[i];
csign++;
if (splitcalc[csign] == null)
splitcalc[csign] = "";
i++;
}
splitcalc[csign] = splitcalc[csign] + split[i];
}
for (int i = 0; i < splitcalc.length; i++) {
if ((splitcalc[i].equals("+") || splitcalc[i].equals("-")) == false) {
splitcalc[i] = Integer.toString(fb.timesby(splitcalc[i]));
}
if (splitcalc[i + 1] == null)
break;
}
return fb.calc(splitcalc);
}
Quelltext
```


----------



## Bratkartoffel (30. August 2018)

Ich will dir das nicht vorkauen, überlege mal warum dein "i+1" ausserhalb deines Arrays liegt, bzw. mit welchem Wert von i das passiert (Gehe mal deine Schleife der Reihe nach durch und / oder nutze einen Debugger)

Grüsse,
BK


----------



## GustavusGans (30. August 2018)

jetzt habe ich eine nullPointer exception in der zeile 26

Vielen Dank nochmal für die Hilfe


----------



## Bratkartoffel (30. August 2018)

Was ist bei dir die Zeile 26? Wie schaut der Stacktrace aus?
*Hast du das schon mit dem Debugger angeschaut?*

Grüsse,
BK


----------



## GustavusGans (5. September 2018)

so sieht das mit debugger aus


----------



## Bratkartoffel (10. September 2018)

Hi,

* i = 0 und splitcalc hat 1 Element. Was passiert in Zeile 111?
* Was passiert in Zeile 109 wenn splitcalc[i] keine Zahl ist?
_* _Was ist da überhaupt splitcalc[i]? (Rechts oben kannst du das Array "aufklappen")

_Grüsse,
BK_


----------

