Anzeige

Java Taschenrechner für die Konsole


#1
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;
    }

}
 
#4
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;
    }

}
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#5
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:

Bratkartoffel

gebratene Kartoffel
Premium-User
#7
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
 
#9
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
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#10
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
 

Bratkartoffel

gebratene Kartoffel
Premium-User
#14
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
 
Zuletzt bearbeitet:
Anzeige

Neue Beiträge

Anzeige