Taschenrechner (switch) in Taschenrechner mit Methoden umwandeln

C

Codix

Bekanntes Mitglied
dieser Taschenrechner soll nicht mit switch, sondern mit Methoden funktionieren. Hat jemand Lösungsvorschläge?


Code:
import javax.swing.JOptionPane;

public class Taschenrechner {
//Klassenvariable 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;  
        }
    }
}

ich dachte erstmal an so etwas, aber wie bekomme ich das mit Rechenzeichen hin?

& bei der "eingabe-zeile" bekomme ich Syntaxfehler angezeigt. Weiss jemand wie ich das korregieren kann?

Code:
        eingabe = JOptionPane.showInputDialog("Tippen Sie das Rechenzeichen ein (addiere, substrahiere, multipliziere, dividiere ):)")";"
       
            static void addiere(int summandEins, int summandZwei){
            System.out.println("Die Summe aus "+summandEins+" und "+summandZwei+" ist "+(summandEins+summandZwei));
            }


            static void subtrahiere (int minuent, int subtrahent){
            System.out.println("Die Differenz aus "+minuent+" minus "+subtrahent+" ist "+(minuent-subtrahent));
            }


            static void multipliziere (int faktorEins, int faktorZwei){
            System.out.println("Das Produkt aus "+faktorEins+" und "+faktorZwei+" ist "+(faktorEins*faktorZwei));
            }


            static void dividiere (double divident, double devisor){
            System.out.println("Der Quotient aus "+divident+" und "+devisor+" ist "+(divident/devisor));
            }
    }

danke
 
mihe7

mihe7

Top Contributor
Java:
import java.util.*;
import java.util.function.*;

public class Calculator {
    static Map<String, BiConsumer<Number, Number>> operations = new HashMap<>();

    static {
        operations.put("+", (a,b) ->
                System.out.printf("Summe von %d und %d ist %d\n",
                                  a.intValue(), b.intValue(),
                                  a.intValue() + b.intValue()));
        operations.put("-", (a,b) ->
                System.out.printf("Differenz zwischen %d und %d ist %d\n",
                                  a.intValue(), b.intValue(),
                                  a.intValue() + b.intValue()));
    }

    static void calculate(String op, Number n1, Number n2) {
        operations.getOrDefault(op,
                                (a,b) -> System.out.println(op + ": WTF?!?"))
                  .accept(n1, n2);
    }

    public static void main(String[] args) {
        int a = 4;
        int b = 3;
        calculate("+", a, b);
        calculate("-", a, b);
        calculate("*", a, b);
    }
}
 
MoxxiManagarm

MoxxiManagarm

Top Contributor
dieser Taschenrechner soll nicht mit switch, sondern mit Methoden funktionieren.

Das ist eine sehr schwammige Aussage, keine Ahnung was damit gemeint ist. Hast du die Formulierung eventuell leicht verdreht?

Ich selbst würde es etwa so lösen, geht aber vermutlich über dein Anfängerniveau hinaus und ist daher vermutlich nicht gemeint: (quick&dirty)

Java:
public static int potenz(int basis, int expoWert) {
    int result = 1;
    for (int i = 0; i < expoWert; i++) {
        result *= basis;
    }
    return result;
}

public static void main(String[] args) {
    Map<String, IntBinaryOperator> operations = new HashMap<>();
    operations.put("+", Math::addExact);
    operations.put("-", Math::subtractExact);
    operations.put("*", Math::multiplyExact);
    operations.put("/", Math::floorDiv);
    operations.put("^", Calculator::potenz);

    int zahl1 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre erste Zahl ein:"));
    int zahl2 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre zweite Zahl ein:"));
    String eingabe = JOptionPane.showInputDialog("Tippen Sie das Rechenzeichen ein (+, -, *, /,^):");

    IntBinaryOperator operation = operations.get(eingabe);
    if (eingabe != null) {
        System.out.println("Resultat = " + operation.applyAsInt(zahl1, zahl2));
    } else {
        System.out.println("Keine gültige Operation.");
    }
}
 
C

Codix

Bekanntes Mitglied
Das ist eine sehr schwammige Aussage, keine Ahnung was damit gemeint ist. Hast du die Formulierung eventuell leicht verdreht?

Ich selbst würde es etwa so lösen, geht aber vermutlich über dein Anfängerniveau hinaus und ist daher vermutlich nicht gemeint: (quick&dirty)

Java:
public static int potenz(int basis, int expoWert) {
    int result = 1;
    for (int i = 0; i < expoWert; i++) {
        result *= basis;
    }
    return result;
}

public static void main(String[] args) {
    Map<String, IntBinaryOperator> operations = new HashMap<>();
    operations.put("+", Math::addExact);
    operations.put("-", Math::subtractExact);
    operations.put("*", Math::multiplyExact);
    operations.put("/", Math::floorDiv);
    operations.put("^", Calculator::potenz);

    int zahl1 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre erste Zahl ein:"));
    int zahl2 = Integer.parseInt(JOptionPane.showInputDialog("Tippen Sie Ihre zweite Zahl ein:"));
    String eingabe = JOptionPane.showInputDialog("Tippen Sie das Rechenzeichen ein (+, -, *, /,^):");

    IntBinaryOperator operation = operations.get(eingabe);
    if (eingabe != null) {
        System.out.println("Resultat = " + operation.applyAsInt(zahl1, zahl2));
    } else {
        System.out.println("Keine gültige Operation.");
    }
}

@ Das ist eine sehr schwammige Aussage, keine Ahnung was damit gemeint ist. Hast du die Formulierung eventuell leicht verdreht?
==> es sollen Methoden für die Berechnung verwendet werden, nicht switch/case.

===

Danke für die tollen Antworten, allerdings sind die Antworten zu gehoben für mein jetztiges Niveau. Könntet ihr vllt eine Antwort mit einfacheren Methoden posten? Danke nochmals, ihr seid Klasse.
 
kneitzel

kneitzel

Top Contributor
Was für ein Stoff steckt denn thematisch hinter der Fragestellung?

Man könnte die beiden Antworten in so fern abwandeln/mixen, dass du eigene Methoden für Division und so hast und dann Methodenreferenzen dazu verwendest. (Methodenreferenzen hatte Moxxi ja schon benutzt, das ginge 1:1 auch in der Lösung von mihe7.

Eine Alternative könnte Reflection sein, aber das würde ich nicht benutzen. Wäre halt vom Prinzip her ähnlich aufgebaut, nur das man dann halt eine Method Instanz hätte, auf der man invoke aufrufen könnte ....

Daher wäre es einmal interessant, bezüglich welches Themas diese Aufgabe gestellt wurde bzw eas für Stoff vorher behandelt wurde.

Oder ist ggf gar kein Ersatz des switch Statements gemeint und es soll nur ein Refactoring in mehrere Methoden gemacht werden?
 
MoxxiManagarm

MoxxiManagarm

Top Contributor
es sollen Methoden für die Berechnung verwendet werden, nicht switch/case.
Damit ist vermutlich einfach nur gemeint, dass du die Berechnung nicht innerhalb des switch-case machen sollst, sondern diese in den Methoden durchführst. Das wäre auch das bessere Vorgehen in Hinblick auf Testbarkeit. Ab Java 13? glaube ich, gibt es zudem noch die Möglichkeit einer switch Expression. Diese Switch Expression sähe dann etwa so aus:

Java:
int ergebnis = switch (eingabe) {
  case "+" -> addiere(zahl1, zahl2);
  case "-" -> subtrahiere(zahl1, zahl2);
  // ...
};
System.out.println("Ergebnis: " + ergebnis);
 
C

Codix

Bekanntes Mitglied
Was für ein Stoff steckt denn thematisch hinter der Fragestellung?

Man könnte die beiden Antworten in so fern abwandeln/mixen, dass du eigene Methoden für Division und so hast und dann Methodenreferenzen dazu verwendest. (Methodenreferenzen hatte Moxxi ja schon benutzt, das ginge 1:1 auch in der Lösung von mihe7.

Eine Alternative könnte Reflection sein, aber das würde ich nicht benutzen. Wäre halt vom Prinzip her ähnlich aufgebaut, nur das man dann halt eine Method Instanz hätte, auf der man invoke aufrufen könnte ....

Daher wäre es einmal interessant, bezüglich welches Themas diese Aufgabe gestellt wurde bzw eas für Stoff vorher behandelt wurde.

Oder ist ggf gar kein Ersatz des switch Statements gemeint und es soll nur ein Refactoring in mehrere Methoden gemacht werden?

refactoring wahrscheinlich.

Stoff: Kontrollstrukturen & Schleifen, Methoden
 
C

Codix

Bekanntes Mitglied
Da dürfte #6 von Moxxi schon helfen, oder brauchst du noch mehr Details?
aber das sind doch keine Methoden, oder? So eine Switch Expression habe ich noch nie gesehen, dass du
Code:
case "+" -> addiere
in den Java-code schreiben darfst.
Es sollen doch bitte normale Methoden sein.
Danke an euch
 
kneitzel

kneitzel

Top Contributor
Ich bezog mich auf den ersten Teil von Moxxis Beitrag und der Teil mit der Switch Expression wäre zu ignorieren:
Damit ist vermutlich einfach nur gemeint, dass du die Berechnung nicht innerhalb des switch-case machen sollst, sondern diese in den Methoden durchführst. Das wäre auch das bessere Vorgehen in Hinblick auf Testbarkeit.

Also unter dem Strich heisst es, dass du das Switch bei behältst aber du nur noch Methodenaufrufe hast:
Code:
case "+":
  addiere(zahl1,zahl2);
  break;

Also kein Code im Switch außer dem Funktionsaufruf.
 
C

Codix

Bekanntes Mitglied
Ich bezog mich auf den ersten Teil von Moxxis Beitrag und der Teil mit der Switch Expression wäre zu ignorieren:


Also unter dem Strich heisst es, dass du das Switch bei behältst aber du nur noch Methodenaufrufe hast:
Code:
case "+":
  addiere(zahl1,zahl2);
  break;

Also kein Code im Switch außer dem Funktionsaufruf.

ja es soll nicht switch sein, sondern nur Methoden. :)
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Du kannst switch nicht einfach durch Methoden ersetzen. Du brauchst weiterhin irgendeine Möglichkeit, die passende Methode auszuwählen, und das ist entweder ein if oder eben ein switch.

Zeig doch mal die genaue Aufgabenstellung, vermutlich hast du die etwas missverstanden.
 
kneitzel

kneitzel

Top Contributor
Du hast schon ein paar erste Möglichkeiten genannt bekommen. Wenn es ohne diese funktionalen Elemente gehen soll, dann würde mir noch eine rein objektorientierte Lösung einfallen. Da wird dann halt einfach ein Interface Operation oder so gebaut, das eine Methode wie Number calculate(Number, Number) vorgibt.

Dann hat man halt die Map statt mit BiConsumer oder so halt mit Operation Elementen.

Aber da ist dann auch einfach die Idee, dass man eben über eine Map zu der Operation die Aktion selbst holt.

Die Map ließe sich ersetzen durch eine Enumeration. Dann müsste jedes Enumeration Element halt die entsprechende Methodenimplementation kennen und man würde lediglich vom String her das Enum Element besorgen....
 
C

Codix

Bekanntes Mitglied
Das geht nicht. Es ist doch völlig klar, dass irgendeine Art von Fallunterscheidung her muss: if, switch, Map, Enums, Reflection, irgendwie muss die passende Methode ja ausgewählt werden.
dann versuche ich es mit switch und methoden.

Dank und Respekt an alle, die geholfen haben.
 
C

Codix

Bekanntes Mitglied
Kann man/frau so einen Taschenrechner mit Methoden machen?

Die addierten Methoden würde ich gern beibehalten, die switch Konstruktion kann verändert werden.

Kann mir eine/r bitte helfen? Wo sind die Fehler?

Vielen Vielen Dank im Voraus

Code:
import javax.swing.JOptionPane;

public class Taschenrechner {
//Klassenvariable 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;
      
    
        public static int addiere(int Zahl1, int Zahl2)
        {
            int Zahl3 = Zahl1 + Zahl2;
            return Zahl3;
        }
        
        public static int subtrahiere(int Zahl1, int Zahl2)
        {
            int Zahl3 = Zahl1 - Zahl2;
            return Zahl3;
        }
        
        public static int multipliziere(int Zahl1, int Zahl2)
        {
            int Zahl3 = Zahl1 * Zahl2;
            return Zahl3;
        }
        
        public static int dividiere(int Zahl1, int Zahl2)
        {
            int Zahl3 = Zahl1 / Zahl2;
            return Zahl3;
        }
    

        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; 
        }
    }
}
 
temi

temi

Top Contributor
Mach es einfach so wie es bei potenz() schon der Fall ist.

Aber: Hältst du es tatsächlich für sinnvoll ständig neue Probleme zu bearbeiten, wo die ersten noch nicht gelöst sind? Wie z.B. "Datenkapselung".
 
C

Codix

Bekanntes Mitglied
Mach es einfach so wie es bei potenz() schon der Fall ist.

aber die anderen Methoden sind doch schon wie die Potenz Methode.

Aber: Hältst du es tatsächlich für sinnvoll ständig neue Probleme zu bearbeiten, wo die ersten noch nicht gelöst sind? Wie z.B. "Datenkapselung".

ich arbeite gern im multiple tasking Modus. Danke für den Hinweis. Datenkapselung werde ich noch anschauen. Danke für alles @temi. Reskept an dich für die Unterstützung. ;)
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Puh, wo soll man da anfangen...

Ich würde dir raten, dass du noch mal mit dem Code startest, den du im Eingangspost hattest. Alles danach hat den nur kaputt gemacht.
 
temi

temi

Top Contributor
Puh, wo soll man da anfangen...

Ich würde dir raten, dass du noch mal mit dem Code startest, den du im Eingangspost hattest. Alles danach hat den nur kaputt gemacht.
Naja, wenn er die anderen Methoden nach dem Beispiel "potenz()" erstellt und verwendet, dann klappt das schon.

Ich fürchte nur, dass es in seinem Fall sehr an Verständnis fehlt.
ich arbeite gern im multiple tasking Modus.
Es geht nicht darum, am Ende eine funktionierende Lösung zu haben. Viel wichtiger ist, dass du die Lösung auch verstehst. In irgend einem Thema hast du geschrieben, dass du die Grundlagen schon gut kannst. Davon ist im letzten Code nicht viel zu sehen. Das sind Grundlagen, die da gefordert sind.

EDIT: Das ist auch der Grund, warum ich (und viele andere) keine fertige Lösung liefere. Es geht darum, dass es bei dir "Klick" macht und du selbst auf die Lösung kommst.
 
temi

temi

Top Contributor
Stammt der Kommentar von dir?
Java:
public class Taschenrechner {

//Klassenvariable 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;
    }
Bei Potenz handelt es sich nämlich nicht um eine Klassenvariable, sondern um eine Klassenmethode!

Lerne und verwende die Begrifflichkeiten korrekt!
Stelle Fragen, wenn du irgend etwas nicht verstehst!
Stelle keine Fragen in der Art "gebt mir bitte die richtige Lösung".
 
C

Codix

Bekanntes Mitglied
Stammt der Kommentar von dir?
Java:
public class Taschenrechner {

//Klassenvariable 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;
    }
Bei Potenz handelt es sich nämlich nicht um eine Klassenvariable, sondern um eine Klassenmethode!

Lerne und verwende die Begrifflichkeiten korrekt!
Stelle Fragen, wenn du irgend etwas nicht verstehst!
Stelle keine Fragen in der Art "gebt mir bitte die richtige Lösung".

danke @ temi. Ja soll ich Klassenmethoden für jede Rechenart anwenden?
 
kneitzel

kneitzel

Top Contributor
Die Methoden addiere, subtrahiere, ... sind innerhalb der main Methode. Das wird dann wohl so nicht gehen :)
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Mir geht es eher um das "static" ;)

Aber vielleicht habe ich oben ja fett angegeben und verwende den Begriff jetzt selbst falsch?
Ne, du hast alles richtig verwendet :)

Ich würde hier nur bei static bleiben, alles andere dürfte grad nur verwirrend sein und der Mehrweit bleibt aus. Den Mehrwert hätte man dann, wenn in Richtung Strategie-Pattern und zb die von @mihe7 gezeigte Variante geht. Bisher sind das ja aber wirklich reine Funktionen ohne Zustand und Identität.
 
temi

temi

Top Contributor
Ich würde hier nur bei static bleiben, alles andere dürfte grad nur verwirrend sein und der Mehrweit bleibt aus.
Wie schon oben geschrieben, hat er ja auch Themen ("Datenkapselung"), die über dieses Einsteigerstadium hinaus gehen. Meiner Ansicht nach sollte man schon relativ frühzeitig "static" möglichst nur noch für die main()-Methode einsetzen oder dort, wo es funktional erforderlich ist.
 
kneitzel

kneitzel

Top Contributor
Bisher sind das ja aber wirklich reine Funktionen ohne Zustand und Identität.

Das wäre aber der erste wichtige Ansatz - unabhängig ob man Strategy Pattern verwendet oder nicht: Klassen von denen man Instanzen erzeugt in denen dann Daten enthalten sind auf denen man etwas ausführt und dann eben kein static mehr hat ...

Das wäre wohl ein wichtiger Schritt, den Codix gehen möchte, den spätestens mit GUI und so wird er mit sowas ja auch umgehen müssen ....
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Wie schon oben geschrieben, hat er ja auch Themen ("Datenkapselung"), die über dieses Einsteigerstadium hinaus gehen. Meiner Ansicht nach sollte man schon relativ frühzeitig "static" möglichst nur noch für die main()-Methode einsetzen oder dort, wo es funktional erforderlich ist.
Das wäre aber der erste wichtige Ansatz - unabhängig ob man Strategy Pattern verwendet oder nicht: Klassen von denen man Instanzen erzeugt in denen dann Daten enthalten sind auf denen man etwas ausführt und dann eben kein static mehr hat ...

Das wäre wohl ein wichtiger Schritt, den Codix gehen möchte, den spätestens mit GUI und so wird er mit sowas ja auch umgehen müssen ....

Grundsätzlich bin ich da voll bei euch – in diesem Fall allerdings scheitert es ja schon daran, überhaupt eine Methode zu schreiben, da dann Instanzmethoden zu verwenden, nur damit Instanzmethoden verwendet werden, halte ich deshalb für verfrüht. In diesem Fall würd das ja nur "Mehraufwand" ohne sichtbaren Nutzen bedeuten, von daher würde es dabei wohl nicht mal einen Lerneffekt geben.

In anderen Fällen (und auch wenn man das hier sinnvoll refactored) bin ich aber voll dafür :)
 
C

Codix

Bekanntes Mitglied
Stammt der Kommentar von dir?
Java:
public class Taschenrechner {

//Klassenvariable 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;
    }
Bei Potenz handelt es sich nämlich nicht um eine Klassenvariable, sondern um eine Klassenmethode!

Lerne und verwende die Begrifflichkeiten korrekt!
Stelle Fragen, wenn du irgend etwas nicht verstehst!
Stelle keine Fragen in der Art "gebt mir bitte die richtige Lösung".

wird korregiert. Dank und Respekt für die gute Java-Erziehung. ;)
 
O

osmane

Mitglied
Bei Potenz handelt es sich nämlich nicht um eine Klassenvariable, sondern um eine Klassenmethode!
Ich würde nicht so streng unterscheiden:
Java:
	static BiFunction<Integer, Integer, Long> pot = (basis, expo) -> IntStream.range(0, expo).mapToObj(i -> (long) basis).reduce(1L, (s, i) -> s * i);
Ist das für euch Klassenvariable oder -Methode?
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Ich würde nicht so streng unterscheiden:
Java:
    static BiFunction<Integer, Integer, Long> pot = (basis, expo) -> IntStream.range(0, expo).mapToObj(i -> (long) basis).reduce(1L, (s, i) -> s * i);
Ist das für euch Klassenvariable oder -Methode?
Ganz offensichtlich ist pot eine Klassenvariable, oder klappt pot(2, 2)?
 
mihe7

mihe7

Top Contributor
In
Java:
class X {
    public static Runnable worker;
}
wird worker zunächst eindeutig (per Definition) als Klassenvariable deklariert.

Nun könnte man auf die Idee kommen, "worker" als Namensraum für Klassenmethoden zu betrachten, nach dem Motto: wenn worker Klassenvariable von X ist, dann müssen die Methoden von worker auch Klassenmethoden von X sein, die lediglich unter Zuhilfenahme des Namensraums "worker" angesprochen werden. Somit wäre worker.run() eine Klassenmethode von X.

Mal abgesehen davon, dass die JLS es anders definiert, ist ein weiteres Problem dabei, dass X.worker eine Klassenvariable ist, die lediglich auf eine Instanz von Runnable verweisen kann. Die vermeintliche "Klassenmethode" X.worker.run() kann zur Laufzeit geändert werden, insbesondere kann sie "nicht definiert" sein, wenn worker == null gilt, was erst zur Laufzeit zu einer NPE führt. Die Methode "X.worker.run()" ist damit gerade kein Verhalten, das der Klasse X zugeschrieben werden kann.
 
kneitzel

kneitzel

Top Contributor
Gegenfrage, klappt pot.apply(3, 30) bei einer Nicht-Methode?
Das belegt es doch auch. pot muss eine Variable sein, denn ansonsten könnte da keine Referenz zu einer Instanz drin sein, die die apply Methode bereit stellt.

Wäre pot eine Methode, müsste es ja etwas sein wie pot().apply(3,30);
Sprich: Die Methode pot müsste dann eine Referenz zurück geben, die das apply anbietet.
 
C

Codix

Bekanntes Mitglied
Mach es einfach so wie es bei potenz() schon der Fall ist.

Aber: Hältst du es tatsächlich für sinnvoll ständig neue Probleme zu bearbeiten, wo die ersten noch nicht gelöst sind? Wie z.B. "Datenkapselung".

===

was hälst du von dem Ansatz?

Code:
public static void main(String[] args) {
        // TODO Automatisch generierter Methodenstub
        int zahl1, zahl2;
      
    
        public static int addiere(int Zahl1, int Zahl2)
        {
            int Zahl3 = Zahl1 + Zahl2;
   // vllt ohne return machen
         return Zahl3;
        }
if (eingabe =  +)
        System.out.println("Resultat = " + (zahl1 + zahl2));
else
        System.out.println("kein Ergebnis".);
 
C

Codix

Bekanntes Mitglied
was haltet ihr von dem Ansatz?
natürlich gibt es Fehler in dem code, er lässt sich nicht kompilieren (aber was sagst du zum Ansatz?).

Kann man: if (eingabe = +) coden?

Code:
public static void main(String[] args) {
        // TODO Automatisch generierter Methodenstub
        int zahl1, zahl2;
     
   
        public static int addiere(int Zahl1, int Zahl2)
        {
            int Zahl3 = Zahl1 + Zahl2;
   // vllt ohne return machen
         return Zahl3;
        }
if (eingabe =  +)
        System.out.println("Resultat = " + (zahl1 + zahl2));
else
        System.out.println("kein Ergebnis".);

 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 (+, -, *, /,^):");
 
kneitzel

kneitzel

Top Contributor
Von dem Ansatz halte ich nichts:
- Methoden können nicht in Methoden geschrieben werden wie du es machst. Darauf wurdest du schon hingewiesen.
- was ist eingabe für eine Variable? Wenn es ein String ist, dann musst du auch entsprechend Strings vergleichen, d.h. du musst gegen eine Zeichenkette prüfen.
 
C

Codix

Bekanntes Mitglied
Also der Taschenrechner sollte mit Methoden funken. Mir wurde geraten mit Klassenmethoden zu arbeiten.

Hat jmd. einen konkreten Quellcodevorschlag?
 
C

Codix

Bekanntes Mitglied
das ist z.B. ein einfacher Additionstaschenrechner mit statischer Methode:

Code:
import javax.swing.*;

public class Ad-TaRe {

static int summe(int x, int y) {

return (x + y);

}

public static void main(String[] args) {

int einVariable1, einVariable2;

einVariable1 = Integer.parseInt(JOptionPane.showInputDialog ("Geben Sie die erste Zahl ein:"));

einVariable2 = Integer.parseInt(JOptionPane.showInputDialog ("Geben Sie die zweite Zahl ein:"));

System.out.println("Die Summe der beiden Zahlen ist " + summe(einVariable1, einVariable2));

System.exit(0);

}
}

dann muss es doch möglich sein nach dem Vorbild einen komplexeren TaRe zu codieren.




Soll ich etwas alle Kalkulationsmethoden so durchgehen nach diesem Vorbild und dann in der anderen Klasse die Ein/Ausgabe machen?

Code:
import javax.swing.*;
public class Multi {
static int produkt(int x, int y) {
return (x * y);
}
public static void main(String[] args) {

int einVariable1, einVariable2;

einVariable1 = Integer.parseInt(JOptionPane.showInputDialog("Geben Sie den Wert für Zahl 1 ein:"));

einVariable2 = Integer.parseInt(JOptionPane.showInputDialog("Geben Sie den Wert für Zahl 2 ein:"));

System.out.println("Das Produkt der Zahlen ist " + produkt(einVariable1, einVariable2));

System.exit(0);
}
}
 
Zuletzt bearbeitet:
C

Codix

Bekanntes Mitglied
die Methoden an sich habe ich ja verstanden, aber wie man die Methoden komplex unterbringt in einem TaRe-Code, das kapiere ich noch nicht.
 
O

osmane

Mitglied
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;
		}
	}

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Taschenrechner mit Switch case Java Basics - Anfänger-Themen 4
F Erste Schritte Frage zu simplem Taschenrechner(switch) Java Basics - Anfänger-Themen 16
L Taschenrechner mit switch und while funktioniert noch nicht richtig Java Basics - Anfänger-Themen 22
D kleiner Taschenrechner mit switch fehlerhaft Java Basics - Anfänger-Themen 1
F Datentypen Ganz simpler Taschenrechner mit switch Java Basics - Anfänger-Themen 10
E JavaFX Taschenrechner Eingabe im Textfield beschränken Java Basics - Anfänger-Themen 2
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
W Taschenrechner Java Basics - Anfänger-Themen 11
A Taschenrechner mit Gui erstellen Java Basics - Anfänger-Themen 9
2 Taschenrechner mit GUI Problem bei der Berechnung Java Basics - Anfänger-Themen 8
P Taschenrechner mit unendlich vielen Eingabemöglichkeiten Java Basics - Anfänger-Themen 1
V Erste Schritte Taschenrechner mit beliebig vielen Zahlen Java Basics - Anfänger-Themen 5
S Taschenrechner Java Basics - Anfänger-Themen 13
P Taschenrechner Text übertragung Java Basics - Anfänger-Themen 3
S Compiler-Fehler Basic- Taschenrechner/ Fehler Java Basics - Anfänger-Themen 8
S Basic- Taschenrechner? Java Basics - Anfänger-Themen 7
P Hilfe bei Java Taschenrechner Java Basics - Anfänger-Themen 25
L Mein Taschenrechner lässt sich plötzlich nicht mehr öffnen Java Basics - Anfänger-Themen 5
S Taschenrechner hilfe! Java Basics - Anfänger-Themen 17
H Java Taschenrechner Java Basics - Anfänger-Themen 4
R Variablen Taschenrechner mit Komfortfunktionen Java Basics - Anfänger-Themen 2
J RPN Taschenrechner - keine Lösung!! Java Basics - Anfänger-Themen 84
M Java Taschenrechner (if-else) Java Basics - Anfänger-Themen 11
Q simpler Taschenrechner Java Basics - Anfänger-Themen 34
R Taschenrechner NullPointerException Java Basics - Anfänger-Themen 1
R Variablen Weitergehenderr Taschenrechner Java Basics - Anfänger-Themen 4
F Taschenrechner "Error loading class..." Java Basics - Anfänger-Themen 5
M Java Taschenrechner Programmieren Java Basics - Anfänger-Themen 12
P Erste Schritte Taschenrechner mit if-else Anweisung Java Basics - Anfänger-Themen 6
G Taschenrechner gibt nur 0.0 aus Java Basics - Anfänger-Themen 8
A Taschenrechner programmieren Java Basics - Anfänger-Themen 21
Z Java Taschenrechner Java Basics - Anfänger-Themen 6
J Kleiner Taschenrechner! Anfänger braucht Hilfe :( Java Basics - Anfänger-Themen 2
C Taschenrechner in Java Java Basics - Anfänger-Themen 6
J Erste Schritte Java CMD Taschenrechner mit Parametern! Java Basics - Anfänger-Themen 16
J Taschenrechner: Probleme Java Basics - Anfänger-Themen 5
E Taschenrechner problem! Ich komme nicht voran Java Basics - Anfänger-Themen 18
R Erste Schritte Taschenrechner mit Schleife Java Basics - Anfänger-Themen 24
Lord.Djerun (Taschenrechner Netbeans) Komma nur einmal schreiben & 0 ersetzen Java Basics - Anfänger-Themen 1
Z Taschenrechner - Additions/Substraktions/Multiplikations/Divionsketten! Java Basics - Anfänger-Themen 4
D Taschenrechner Frage Java Basics - Anfänger-Themen 12
Z Sehr simpler Taschenrechner - Hilfe! Java Basics - Anfänger-Themen 10
Z Taschenrechner - Wie addiere,multipliziere und subtrahiere ich? Java Basics - Anfänger-Themen 6
K Taschenrechner im GUI Java Basics - Anfänger-Themen 2
P Taschenrechner, operatoren Java Basics - Anfänger-Themen 4
D Simpler Taschenrechner Java Basics - Anfänger-Themen 6
A Anfänger Taschenrechner Frage Java Basics - Anfänger-Themen 14
R Erste Schritte Taschenrechner - Punkt-vor-Strich Rechnung Java Basics - Anfänger-Themen 1
S Operatoren Taschenrechner Ergebnis ausgeben Java Basics - Anfänger-Themen 7
A Taschenrechner zeigt Error Java Basics - Anfänger-Themen 7
J Taschenrechner Funktion Java Basics - Anfänger-Themen 18
M Taschenrechner fertigstellung Java Basics - Anfänger-Themen 1
N Methoden Taschenrechner Java Basics - Anfänger-Themen 2
F z = input.nextChar(); PROBLEM Taschenrechner Java Basics - Anfänger-Themen 7
J Scanner Taschenrechner? Java Basics - Anfänger-Themen 7
J Variablen Rechenzeichen und Zahlen verknüpfen für einen Taschenrechner Java Basics - Anfänger-Themen 17
B Klassen Java Taschenrechner mit Klassen und Methoden Java Basics - Anfänger-Themen 12
B Erste Schritte Brauche Hilfe bei einem Java-Taschenrechner Java Basics - Anfänger-Themen 11
R Methoden Taschenrechner Java Basics - Anfänger-Themen 4
P Taschenrechner , IF-Abfrage Java Basics - Anfänger-Themen 12
I Taschenrechner - Methoden implementieren Java Basics - Anfänger-Themen 5
I Java Starthilfe (Taschenrechner) Java Basics - Anfänger-Themen 7
J Taschenrechner Problemchen Java Basics - Anfänger-Themen 3
D Erste Schritte Taschenrechner Java Basics - Anfänger-Themen 11
K taschenrechner - Fehler beim Kürzen eines Bruches finden Java Basics - Anfänger-Themen 20
J Taschenrechner Punkt vor Strich Java Basics - Anfänger-Themen 9
A Taschenrechner programmieren Java Basics - Anfänger-Themen 5
M Ausklappbares Fenster bei grafischem Taschenrechner Java Basics - Anfänger-Themen 2
M Dividieren bei Grafischem Taschenrechner klappt nicht Java Basics - Anfänger-Themen 2
N Taschenrechner mit Unterprogra Java Basics - Anfänger-Themen 6
C Taschenrechner Java Basics - Anfänger-Themen 12
Z Taschenrechner programmieren Java Basics - Anfänger-Themen 5
E Erste Schritte Taschenrechner Java Basics - Anfänger-Themen 8
K Taschenrechner Java Basics - Anfänger-Themen 25
J Textfeld für Taschenrechner Java Basics - Anfänger-Themen 3
D Taschenrechner Java Basics - Anfänger-Themen 28
A Taschenrechner-GUI mit BorderLayout? Java Basics - Anfänger-Themen 6
W [PROJEKT] Simpler grafischer Taschenrechner Java Basics - Anfänger-Themen 8
M Taschenrechner mit JApplet Java Basics - Anfänger-Themen 26
J Grafischen Taschenrechner programmieren - Frage dazu Java Basics - Anfänger-Themen 12
W Taschenrechner Java Basics - Anfänger-Themen 2
T Tasten vom Taschenrechner? Java Basics - Anfänger-Themen 3
S Datentypen Taschenrechner Java Basics - Anfänger-Themen 13
J Taschenrechner Java Basics - Anfänger-Themen 5
J Taschenrechner Java Basics - Anfänger-Themen 9
M While bei einem Taschenrechner Java Basics - Anfänger-Themen 5
U Taschenrechner "Clear und Minusbutton" Java Basics - Anfänger-Themen 6
K Taschenrechner Java Basics - Anfänger-Themen 4
S Taschenrechner in Java - sinnvoll? Java Basics - Anfänger-Themen 3
M Taschenrechner Java Basics - Anfänger-Themen 15
N Taschenrechner mit plus Java Basics - Anfänger-Themen 8
E Anfänger Taschenrechner Java Basics - Anfänger-Themen 3
N Einfacherer Taschenrechner, ActionListener funzt nicht. Java Basics - Anfänger-Themen 8
Knizz Taschenrechner Java Basics - Anfänger-Themen 8
Knizz Taschenrechner über cmd Java Basics - Anfänger-Themen 9
JavaKaffee Taschenrechner, Methode schreiben? Java Basics - Anfänger-Themen 6
J Taschenrechner Combobox Reaktion auf Auswahl Java Basics - Anfänger-Themen 2
D Rücktaste bei einem Java Taschenrechner Java Basics - Anfänger-Themen 6
A Taschenrechner - Problem mit zwei Klassen Java Basics - Anfänger-Themen 6
R Java-Taschenrechner Funktioniert nicht Java Basics - Anfänger-Themen 16

Ähnliche Java Themen

Anzeige

Neue Themen


Oben