# Verzweiflung über einem fast fertigen Taschenrechner



## Caro_Thihii (4. Jun 2016)

Hallo ihr Lieben,

Ich habe ein "kleines" Problem mit meinem Taschenrechner den ich für die Uni programmieren soll. Er soll nur +,-,*,/ können. So weit so gut.
Eigentlich bin ich auch schon fast fertig, habe jetzt aber einen "Fehler" den ich einfach nicht rausbekomme und der mich zur völligen Verzweiflung bringt.

Also der Fehler liegt darin, dass wenn ich etwas rechnen möchte er mir zum Beispiel bei 2+2  nur eine 2 ausgibt. Gebe ich aber 2+2+ ein bekomme ich 4 raus. Das heißt ich weiß schon mal,dass er die 2te Zahl "übersieht". Sitze da jetzt schon 3 Tage dran und habe einfach keine Idee mehr wie ich das weg bekommen könnte, weil ich mir auch nicht richtig sicher bin an welchem Teil im Code es liegt und hoffe jetzt,dass Ihr mir da irgendwie helfen könntet.

Und dann hätte ich noch eine zweite Frage, nämlich soll ich den Taschenrechner so programmieren, dass man nur eine 0 am Anfang eingeben kann, also zum Beispiel 02.
Ich weiß hier ,dass ich mit einer If-Abfrage machen kann und einem boolean. Nur weiß ich nicht so recht ob das in die Funktion Tastendruck kommt oder in die Funktion Rechnen? 

Ich hoffe ihr könnt damit etwas anfangen und es sind genügend Informationen.
Und bin euch jetzt schon mal sehr dankbar für eure Hilfe

Mit freundlichen Grüßen.

Hier also die Controllerklasse, meine Klasse mit der Rechnen-Funktion und die Main.


```
package application;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.event.ActionEvent;

public class ControllerRechner
{
    @FXML Label lblErgebnis;
   
    @FXML Button zahl0;
    @FXML Button zahl1;
    @FXML Button zahl4;
    @FXML Button zahl7;
    @FXML Button zahl8;
    @FXML Button zahl5;
    @FXML Button zahl2;
    @FXML Button zahl9;
    @FXML Button zahl6;
    @FXML Button zahl3;
    @FXML Button opPlus;
    @FXML Button opMin;
    @FXML Button opMal;
    @FXML Button opDurch;
    @FXML Button btnGleich;
    @FXML Button btnLoeschen;
   
    int ergebnis = 0;
    private boolean nullgedrueckt;
   
    TestRechner rechner = new TestRechner();

   
    @FXML
    public void Tastendruck(MouseEvent event)
    {    
        if ( lblErgebnis.getText() == "0")
        {
            lblErgebnis.setText("");
        }
       
        String eingabe = ((Button)event.getSource()).getText();
        lblErgebnis.setText(lblErgebnis.getText()+ eingabe);
       
       
        ergebnis = rechner.rechnen(eingabe);
    }

    @FXML
    public void istGleich()
    {
        lblErgebnis.setText("" + ergebnis);
    }

    @FXML
    public void loeschen(ActionEvent event)
    {
        lblErgebnis.setText("0");
        rechner.clear();
       
    }
```


```
package application;

import javafx.scene.control.Alert;

public class TestRechner
{
    private int zwischenergebnis = 0;
    private int aktuelleZahl = 0;
    private String rechenzeichen = "+";

   
    public int rechnen(String zeichen)
    {
        switch(zeichen)
        {
        case "1":
            zahlDruecken(1);
            break;
        case "2":
            zahlDruecken(2);
            break;
        case "3":
            zahlDruecken(3);
            break;
        case "4":
            zahlDruecken(4);
            break;
        case "5":
            zahlDruecken(5);
            break;
        case "6":
            zahlDruecken(6);
            break;
        case "7":
            zahlDruecken(7);
            break;
        case "8":
            zahlDruecken(8);
            break;
        case "9":
            zahlDruecken(9);
            break;
        case "0":
            zahlDruecken(0);
            break;
        case "+":
            zeichenDruecken("+");
            break;
        case "-":
            zeichenDruecken("-");
            break;
        case "*":
            zeichenDruecken("*");
            break;
        case "/":
            zeichenDruecken("/"); 
            break;
        }
       
        return zwischenergebnis;
    }
   
    public void zahlDruecken(int zahl)
    {
        aktuelleZahl = 10 * aktuelleZahl + zahl;
     
    }
   
    public void zeichenDruecken(String z)
    {
        switch(rechenzeichen)
        {
        case "+":
            zwischenergebnis = zwischenergebnis + aktuelleZahl;
            break;
        case "-":
            zwischenergebnis = zwischenergebnis - aktuelleZahl;
            break;
        case "*":
            zwischenergebnis = zwischenergebnis * aktuelleZahl;
            break;
        case "/":
            try
            {
               if(aktuelleZahl != 0);
               {   
                   zwischenergebnis = zwischenergebnis / aktuelleZahl;
                   break;
               }
            }
            catch (ArithmeticException ex)
            {
                Alert error = new Alert (Alert.AlertType.INFORMATION);
                error.setTitle("Fehler bei Division");
                error.setHeaderText(ex.getMessage());
                error.setContentText(ex.toString());
                error.showAndWait();
               
            }             
            break;
        }
        aktuelleZahl = 0;
        rechenzeichen = z;
    }
    public void clear()
    {
        aktuelleZahl=0;
        rechenzeichen="+";
        zwischenergebnis=0;
    }
}
```


```
package application;
   
import javafx.application.Application;

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.fxml.FXMLLoader;


public class Main extends Application
{
    public void start(Stage primaryStage)
    {
        try
        {
            AnchorPane root = (AnchorPane)FXMLLoader.load(getClass().getResource("RecherLayout.fxml"));
            Scene scene = new Scene(root,320,350);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.show();
            root.setId("AnchorPane");   
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
   
    public static void main(String[] args)
    {
        launch(args);
    }
}
```


----------



## looparda (4. Jun 2016)

Caro_Thihii hat gesagt.:


> Also der Fehler liegt darin, dass wenn ich etwas rechnen möchte er mir zum Beispiel bei 2+2 nur eine 2 ausgibt.


Du berechnest immer nur genau dann, wenn ein Operator eingeben wurde.

Lösung: Berechne, wenn eine Zahl eingegeben wurde.


----------



## Caro_Thihii (4. Jun 2016)

Danke schön  Er rechnet jetzt immerhin schon mal   Jetzt muss ich nur noch das Problem mit der einen 0 nur am anfang lösen. Meine Lösungsansätze die ich bis jetzt hatte,haben dazu geführt, dass ich dann immer 00 stehen hatte danach keine mehr eingeben konnte aber auch keine 10 oder 20 eingeben konnte.


----------



## DrZoidberg (4. Jun 2016)

Du könntest in der Klasse ControllerRechner eine String Variable hinzufügen, die die eingegebene Zahl enthält. Immer, wenn du zu lblErgebnis ein Zeichen hinzufügst, fügst du das Zeichen auch zu dieser String Variablen hinzu. Der Unterschied ist nur, dass diese Variable am Anfang auf "" gesetzt wird und nicht auf "0". Dann musst du in der Methode Tastendruck nur noch prüfen, ob die Variable gleich "0" ist.


----------



## Caro_Thihii (6. Jun 2016)

Danke schön


----------

