Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln

Vor einiger Zeit hatte ich mal einen Taschenrechner in Swing geschrieben, vielleicht kann dieser eine Inspiration sein:
Java:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class Taschenrechner implements ActionListener {

    private int in = 0;
    private JTextField field1 = new JTextField();
    private JTextField field2 = new JTextField();
    private JTextField field3 = new JTextField();
    private JButton[] buttons = {
                                                                  new JButton("/"),
            new JButton("1"), new JButton("2"), new JButton("3"), new JButton("*"),
            new JButton("4"), new JButton("5"), new JButton("6"), new JButton("-"),
            new JButton("7"), new JButton("8"), new JButton("9"), new JButton("+"),
          new JButton("Del"), new JButton("0"), new JButton(","), new JButton("=")
    };

    public Taschenrechner() {
        JFrame frame = new JFrame("Taschenrechner");
        frame.setLayout(new GridLayout(5, 4, 5, 5));
        frame.add(field1);
        frame.add(field2);
        frame.add(field3);
        for (JButton button : buttons) {
            frame.add(button);
            button.addActionListener(this);
        }
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        new Taschenrechner();
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        char c = e.getActionCommand().charAt(0);
        if (c == 'D') {
            field1.setText("");
            field2.setText("");
            field3.setText("");
            in = 0;
        }
        switch (in) {
        case 0:
            if (c == '+' || c == '-' || c == '*' || c == '/') {
                field2.setText(field2.getText() + c);
                in++;
            }
            if (c >= '0' && c <= '9') {
                field1.setText(field1.getText() + c);
            }
            if (c == ',') {
                field1.setText(field1.getText() + '.');
            }
            break;
        case 1:
            if (c == '=') {
                double d1 = Double.parseDouble(field1.getText());
                double d2 = Double.parseDouble(field3.getText());
                switch (field2.getText().charAt(0)) {
                case '+':
                    field1.setText(d1 + d2 + "");
                    break;
                case '-':
                    field1.setText(d1 - d2 + "");
                    break;
                case '*':
                    field1.setText(d1 * d2 + "");
                    break;
                case '/':
                    field1.setText(d1 / d2 + "");
                    break;
                default:
                    break;
                }
                field1.setText((float) Double.parseDouble(field1.getText()) + "");
                field2.setText("");
                field3.setText("");
                in = 0;
            }
            if (c >= '0' && c <= '9') {
                field3.setText(field3.getText() + c);
            }
            if (c == ',') {
                field3.setText(field3.getText() + '.');
            }
            break;
        default:
            break;
        }
    }

}

ich brauche einen TaRe nicht im GUI, sondern einen Anfänger-TaschenRechner ohne Swing, TextFields, etc. Konsoleausgabe.
 
Alles, was du aktuell machen musst, ist die Methoden an die richtige Stelle in der Klasse schieben.

Aktuell stehen sie bei dir in einer anderen Methode – da das nicht möglich ist, welche Möglichkeiten bleiben da noch offen?
 
Alles, was du aktuell machen musst, ist die Methoden an die richtige Stelle in der Klasse schieben.

Aktuell stehen sie bei dir in einer anderen Methode – da das nicht möglich ist, welche Möglichkeiten bleiben da noch offen?


du denkst ich soll die Methoden alle zusammenfügen und untereinander anordnen in einer Klasse? Soll denn unter jeder Methode die dazugehörige Ein/ausgabe stehen oder muss die Ein/Ausgabe verändert werden? Bitte um Antworten.
 
Also du bist kaum zu verstehen. Schau Dir die Java Grundlagen an und versuch gültigen Java Code zu schreiben!

Methoden gehören in eine Klasse.
Anweisungen gehören in eine Methode.

Also: Keine Methode innerhalb einer anderen Methode schreiben.
Unter einer Methode können keine Anweisungen stehen.
 
was hälst du von dem Ansatz?
Vor allem zeigt dein Ansatz, dass es dir immens an Grundlagen mangelt. Du solltest den Rat unbedingt beherzigen und dich intensiv damit beschäftigen. Stelle Fragen, wenn du etwas nicht verstehst! Und, glaube mir, dein Code zeigt sehr deutlich, dass du Vieles nicht verstanden hast.

Dein Code macht den Eindruck von Trial-and-Error-Programmierung in der Hoffnung, das es irgendwann funktioniert. So geht Programmieren nicht. Du musst jede einzelne Zeile in deinem Code verstehen.


Hier mal die auf das Nötigste reduzierte Klasse aus dem Ausgangspost (nur Teile entfernt):
Java:
public class Taschenrechner {

    //Klassenmethode potenz, die 2 Parameter ( int basis & int expoWert hat)
    public static long potenz(int basis, int expoWert) {
        long result = 1;
        while(expoWert > 0) {
            result *= basis;
            expoWert--;
        }
        return result;
    }

    public static void main(String[] args) {
        // TODO Automatisch generierter Methodenstub
        int zahl1, zahl2;
        String eingabe;
      
        zahl1 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre erste Zahl ein:"));
        zahl2 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre zweite Zahl ein:"));

        eingabe = JOptionPane.showInputDialog("Tippen Sie das Rechenzeichen ein (+, -, *, /,^):");

        switch(eingabe)
        {
            case "^":
                System.out.println("Resultat = " + potenz(zahl1, zahl2));
                  break;
        }
    }
}

Und dazu noch einmal die Aufforderung: Mach es, wie bei potenz()!
 
Zuletzt bearbeitet:
Zur Verdeutlichung deines Problems noch dieses:
Java:
class Foo {
    
    // eine Methode (egal, ob Instanz- oder Klassenmethode)
    void doFoo1() {
        // code..
    }
    
    // noch eine Methode
    void doFoo2() {
        
        // Fehler! Innerhalb einer Methode kannst du keine Methode deklarieren!
        void doFoo3() {
            
        }
    }
}
Alles klar?
 
Zur Verdeutlichung deines Problems noch dieses:
Java:
class Foo {
   
    // eine Methode (egal, ob Instanz- oder Klassenmethode)
    void doFoo1() {
        // code..
    }
   
    // noch eine Methode
    void doFoo2() {
       
        // Fehler! Innerhalb einer Methode kannst du keine Methode deklarieren!
        void doFoo3() {
           
        }
    }
}
Alles klar?

alles klar. Danke!
 
Code:
import javax.swing.JOptionPane;

public class Taschenrechner {

public static int summe(int x, int y) {
return (x + y);
}

public static int differenz (int x, int y) {
return (x - y);
}

public static int produkt(int x, int y) {
return (x * y);
}

public static int Quotientenwert (int x, int y) {
return (x / y);
}

//Klassenmethode potenz, die 2 Parameter ( int basis & int expoWert hat)
public static long potenz(int basis, int expoWert) {
        long result = 1;
        while(expoWert > 0) {
            result *= basis;
            expoWert--;
        }
        return result;
}

public static void main(String[] args) {
        // TODO Automatisch generierter Methodenstub
        int zahl1, zahl2;
        String eingabe;
     
        zahl1 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre erste Zahl ein:"));
        zahl2 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre zweite Zahl ein:"));

        eingabe = JOptionPane.showInputDialog("Tippen Sie das Rechenzeichen ein (+, -, *, /,^):");

switch(eingabe)
        {
            case "+":
                System.out.println("Resultat = " +  (zahl1 + zahl2));
                  break;

            case "-":
                System.out.println("Resultat = " +  (zahl1 - zahl2));
                  break;

            case "*":
                System.out.println("Resultat = " +  (zahl1 * zahl2));
                  break;
 
            case "/":
                System.out.println("Resultat = " +  (zahl1 / zahl2));
                  break;
   
            case "^":
                System.out.println("Resultat = " + potenz(zahl1, zahl2));
                  break;
        }
        }
        }
  
}


hier ist der Vorschlag, nach dem Vorbild der Potenz-Methode 🙂 =>funkt in Eclipse!!
 
Zuletzt bearbeitet:
Schau dir bitte noch einmal an, wie ein switch Statement aussehen müsste ...

Wenn du so Code schreibst: prüf doch selbst, was Compiler und IDE dazu sagen ....
 
? ja der Code würde auch ohne die Methoden funken
aber so war es in der Aufgabenstellung verlangt: TaRe mit Methoden

Mensch Codix! Das ist doch eine recht einfache Aufgabe. Schau dir den Code aus #57 genau an! Oben wird die Methode deklariert und unten wird sie aufgerufen. Und genau so sollst du es mit den anderen Rechenarten machen. Da ist nichts Geheimnisvolles dabei. Das ist die einfache Adaptierung einer beispielhaft vorgegebenen Lösung auf weitere Probleme dieser Art.
 
Mensch Codix! Das ist doch eine recht einfache Aufgabe. Schau dir den Code aus #57 genau an! Oben wird die Methode deklariert und unten wird sie aufgerufen. Und genau so sollst du es mit den anderen Rechenarten machen. Da ist nichts Geheimnisvolles dabei. Das ist die einfache Adaptierung einer beispielhaft vorgegebenen Lösung auf weitere Probleme dieser Art.

ja genauso habe ich es doch auch gemacht. Oben deklariert und unten aufgerufen. Oder nicht? #60
 
Das Beispiel hast du doch schon. Das wäre also zum einen das Definieren der Methode:
Code:
//Klassenmethode potenz, die 2 Parameter ( int basis & int expoWert hat)
public static long potenz(int basis, int expoWert) {
        long result = 1;
        while(expoWert > 0) {
            result *= basis;
            expoWert--;
        }
        return result;
}

Und dann der Aufruf der Methode:
Code:
            case "^":
                System.out.println("Resultat = " + potenz(zahl1, zahl2));
                break;

Methoden hast Du definiert, aber du nutzt diese bisher nicht.
 
und was ist z.B. hiermit?

Definition der Methode:

Code:
public static int summe(int x, int y) {
return (x + y);
}

und dann der Aufruf der Methode:

Code:
case "+":
                System.out.println("Resultat = " +  (zahl1 + zahl2));
                  break;

oder müsste ich noch x & y zusätzlich mit "while" definieren?
 
Wo siehst du einen Aufruf der Methode? Wie soll in dem Code die Methode summe aufgerufen werden, wenn da doch gar kein "summe" vor kommt?
 
Vergleiche!

public static long potenz(int basis, int expoWert) {

System.out.println("Resultat = " + potenz(zahl1, zahl2));

Wie sieht denn für dich der Aufruf einer Methode aus? Das ist eine ernst gemeinte Frage.
 
Stimmt der Code jetzt? Bitte um eine Antwort. Danke im Voraus.

Code:
import javax.swing.JOptionPane;

public class Taschenrechner {

public static int summe(int x, int y) {
return (x + y);
}

public static int differenz(int x, int y) {
return (x - y);
}

public static int produkt(int x, int y) {
return (x * y);
}

public static int quotientenwert(int x, int y) {
return (x / y);
}

//Klassenmethode potenz, die 2 Parameter ( int basis & int expoWert hat)
public static long potenz(int basis, int expoWert) {
        long result = 1;
        while(expoWert > 0) {
            result *= basis;
            expoWert--;
        }
        return result;
}

public static void main(String[] args) {
        // TODO Automatisch generierter Methodenstub
        int zahl1, zahl2;
        String eingabe;
   
        zahl1 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre erste Zahl ein:"));
        zahl2 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre zweite Zahl ein:"));

        eingabe = JOptionPane.showInputDialog("Tippen Sie das Rechenzeichen ein (+, -, *, /,^):");

switch(eingabe)
        {
            case "+":
                System.out.println("Resultat = " + summe(zahl1 + zahl2, zahl2));
                  break;

            case "-":
                System.out.println("Resultat = " + differenz(zahl1 - zahl2, zahl2));
                  break;

            case "*":
                System.out.println("Resultat = " + produkt(zahl1 * zahl2, zahl2));
                  break;

            case "/":
                System.out.println("Resultat = " + quotientenwert(zahl1 / zahl2, zahl2));
                  break;
 
            case "^":
                System.out.println("Resultat = " + potenz(zahl1, zahl2));
                  break;
        }
        }
      }


}

Kann mir bitte einer deutlich machen, warum ich hier überall zahl2 einfügen musste? Sonst meckert der Compiler.

case "+":
System.out.println("Resultat = " + summe(zahl1 + zahl2, zahl2));
break;

case "-":
System.out.println("Resultat = " + differenz(zahl1 - zahl2, zahl2));
break;

case "*":
System.out.println("Resultat = " + produkt(zahl1 * zahl2, zahl2));
break;

case "/":
System.out.println("Resultat = " + quotientenwert(zahl1 / zahl2, zahl2));
break;
 
Zuletzt bearbeitet:
Hier mal drei Beispielmethoden (der Code ist egal)
Java:
int getValue() {
    //.. code
}

int add(int value1, int value2) {
    //.. code
}

void doSomething(String text, int intVal) {
    //.. code
}

Zeig mir mal, wie die Aufrufe dazu aussehen könnten!
 
Hier mal drei Beispielmethoden (der Code ist egal)
Java:
int getValue() {
    //.. code
}

int add(int value1, int value2) {
    //.. code
}

void doSomething(String text, int intVal) {
    //.. code
}

Zeig mir mal, wie die Aufrufe dazu aussehen könnten!

Code:
int getValue() {

    //.. code

}


int add(int value1, int value2) {

    //.. code

}

void doSomething(String text, int intVal) {

    //.. code

}
// noch ein Paar Zeile Code

eingabe = JOptionPane.showInputDialog("Tippen Sie -- ein (add, doSomething, *, /,^):");


case "add":
        System.out.println("Resultat = " + add(zahl1,zahl2));
                  break;

case "getValue":
        System.out.println("Resultat = " + getValue());
                  break;

    //.. code

}

case "doSomething":
        System.out.println("Resultat = " + doSomething(text,intVal));
                  break;

so ungefähr?
 

Code:
System.out.println("Resultat = " + add(zahl1,zahl2));
Das ist richtig. Innerhalb der Klammer von println() sagst du in einfachen Worten ausgedrückt:

Nimm den String "Resultat : " und hänge daran das Ergebnis aus dem Aufruf der Methode add() in seiner Stringrepräsentation. Wichtig ist: Die Methode add() liefert einen Rückgabewert. In diesem Fall wandelt der Compiler den zurück gegebenen Integerwert automatisch in einen String um.

Code:
System.out.println("Resultat = " + doSomething(text,intVal));
Kann das funktionieren, wenn du das zur vorherigen Methode gesagte berücksichtigst?
Kannst du anstatt der beiden Variablen "text" und "intVal" auch direkt Werte angeben, die du der Methode übergibst? Achte auf die Datentypen! Als Beispiel für die Methode darüber add(5, 5)
 
Code:
System.out.println("Resultat = " + add(zahl1,zahl2));
Das ist richtig. Innerhalb der Klammer von println() sagst du in einfachen Worten ausgedrückt:

Nimm den String "Resultat : " und hänge daran das Ergebnis aus dem Aufruf der Methode add() in seiner Stringrepräsentation. Wichtig ist: Die Methode add() liefert einen Rückgabewert. In diesem Fall wandelt der Compiler den zurück gegebenen Integerwert automatisch in einen String um.

Code:
System.out.println("Resultat = " + doSomething(text,intVal));
Kann das funktionieren, wenn du das zur vorherigen Methode gesagte berücksichtigst?
Kannst du anstatt der beiden Variablen "text" und "intVal" auch direkt Werte angeben, die du der Methode übergibst? Achte auf die Datentypen! Als Beispiel für die Methode darüber add(5, 5)


es kann schon funken, muss halt String(Datentyp) für text und int(Datentyp) für intVal sein.
 
nochmals die Frage:

ja aber ich habe doch schon 2 Parameter übergeben:

case "*":
System.out.println("Resultat = " + produkt(zahl1 * zahl2, zahl2));
break;

==
Warum will der Compiler jetzt noch zahl2 haben? also zahl2 2 mal!
 
bei produkt z.B.
ist der erste zahl1 und der zweite zahl2.
Warum will er jetzt den zweiten Parameter 2 mal haben?

Darum geht es: produkt(zahl1 * zahl2, zahl2)

Wie werden Parameter voneinander getrennt? Mit welchem Zeichen?

Was ist dann bei dir der erste und was der zweite Parameter? Genau bei dem oben gezeigten Aufruf.

Und warum rechnet dein Taschenrechner falsch? Das ergibt sich daraus.
 
Darum geht es: produkt(zahl1 * zahl2, zahl2)

Wie werden Parameter voneinander getrennt? Mit welchem Zeichen?

Was ist dann bei dir der erste und was der zweite Parameter?

Und warum rechnet dein Taschenrechner falsch? Das ergibt sich daraus.

der TaRe rechnet richtig. Er gab bloss einen Fehler an, als ich zahl2 (zweiten Parameter einmal schrieb).

Parameter werden durch komma getrennt, aber hier haben wir eine Rechenoperation, deswegen das * Zeichen dazwischen.
 
jetzt müsste es stimmen. Zwischen den Parametern darf kein anderes Zeichen stehen (ob wir rechnen oder nicht).
Code:
public class Taschenrechner {

public static int summe(int x, int y) {
return (x + y);
}

public static int differenz(int x, int y) {
return (x - y);
}

public static int produkt(int x, int y) {
return (x * y);
}

public static int quotientenwert(int x, int y) {
return (x / y);
}

//Klassenmethode potenz, die 2 Parameter ( int basis & int expoWert hat)
public static long potenz(int basis, int expoWert) {
        long result = 1;
        while(expoWert > 0) {
            result *= basis;
            expoWert--;
        }
        return result;
}

public static void main(String[] args) {
        // TODO Automatisch generierter Methodenstub
        int zahl1, zahl2;
        String eingabe;
   
        zahl1 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre erste Zahl ein:"));
        zahl2 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre zweite Zahl ein:"));

        eingabe = JOptionPane.showInputDialog("Tippen Sie das Rechenzeichen ein (+, -, *, /,^):");

switch(eingabe)
        {
            case "+":
                System.out.println("Resultat = " + summe(zahl1, zahl2));
                  break;

            case "-":
                System.out.println("Resultat = " + differenz(zahl1, zahl2));
                  break;

            case "*":
                System.out.println("Resultat = " + produkt(zahl1, zahl2));
                  break;

            case "/":
                System.out.println("Resultat = " + quotientenwert(zahl1, zahl2));
                  break;

            case "^":
                System.out.println("Resultat = " + potenz(zahl1, zahl2));
                  break;
        }
        }
      }
Beantworte diese Fragen! Ganz wichtig! Danach weißt du auch warum er falsch rechnet.

case "*":
System.out.println("Resultat = " + produkt(zahl1, zahl2));
break;

so ist es richtig. 2 Parameter durch Kommazeichen getrennt. 🙂 Jetzt rechnet er auch richtig und zeigt keine Fehler an.
 

Zurück
Oben