Taschenrechner

seymenxkaya

Aktives Mitglied
Ich bin zurzeit dabei einen Taschenrechner zu programmieren, welcher soweit funktioniert, doch man kann nur 2 Werte eingeben. Da dies mir zu wenig ist habe ich meinen Lehrer gefragt, wie ich mehrere Werte eingeben könnte. Er meinte mit String split. So nun meine Frage: Wie genau soll das funktionieren? Ich meine ich muss ja irgendwie ein Array haben, aber da muss man dann ja auch eine Anzahl an Werten angeben oder nicht?
Java:
JButton ButtonGleich = new JButton("=");
        ButtonGleich.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
            
                zweiteZahl = Double.parseDouble(Textfeld.getText());
                
                if (operator == "+") {
                    ergebnis = ersteZahl + zweiteZahl;
                    antwort = String.format("%.2f",ergebnis);
                    Textfeld.setText(antwort);
                }
                
                else if (operator == "-") {
                    ergebnis = ersteZahl - zweiteZahl;
                    antwort = String.format("%.2f",ergebnis);
                    Textfeld.setText(antwort);
                }
                else if (operator == "*") {
                    ergebnis = ersteZahl * zweiteZahl;
                    antwort = String.format("%.2f",ergebnis);
                    Textfeld.setText(antwort);
                }
                else if (operator == "/") {
                    ergebnis = ersteZahl / zweiteZahl;
                    antwort = String.format("%.2f",ergebnis);
                    Textfeld.setText(antwort);
                }

            }
        });
 
Was heißt, man kann nur 2 Werte eingeben?!?
Also ich habe den Taschenrechner zusammen gebastelt mit Ecplise und es so programmiert, dass es 2 Variablen gibt. Diese sind die eingegeben Werte, z.B 10 und 5. So nun kann ich aber nicht mehr eintippen. Wie kann ich das Programm dazu kriegen, dass ich mehr Werte eingeben kann und nicht sofort ein Fehler auftritt?
 
Beispiel: Du setzt das Ergebnis in das erste Feld und leerst das zweite, damit Du dort weitere Werte angeben kannst.
 
Also String.split ist dazu da, einen String zu zerlegen. Das brauchst Du aber nur, wenn Du einen String aufbauen möchtest, aber das ist erst einmal nicht wirklich zielführend, denn Du hast ja schon Zahlen und Token getrennt.

Was Du also machen könntest, wäre die ganzen eingegebenen Werte mit den Operationen zu speichern. So gespeicherte Werte nennt man oft (z.B. beim Compilerbau) Token. Also hätte man eine Oberklasse Token.

Diese Token können dann sein:
- Zahlen
- Operationen (Diese haben dann ein oder mehrere untergeordnete Elemente.

Die Eingabe einer Zahl erfolgt so wie bisher. Die gemerkte Zahl gibt aber nun keine Zahl mehr aus, sondern eine Art Baumstruktur mit Token (=Eingaben).
Also Aufbau kann dann sein:
Du gibst eine Zahl ein wie bisher.
Wenn Du einen Operator drückst (+ = - / *), dann wird geschaut, was du bisher hattest:
z.B. Token-Tree war leer, Operator mit 2 Operanden wurden gedrückt:
Gemerkt ist dann ein Operator Token und die Zahl wird zu dem ersten Operanden.
Hier wird deutlich: Du musst Dir einen Arbeitszeiger merken - denn nun muss ja der zweite Operand eingegeben werden.

Damit haben wir auch schon den nächsten Zustand.
Operator <-- Arbeits Merker!
-> 1.Operand: 123
-> 2. Operand: null
Wenn nun eine Zahl eingegeben wird und das "=" gedrückt wurde, dann wird die Zahl zu dem zweiten Operanden und beim gemerkten Zustand wird dann calculateValue() aufgerufen (Eine Funktion, die jedes Token haben muss ...).

Was, wenn statt einem = ein Operand aufgerufen wurde?
Wir erstellen erst einmal den Token und schauen dann, wo wir diesen Hinzufügen müssen.
Hier kommt nun die Reihenfolge der Operationen ins Spiel. Punkt vor Strichrechnung:
- Ist die erste Operation vorrangig auszuführen (Z.B. hatten wir ein "5" "*" und nun kommt ein "3" "+"), dann ist ja erst die 5*3 zu berechnen. Die Zahl kommt also in den zweiten Operanden, die bisherige Operation kommt aber dann in den 1. Operanden. Wir haben also sowas wie:
Operator (+) <-- Arbeits Merker!
-> 1. Operand: Operator (*)
----> 1. Operand: 5
----> 2. Operand: 3
-> 2. Operand: null

- Ist die erste Operation gleichwertig oder nachrangig, dann bleibt der Baum wie bisher und wir füllen in den 2. Operand den neu erstellten Operator Token.
Beispiel hier wäre dann "5" "+" was
Operator (+) <-- Arbeits Merker!
-> 1. Operand: 5
-> 2. Operand: null
ergab und nun kommt das "+" "3" oder "*" "3".
Operator (+)
-> 1. Operand: 5
-> 2. Operand: Operator (+ oder *) <-- Arbeits Merker!
----> 1. Operand: 3
----> 2. Operand: null

Das sieht erst einmal recht komplex aus, aber so komplex ist es nicht wirklich. Man kann dies auf einem Zettel durchspielen und dann erkennt man, wie der Baum aufgebaut werden kann / muss.

Für so eine Lösung braucht man Wissen zu Objektorientierter Entwicklung aber kein String.split 🙂
 
Die Frage wäre erst einmal, was Du genau haben willst: einen einfachen Taschenrechner, bei dem Zahlen und Operatoren mit Buttons "eingegeben" werden und bei dem das Ergebnis der vorherigen Operation gleich angezeigt wird?

Oder brauchst Du einen Taschenrechner, der komplette Ausdrücke in Infix-Notation inkl. Klammerung auswerten kann?
 
Die Frage wäre erst einmal, was Du genau haben willst: einen einfachen Taschenrechner, bei dem Zahlen und Operatoren mit Buttons "eingegeben" werden und bei dem das Ergebnis der vorherigen Operation gleich angezeigt wird?

Oder brauchst Du einen Taschenrechner, der komplette Ausdrücke in Infix-Notation inkl. Klammerung auswerten kann?

Einen einfachen Taschenrechner mit Buttons. Der ist ja schon fertig, allerdings kann ich wie gesagt nur 2 Werte zusammen berechnen.
 
Ich habe mich mal erneut ran versucht, dabei ist dies raus gekommen:
Java:
 while (a == true) {   
    System.out.println("Gib eine Zahl ein"); //erste Zahl eingeben
            eingabe1 = scan.nextDouble();

            
            System.out.println("Gib ein Operator ein"); // Operator eingeben
            operator = scan.nextLine();
    
             if (operator.equals("=")) {
                     System.out.println("Dein Ergebnis beträgt " + ergebnis);
                     a = false;
                 }
            
            else if (operator.equals("+")) { // wenn + eingegeben wurde addiere eingabe1 und eingabe2 zusammen
            
                System.out.println("Gib eine Zahl ein"); //zweite Zahl eingeben
                eingabe2 = scan.nextDouble();
                ergebnis = eingabe1+eingabe2;
                eingabe1 = 0.0;
                }
    
            else if (operator.equals("-")) { // wenn - eingegeben wurde subtrahiere eingabe1 und eingabe2 zusammen
        
                System.out.println("Gib eine Zahl ein"); //zweite Zahl eingeben
                eingabe2 = scan.nextDouble();
                ergebnis = eingabe1-eingabe2;
                eingabe1 = 0.0;
                }
    
            else if (operator.equals("*")) { // wenn * eingegeben wurde multipliziere eingabe1 und eingabe2 zusammen
    
                System.out.println("Gib eine Zahl ein"); //zweite Zahl eingeben
                eingabe2 = scan.nextDouble();
                ergebnis = eingabe1*eingabe2;
                eingabe1 = 0.0;
                }

            else if (operator.equals("/")) { // wenn / eingegeben wurde teile eingabe1 durch eingabe2
    
                System.out.println("Gib eine Zahl ein"); //zweite Zahl eingeben
                eingabe2 = scan.nextDouble();
                ergebnis = eingabe1/eingabe2;
                eingabe1 = 0.0;
            }
            
            else {
                System.out.println("Fehler");
                System.exit(1);
            }
Jedoch kommt in der Konsole dies raus:
Java:
Gib eine Zahl ein
2
Gib ein Operator ein
Fehler
Ich gebe eine Zahl ein und sofort kommt die Fehler Meldung, aber warum?
Davor hatte ich es anders implementiert gehabt ohne while Schleife, jedoch kam da das selbe bei rum :/ .
Java:
System.out.println("Gib eine Zahl ein"); //erste Zahl eingeben
            eingabe1 = scan.nextDouble();

            
            System.out.println("Gib ein Operator ein"); // Operator eingeben
            operator = scan.nextLine();   
    
            if (operator.equals("+")) { // wenn + eingegeben wurde addiere eingabe1 und eingabe2 zusammen
            
                System.out.println("Gib eine Zahl ein"); //zweite Zahl eingeben
                eingabe2 = scan.nextDouble();
                ergebnis = eingabe1+eingabe2;
                eingabe1 = 0.0;
                }
    
            else if (operator.equals("-")) { // wenn - eingegeben wurde subtrahiere eingabe1 und eingabe2 zusammen
        
                System.out.println("Gib eine Zahl ein"); //zweite Zahl eingeben
                eingabe2 = scan.nextDouble();
                ergebnis = eingabe1-eingabe2;
                eingabe1 = 0.0;
                }
    
            else if (operator.equals("*")) { // wenn * eingegeben wurde multipliziere eingabe1 und eingabe2 zusammen
    
                System.out.println("Gib eine Zahl ein"); //zweite Zahl eingeben
                eingabe2 = scan.nextDouble();
                ergebnis = eingabe1*eingabe2;
                eingabe1 = 0.0;
                }

            else if (operator.equals("/")) { // wenn / eingegeben wurde teile eingabe1 durch eingabe2
    
                System.out.println("Gib eine Zahl ein"); //zweite Zahl eingeben
                eingabe2 = scan.nextDouble();
                ergebnis = eingabe1/eingabe2;
                eingabe1 = 0.0;
                }
                

            System.out.println("Gib ein Operator ein"); // Operator eingeben
            operator = scan.nextLine();
    
         if (operator.equals("=")) {
                 System.out.println("Dein Ergebnis beträgt " + ergebnis);
             }
         else if (operator.equals("+")) {
                 System.out.println("Gib eine Zahl ein");
                 eingabe1 = scan.nextDouble();
                 ergebnis = ergebnis + eingabe1;
                 eingabe1 = 0.0;
             }

         else if (operator.equals("-")) {
                 System.out.println("Gib eine Zahl ein");
                 eingabe1 = scan.nextDouble();
                 ergebnis = ergebnis - eingabe1;
                 eingabe1 = 0.0;
             }

         else if (operator.equals("*")) {
                 System.out.println("Gib eine Zahl ein");
                 eingabe1 = scan.nextDouble();
                 ergebnis = ergebnis * eingabe1;
                 eingabe1 = 0.0;
         }

         else if (operator.equals("/")) {
                 System.out.println("Gib eine Zahl ein");
                 eingabe1 = scan.nextDouble();
                 ergebnis = ergebnis / eingabe1;
                 eingabe1 = 0.0;
                    
                
             }
Hier kann ich 2 Zahlen eingeben, doch wird nach der 1. Zahl sofort nach dem 2. Operator gefragt, welcher erst nach der 2. Zahl befragt werden soll.
 
Einfach mit nextLine() das Zeilenende entfernen.

Java:
            eingabe1 = scan.nextDouble();
            scan.nextLine(); // Rest der Zeile (Zeilenende) lesen

            System.out.println("Gib ein Operator ein"); // Operator eingeben
            operator = scan.nextLine();
 

Zurück
Oben