Frage zu einem "Taschenrechner" code

Jeremy....

Mitglied
Eignet sich dieser code als taschenrechner um ihn auch z.B in einen JFrame zu optimieren?
Wenn nicht hat jmd verbesserungs vorschläge?
import java.util.Scanner;


Java:
import java.util.Scanner;

public class taschenRechner {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        System.out.println("Ersten wert eingeben:");
        double zahl1 = scanner.nextDouble();
        System.out.println("Zweiten wert eingeben:");
        double zahl2 = scanner.nextDouble();
        double ergebnis;
        System.out.println("Dein erster wert lautet "+ zahl1 + ", dein zweiter wert lautet "+ zahl2+". Wie sollen diese operatoren verrechnet werden?(Bitte die rechenaktion als wort ausschreiben!)");
        String rz = scanner.next();


    if(rz.equals("minus")||rz.equals("subtrahieren")){
    ergebnis = zahl1 - zahl2;
    System.out.println("Das Ergebnis lautet "+ergebnis);

}if(rz.equals("plus")||rz.equals("Addieren")){
    ergebnis = zahl1 + zahl2;
    System.out.println("Das Ergebnis lautet "+ergebnis);
}if(rz.equals("geteilt")||rz.equals("Dividieren")){
    ergebnis = zahl1 / zahl2;
    System.out.println("Das Ergebnis lautet "+ergebnis);
}if(rz.equals("mal")||rz.equals("Multiplizieren")){
    ergebnis = zahl1 * zahl2;
    System.out.println("Das Ergebnis lautet "+ergebnis);}

        }
    }
 

KonradN

Super-Moderator
Mitarbeiter
Du hast ein reines Konsolenprogramm und das alles in einer Methode. Damit hast Du keine Komponente, die Du weiter verwenden könntest.

Dazu dient in Objektorientierten Sprachen das Konstrukt der Klassen. Damit baut man Komponenten (hier konkret Klassen, aber das können dann speziell in Java Libraries oder Module sein), die universell verwendbar sind.

In der Regel ist die Herangehensweise, dass man immer mit einem Universellen Modell anfängt. Damit baust Du dann eine Klasse Rechner oder so, die dann die Berechnungen machen kann. Die Oberfläche (oder hier die Konsolenanwendung) kommt dann erst als zweiter Schritt und nutzt dann die Universelle Komponente. Und das kann dann halt beliebig umgesetzt werden. Und da wird dann auch deutlich:
  • Du hast als erstes ein Model gebaut, das eben keine Verbindung hat zu irgend einer Bedienung oder so
  • Was du dann als zweites baust ist dann komplett offen: Konsolenanwendung, Swing Anwendung, JavaFX Anwendung, Android App, Web Anwendung mit Spring, Quarkus, oder mit Jakarta EE für einen Application Server oder oder oder ...
 

KonradN

Super-Moderator
Mitarbeiter
Und evtl. als kleinen Hinweis: Du solltest ggf. equalsIgnoreCase verwenden oder eine einheitliche Benennung nutzen. Du erwartest mal alles klein und mal ist der erste Buchstabe gross geschrieben. Bei equalsIgnoreCase kannst Du die EIngabe beliebig machen, also egal ob Du minus, Minus, miNUS, MINUS, ... eingibst: Er würde es entsprechend auswerten.
 

Jeremy....

Mitglied
Und evtl. als kleinen Hinweis: Du solltest ggf. equalsIgnoreCase verwenden oder eine einheitliche Benennung nutzen. Du erwartest mal alles klein und mal ist der erste Buchstabe gross geschrieben. Bei equalsIgnoreCase kannst Du die EIngabe beliebig machen, also egal ob Du minus, Minus, miNUS, MINUS, ... eingibst: Er würde es entsprechend auswerten.
Du hast ein reines Konsolenprogramm und das alles in einer Methode. Damit hast Du keine Komponente, die Du weiter verwenden könntest.

Dazu dient in Objektorientierten Sprachen das Konstrukt der Klassen. Damit baut man Komponenten (hier konkret Klassen, aber das können dann speziell in Java Libraries oder Module sein), die universell verwendbar sind.

In der Regel ist die Herangehensweise, dass man immer mit einem Universellen Modell anfängt. Damit baust Du dann eine Klasse Rechner oder so, die dann die Berechnungen machen kann. Die Oberfläche (oder hier die Konsolenanwendung) kommt dann erst als zweiter Schritt und nutzt dann die Universelle Komponente. Und das kann dann halt beliebig umgesetzt werden. Und da wird dann auch deutlich:
  • Du hast als erstes ein Model gebaut, das eben keine Verbindung hat zu irgend einer Bedienung oder so
  • Was du dann als zweites baust ist dann komplett offen: Konsolenanwendung, Swing Anwendung, JavaFX Anwendung, Android App, Web Anwendung mit Spring, Quarkus, oder mit Jakarta EE für einen Application Server oder oder oder ...
Das modell mit den klassen ist mir klar. Ich war mir nur unsicher wie ich diese in einem Rechner benutzen soll und habe es versucht und es funktionierte nicht wie ich wollte.
Vielen Dank aber für den Rat dann werde ich versuchen mit Modulen umzusetzen!
 

Marsupilami

Mitglied
Statt die ganzen if Anweisungen zu benutzen würde ich stattdessen versuchen den Block mit den Kontrollstrukturen, also den "if-Block" durch switch-case Anweisungen auszutauschen. Du könntest hinsichtlich OOP (Objektorientierte Programmierung) die main Methode auch erst einmal leer lassen und für den Anfang eine einfache void-Methode zusammenbasteln, die du in der main Methode aufrufst. Was die Übernahme in einen J-Frame anbelangt kannst du den switch-case Block dann auch problemlos über das Action-Event eines Buttons aufrufen(Button anklicken). Ich würde Dir, solltest du Eclipse als IDE verwenden, den Window-Builder für die unproblematische Erstellung des Frames empfehlen. Bei IntelliJ heisst das Pendant dazu glaube ich Scene-Builder.
 

KonradN

Super-Moderator
Mitarbeiter
Das modell mit den klassen ist mir klar. Ich war mir nur unsicher wie ich diese in einem Rechner benutzen soll und habe es versucht und es funktionierte nicht wie ich wollte.
Wenn Du etwas versucht hast und es nicht ging, dann ist es eine super Idee, den Versuch zu zeigen und dann kann man darauf eingehen.

Der typische Ansatz ist immer gleich: Man identifiziert alle "Objekte", mit denen man es zu tun hat.

Da sieht man bei deinem Rechner ja direkt 3 Elemente: Zwei Operanden und ein Operator.

Da kann man sich dann überlegen: Von was für einem Typ sind diese denn? Das kann man aber als ersten Schritt einfach erst einmal als eigenen Typ machen:
  • Du hast firstOperand und secondOperand vom Typ Operand
  • Du hast ein operation vom Typ Operation.

Nun kann man sich überlegen, dass Operand einfach nur double sein soll. Also fliegt die Klasse/Interface Operand erst einmal raus.

Also bleibt Operation. Operation ist entweder Multiplikation, Division, Addition oder Subtraktion. Das sieht doch direkt nach einer Enumeration aus:
Java:
public enum Operation {
    MULTIPLICATION, DIVISION, ADDITION, SUBTRACTION
}

Wenn man das hat, dann kann man sich überlegen, was man für Operationen braucht. Der Calculator soll ein Ergebnis Evaluieren. Das kann dann also etwas sein wie:

Java:
public class Calculator {
    private double firstOperator;
    private double secondOperator;
    private Operation operation;
    
    // Getter / Setter / Constructor ....
    
    public double evaluate() {
        switch (operation) {
            case MULTIPLICATION:
                return firstOperator * secondOperator;
                
            case DIVISION:
                // ....
            
            default:
                // Exception werfen oder so ...
        }
    }
}

Das ist die alte Schreibweise ein switch mit der -> form (Switch Expression), die relativ neu ist, ist besser lesbar finde ich, aber da ich nicht weiss, ob Du die auch kennst, habe ich das mal weg gelassen.
 

KonradN

Super-Moderator
Mitarbeiter
Wenn Du dann das Model soweit hast, dann kommt es zu der UI. Das kann durchaus eine Konsolenanwendung sein. Da gehst Du dann aber prinzipiell gleich ran. Was brauchst Du da an Features? Du musst aus einer Eingabe ein Operator bekommen. Das ist dann etwas, das man oft als Adapter bezeichnet. Das wäre dann ein OperatorAdapter und der hat dann die Methode, die einen String annimmt und daraus einen Operator macht.

Um das sauber zu halten, würde ich da eine Map<String, Operator> nutzen, die ich einmal füllen würde. Das wäre dann etwas wie:
"+" -> ADDITION,
"add" -> ADDITION,
"addieren" -> ADDITION,
"plus" -> ADDITION,
...

Die Methode würde dann einfach die Eingabe in lower case umwandeln und dann ein map.get aufrufen ... am Ende prüfen, ob das Ergebnis null ist um ggf. eine Exception zu werfen.

Damit eine UI verifizieren kann ohne Exception wäre auch noch eine Methode "isOperator(String)" interessant, der halt auch abprüft, ob es einen entsprechenden Key gibt.

Wenn man das alles noch weiter treiben wollte, dann kann man das sogar noch ausgliedern in eine Ressource Datei - dann hat man es auch noch lokalisierbar und man kann da dann Versionen für Deutsch, Englisch, Französisch, .... bereit stellen.
 

KonradN

Super-Moderator
Mitarbeiter
Certainly, here's a basic example of a calculator code in Python:
Bitte nicht einfach ChatGPT Antworten posten. Das wird vor allem dann unsinnig, wenn
a) Antwort auf Englisch
b) Antwort Python und nicht Java
c) Die Antwort komplett am Thema vorbei geht und die Frage des TE in keiner Weise auch nur beachtet findet.
 

Jeremy....

Mitglied
Wenn Du etwas versucht hast und es nicht ging, dann ist es eine super Idee, den Versuch zu zeigen und dann kann man darauf eingehen.

Der typische Ansatz ist immer gleich: Man identifiziert alle "Objekte", mit denen man es zu tun hat.

Da sieht man bei deinem Rechner ja direkt 3 Elemente: Zwei Operanden und ein Operator.

Da kann man sich dann überlegen: Von was für einem Typ sind diese denn? Das kann man aber als ersten Schritt einfach erst einmal als eigenen Typ machen:
  • Du hast firstOperand und secondOperand vom Typ Operand
  • Du hast ein operation vom Typ Operation.

Nun kann man sich überlegen, dass Operand einfach nur double sein soll. Also fliegt die Klasse/Interface Operand erst einmal raus.

Also bleibt Operation. Operation ist entweder Multiplikation, Division, Addition oder Subtraktion. Das sieht doch direkt nach einer Enumeration aus:
Java:
public enum Operation {
    MULTIPLICATION, DIVISION, ADDITION, SUBTRACTION
}

Wenn man das hat, dann kann man sich überlegen, was man für Operationen braucht. Der Calculator soll ein Ergebnis Evaluieren. Das kann dann also etwas sein wie:

Java:
public class Calculator {
    private double firstOperator;
    private double secondOperator;
    private Operation operation;
   
    // Getter / Setter / Constructor ....
   
    public double evaluate() {
        switch (operation) {
            case MULTIPLICATION:
                return firstOperator * secondOperator;
               
            case DIVISION:
                // ....
           
            default:
                // Exception werfen oder so ...
        }
    }
}

Das ist die alte Schreibweise ein switch mit der -> form (Switch Expression), die relativ neu ist, ist besser lesbar finde ich, aber da ich nicht weiss, ob Du die auch kennst, habe ich das mal weg gelassen.
warum genau haben sie/hast du die double werte privat gemacht?
 

KonradN

Super-Moderator
Mitarbeiter
warum genau haben sie/hast du die double werte privat gemacht?
Das nennt sich Kapselung. Wenn man anderen Klassen Zugriff auf den inneren Status gibt, dann offenbart man zum einen Internas der Klasse und zum anderen kann man dann nichts mehr anpassen.

Wenn wir das alles erweitern, dann wird es ggf. später ein Interface Operand geben und Implementationen wie DoubleOperand, FractionOperand, ...

Und schon würde eine Zuweisung nicht mehr funktionieren. Ein Code wie:

Java:
Calulator calculazor = new Calculator();
calculator.firstOperand = 1.0;
würde nicht mehr gehen, wenn man den Typ anpasst. Bei einem Setter kann man das aber machen, denn man kann die Methode ja umschreiben, also etwas wie:
Java:
public class Calulator {
    private Operand firstOperand;
    
    public void setFirstOperand(double value) {
        firstOperand = new DoubleOperand(value);
    }
}

Sprich: Durch die Kapselung haben wir ein klares Interface vorgegeben. Die Internas interessieren dabei nicht. Und das Interface können wir beibehalten.

Und die Berechnung kann man dann über Regeln machen. Wenn beide Operands den gleichen Typ haben, dann wird die Berechnung mit dem entsprechenden Calculator für den Typ gemacht. Und man muss sich überlegen, was für Berechnungsregeln man hat. Das kann also etwas komplexer werden. Bei DoubleOperand und FractionOperand könnte man sagen: Wir arbeiten einfach mit Double Werten, d.h. das Interface hat dann eine Methode getDoubleValue.

Wenn man aber komplexe Zahlen dazu nimmt, dann wird es schwerer. Dann muss klar sein: Es gibt eine Konvertierung hin zu komplexen Zahlen. Wenn dich also ein FractionOperand und ein ComplexOperand habe, dann muss der FractinOperand zu einem ComplexOperand werden.

Aber das sind dann Dinge, die man sich in Ruhe überlegen muss, wenn man das vorhandene erweitern will. Das will ich hier nicht zu sehr ausarbeiten. Nur der kurze Überblick, dass man eben damit sicher stellt, dass man seinen Code später erweitern kann, ohne Probleme zu bekommen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
dieter000 Frage zu einem Beispiel... Java Basics - Anfänger-Themen 5
L Wie frage ich ab, ob in einem Array, Werte doppelt vorkommen? Java Basics - Anfänger-Themen 4
A Frage zu einem Array Java Basics - Anfänger-Themen 14
M Frage zum generellen Verständiss von OO an einem Beispiel Java Basics - Anfänger-Themen 4
F Frage von einem Neuling: Was bedeutet Scanner scanner ? Java Basics - Anfänger-Themen 5
S Frage zu einem Syntax Java Basics - Anfänger-Themen 2
M Frage zu einem Exception oder Api-Dokument Java Basics - Anfänger-Themen 11
M Frage zu einem Parameter Eingabe eines programms Java Basics - Anfänger-Themen 3
T Frage zu einem kleinen programm mit array's Java Basics - Anfänger-Themen 8
G Frage zur einfügen in einem Binärbaum Java Basics - Anfänger-Themen 21
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20
F Kurze Frage zu replace() Java Basics - Anfänger-Themen 19
JavaSchmecktLecker Polymorphie Frage zur Methodenüberschreibung Java Basics - Anfänger-Themen 21
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
DoubleM Runtime.getRuntime().exec Frage Java Basics - Anfänger-Themen 2
J Eine theoretische Frage zur Praxis - JPanel oder Canvas Java Basics - Anfänger-Themen 5
O Frage: Formaler Typbezeichner? Java Basics - Anfänger-Themen 3
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
N Spezielle frage zum Comparator Java Basics - Anfänger-Themen 6
L Frage zum Array Java Basics - Anfänger-Themen 1
A Frage zum UML Design Java Basics - Anfänger-Themen 1
I Hilfe bei Klausur Frage Java Basics - Anfänger-Themen 8
izoards Drucken Frage zu FAQ Beitrag Java Basics - Anfänger-Themen 2
J Frage zu meinem Code (OOP) Java Basics - Anfänger-Themen 4
sserio Split() -> Regex Frage. Java Basics - Anfänger-Themen 7
A OCA Study Guide: 2. Frage aus Kapitel 3 Java Basics - Anfänger-Themen 9
sserio Date Library Frage Java Basics - Anfänger-Themen 9
Max246Sch Frage zu Währungsrechner Code Java Basics - Anfänger-Themen 2
sserio Frage zu HashMaps Java Basics - Anfänger-Themen 20
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
sserio Frage zu Lambda Ausdrücken Java Basics - Anfänger-Themen 7
sserio Frage zu BigInteger Java Basics - Anfänger-Themen 1
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
xxx12 Frage Java Basics - Anfänger-Themen 2
I Generelle Frage zu Mikroservices (Spring Boot?), Docker... Java Basics - Anfänger-Themen 7
R Frage zu Methoden (Rückgabewert u. ohne.) Java Basics - Anfänger-Themen 2
A Frage zur programmierung Java Basics - Anfänger-Themen 12
M Frage zur Methode split der Klasse String Java Basics - Anfänger-Themen 32
R Input/Output Frage zu Java IO Java Basics - Anfänger-Themen 6
M Frage zu printWriter Java Basics - Anfänger-Themen 5
C Frage zu OLSMultipleLinearRegression Java Basics - Anfänger-Themen 31
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
L Frage zur Ticket Maschine Java Basics - Anfänger-Themen 1
J Frage zu OOP-Klassendiagramm Java Basics - Anfänger-Themen 8
OSchriever Frage zu Compiler Java Basics - Anfänger-Themen 8
H Frage zu Throw Exception Java Basics - Anfänger-Themen 2
TimoN11 Frage zu Java-Vererbung (Cast) Java Basics - Anfänger-Themen 5
Bademeister007 Hallo Leute ich hab eine Frage zur ArrayList Java Basics - Anfänger-Themen 8
F Frage betreff Programmierbücher zu Lagerverwaltung als Konsolenprogramm Java Basics - Anfänger-Themen 3
dieter000 Kurze Frage kann mir ejmand kurz diesen Code erklären, bzw wie man die zeilen erklärt und so Java Basics - Anfänger-Themen 1
I String.split regex Frage Java Basics - Anfänger-Themen 2
N Best Practice Frage zum MVC-Pattern Java Basics - Anfänger-Themen 2
J Frage zum Loggen Java Basics - Anfänger-Themen 18
J Methoden Frage: Array-Werte in anderer Methode ändern Java Basics - Anfänger-Themen 4
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
JD_1998 Array-Position aus einer Methode in einer anderen ausgeben (Kurze Frage) Java Basics - Anfänger-Themen 2
marcooooo Frage zu bestimmten Beispiel Java Basics - Anfänger-Themen 31
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
N Input/Output Eine Frage über system.out.println. Java Basics - Anfänger-Themen 10
B Erste Schritte Learning Coding (!) Frage an erfahrene Programmierer. Java Basics - Anfänger-Themen 23
M konzeptuelle Frage: In welcher Klasse definiert man am Besten Methoden, die die Kommunikation mit dem User regeln? Java Basics - Anfänger-Themen 8
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
C Exception-Frage Java Basics - Anfänger-Themen 3
J Eine Frage zur Schreibweise == ? : Java Basics - Anfänger-Themen 3
S Frage des Designs Java Basics - Anfänger-Themen 1
JavaTalksToMe Extends/Implements Frage Java Basics - Anfänger-Themen 3
pkm Frage zu Servletfunktion Java Basics - Anfänger-Themen 0
B Frage zur Währungsumrechnung Java Basics - Anfänger-Themen 3
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
Kirby.exe Frage zur Verwendung von Interfaces Java Basics - Anfänger-Themen 6
D Frage zu Strings einer Exception Java Basics - Anfänger-Themen 4
D Frage zur IDE IntelliJ IDEA Java Basics - Anfänger-Themen 6
H Frage zum 2d Array Java Basics - Anfänger-Themen 1
N Frage zum Newton-Fraktal Java Basics - Anfänger-Themen 1
H Frage zu interfaces Java Basics - Anfänger-Themen 1
J Frage dazu Variablen klassenübergreifend zu verändern Java Basics - Anfänger-Themen 22
I Frage zu SkipList Java Basics - Anfänger-Themen 4
G Frage zu JScrollPane Java Basics - Anfänger-Themen 12
Kirby.exe Allgemeine Frage Java Basics - Anfänger-Themen 3
W Frage zu anonymen Klassen Java Basics - Anfänger-Themen 4
J Kleine Frage zu OOP Java Basics - Anfänger-Themen 371
S Frage Klasse und Objekte Java Basics - Anfänger-Themen 2
F Frage zu Iteratoren Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur ArrayList Java Basics - Anfänger-Themen 15
J Frage zur Vererbung Java Basics - Anfänger-Themen 1
H Frage zur ermittlung eines doppelte Paars aus Sotieralgorithmus Java Basics - Anfänger-Themen 4
H Frage zum Array Java Basics - Anfänger-Themen 17
G Schach -Frage 2- Maussteuerung Java Basics - Anfänger-Themen 7

Ähnliche Java Themen

Neue Themen


Oben