Taschenrechner mit Java programmieren #1

Sicherlich gibt es schon hunderte Ansatzmöglichkeiten, wie man einen Taschenrechner programmieren könnte, aber man soll sich ja immer neue Aufgaben suchen, also werde ich mir selbst mal Gedanken machen. Ziel soll es sein, eine lauffähige Oberfläche zu programmieren, mit deren Hilfe man Matheaufgaben lösen kann, sei es einfach Punkt-/Strichrechnung oder auch Exponenzial – und Wurzelfunktionen.

In diesem ersten Teil werde ich mich aber erstmal mit dem Grundprinzip auseinandersetzen, ohne Oberfläche oder komplizierte Rechnungen. Also auf geht’s!

Am einfachsten wäre es natürlich, die Aufgabe einfach als String einlesen zu können, den Wert in ein Float zu speichern, ausrechnen lassen und wieder ausgeben:

String aufgabe = "1+2*4";
float ergebnis = Float.parseFLoat(aufgabe);
System.out.println(ergebnis);

Problem: Der Quellcode kann zwar „interne“ Rechnungen ausführen, die Rechenzeichen sind hierbei allerdings vorgegeben. Also werden wir wohl oder übel eine Art Translator schreiben müssen, der die Eingabe auseinender nimmt und anhand der Satzzeichen analysiert und schließlich dementsprechend ausrechnend und die Ergebnisse wieder zusammensetzt. Nichts leichter als das!

main()

Die Aufgabe werden wir uns später aus einem TextField holen, sprich wir brauchen einen String eingabe. Das Ergebnis wird eine Gleitkommazahl, sprich ein float ergebnis sein.

String eingabe = "1*6/4";    //Beispielaufgabe
float ergebnis = 0;          

ergebnis = punktrechnung(eingabe);

System.out.println(ergebnis);

Da die Regel, welche man als erstes in der Schule lernt, „Punkt vor Strich“ lautet, werden auch wir sie gleich mit einbauen. Aus diesem Grund werde ich auch mit einer Punktrechnungsaufgabe anfangen.

static float punktrechnung(String eingabe)

Was brauchen wir in dieser Methode? Natürlich das float ergebnis. Das Vorgehen wird sein, die Aufgabe in seine einzelnen Teilstücke, getrennt durch die Satzzeichen, in ein Array zu speichern. Wir zählen also zunächst die Satzzeichen

float ergebnis = 0;
int satzzeichen = 1;     // = 1, da die Aufgabe logischerweise eine Zahl mehr als Satzzeichen hat

for(int i = 0; i<eingabe.length(); i++){
    if(eingabe.charAt(i) == '*' || eingabe.charAt(i) == '/'){
        satzzeichen++;
    }
}

um diese Anzahl nun bei der Definition des Arrays zu benutzen:

String Array[][] = new String[satzzeichen][2];

Nun wird das Array mithilfe von substrings mit den einzelnen Zahlen im ersten Sektor und mit den dazugehörigen Satzzeichen im zweiten gefüllt.

int beginn = 0;        //Anfang eines Zahlenabschnittes
int reihe = 0;         //Reihen der Zahlenteile im Array

for(int i = 0; i<eingabe.length(); i++){
    if(eingabe.charAt(i) == '*' || eingabe.charAt(i) == '/'){
        Array[reihe][0] = eingabe.substring(beginn, i);
        Array[reihe][1] = eingabe.substring(i, i+1);
        beginn = i+1;
        reihe++;
    }
    if(i == string.length()-1){
        Array[reihe][0] = eingabe.substring(beginn, eingabe.length());
    }
}

Nun folgt das Ausrechnen. Zuerst müssen wir das ergebnis mit der ersten Zahl füllen (Achtung: Da es ein String Array ist, muss der String noch in ein Float kovertiert werden!):

ergebnis = Float.parseFloat(Array[0][0]);

Sollte kein Satzzeichen folgen, wäre das komplette Array nun abgeabreitet und die Lösung würde ausgegeben werden. Da aber selten einer einfach eine Zahl in seinen Taschenrechner ausgibt, um sie sich dann wieder augeben zu lassen, müssen wir wohl doch noch die Rechnung programmieren. Hierbei multilizieren wir einfach das Ergebnis mit dem jeweiligen String oder dividieren.

int i = 0;
while(Array[i][1] != null){
    if(Array[i][1].equals(""+'*')){
        ergebnis *= Float.parseFloat(Array[i+1][0]);
        i++;
    }else{
        ergebnis/= Float.parseFloat(Array[i+1][0]);
        i++;
    }
}

Jetzt noch mit return ergebnis; die Lösung zurückgeben und fertig!

static float strichrechnung(String eingabe)

Die Methode der Strichrechnung ist relativ einfach; man kopiert einfach die der Punktrechnung und ersetzt und / durch bzw. – und die Aufgabe darf natürlich auch nur bzw. – enthalten. Getrennt sollte beide Methoden funktionieren, hat man allerdings eine gemischte Aufgabe, gibt die Konsole Fehler aus. Mit gutem Recht, da sowohl die eine, als auch die andere Methode nicht in der Lage sind, mit den anderen Rechenzeichen etwas anzufangen.

Die Idee ist nun, mit der Strichrechnung anzufangen, Diese zerteilt die einzelnen Abschnitte, zählt die Faktoren, Dividenden und Quotienten mit ihren Punktsatzzeichen als eine Zahl. Diese lassen wir durch die Punktrechnungsmethode rattern. Klingt kompliziert, allerdings werden lediglich zwei Zeilen etwas abgeändert.

int i = 0;
while(Array[i][1] != null){
    if(Array[i][1].equals(""+'+')){
        ergebnis += punktrechnung(Array[i+1][0]); //Float.parseFloat(Array[i+1][0]);
        i++;
    }else{
        ergebnis -= punktrechnung(Array[i+1][0]); //Float.parseFloat(Array[i+1][0]);
        i++;
    }
}

Als allerletztes rufen wir in der main() Methode zuerst die strichrechnung() Methode auf, da diese ja später die punktrechnung() Methode aufruft.

Läuft!
Der ganze Code sieht dann folgendermaßen aus:

package taschenrechner;

/**
 *
 * @author BackSite
 */
public class Taschenrechner {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        String eingabe = "1*6/4";    //Beispielaufgabe
        float ergebnis = 0;          

        ergebnis = strichrechnung(eingabe);

        System.out.println(ergebnis);

    }

    static float punktrechnung(String eingabe){

        float ergebnis = 0;
        int satzzeichen = 1;     // = 1, da die Aufgabe logischerweise eine Zahl mehr als Satzzeichen hat

        for(int i = 0; i<eingabe.length(); i++){
            if(eingabe.charAt(i) == '*' || eingabe.charAt(i) == '/'){
                satzzeichen++;
            }
        }

        String Array[][] = new String[satzzeichen][2];

        int beginn = 0;        //Anfang eines Zahlenabschnittes
        int reihe = 0;         //Reihen der Zahlenteile im Array

        for(int i = 0; i<eingabe.length(); i++){
            if(eingabe.charAt(i) == '*' || eingabe.charAt(i) == '/'){
                Array[reihe][0] = eingabe.substring(beginn, i);
                Array[reihe][1] = eingabe.substring(i, i+1);
                beginn = i+1;
                reihe++;
            }
            if(i == eingabe.length()-1){
                Array[reihe][0] = eingabe.substring(beginn, eingabe.length());
            }
        }

        ergebnis = Float.parseFloat(Array[0][0]);

        int i = 0;
        while(Array[i][1] != null){
            if(Array[i][1].equals(""+'*')){
                ergebnis *= Float.parseFloat(Array[i+1][0]);
                i++;
            }else{
                ergebnis/= Float.parseFloat(Array[i+1][0]);
                i++;
            }
        }

        return ergebnis;
    }

    static float strichrechnung(String eingabe){

        float ergebnis = 0;
        int satzzeichen = 1;     // = 1, da die Aufgabe logischerweise eine Zahl mehr als Satzzeichen hat

        for(int i = 0; i<eingabe.length(); i++){
            if(eingabe.charAt(i) == '+' || eingabe.charAt(i) == '-'){
                satzzeichen++;
            }
        }

        String Array[][] = new String[satzzeichen][2];

        int beginn = 0;        //Anfang eines Zahlenabschnittes
        int reihe = 0;         //Reihen der Zahlenteile im Array

        for(int i = 0; i<eingabe.length(); i++){
            if(eingabe.charAt(i) == '+' || eingabe.charAt(i) == '-'){
                Array[reihe][0] = eingabe.substring(beginn, i);
                Array[reihe][1] = eingabe.substring(i, i+1);
                beginn = i+1;
                reihe++;
            }
            if(i == eingabe.length()-1){
                Array[reihe][0] = eingabe.substring(beginn, eingabe.length());
            }
        }

        ergebnis = Float.parseFloat(Array[0][0]);

        int i = 0;
        while(Array[i][1] != null){
            if(Array[i][1].equals(""+'+')){
                ergebnis *= punktrechnung(Array[i+1][0]);
                i++;
            }else{
                ergebnis/= punktrechnung(Array[i+1][0]);
                i++;
            }
        }

        return ergebnis;
    }

}

Wer Fragen oder Anmerkungen zum Code hat, möge gerne ausgiebig die Commentsection überlasten!

Ein Gedanke zu „Taschenrechner mit Java programmieren #1

  1. Guter Post, ja ein Taschenrechner programmiere ich auch immer wenn ich mit irgendetwas neu Anfange, das ist irgendwie so eine Art Tradition ^^ Habe ich auch gemacht, als ich mit Android neu angefangen habe.

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s