Java Taschenrechner für die Konsole

GustavusGans

Grünschnabel
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:
Java:
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;
    }

}
 
Hi,

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

Grüsse,
BK
 
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
 
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:
Java:
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;
    }

}
 
Hi,

In deiner Zeile 108 ist dein splitcalc[i] null, von daher kannst du kein .equals() drauf machen.
Java:
// 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
 
Zuletzt bearbeitet:
Das Problem hatte ich vorher auch allerdings ist es im code den ich geschickt habe schon extra mit
Java:
  String[] splitcalc = new String[input.length() + 1];
definiert.
 
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
 
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
Java:
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
 
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
 
Zurück