Java Taschenrechner Konsole so okay ?

Hannibal Smith

Jumbo Frame
🎅 Nikolaus-Rätsel-Elite
Registriert
Apr. 2015
Beiträge
1.191
Bitte einmal drüberschaun und Kritik äußern wenn ich gerade Zeit und Lust habt :)
Möchte mich (wieder einmal) einfinden und es diesmal dann aber auch "gescheit" lernen
Vielen Dank im vorraus
Code:
import java.lang.Math;
import java.util.Scanner;

/**
* @author Hannibal Smith
* Version v.0.2
*/
public class Taschenrechner {
    public static void main(String[] args) {
     
        Scanner eingabe = new Scanner(System.in);
     
        double x=0, y=0, ausgabe=0;
        String operator;
     
        System.out.println("++Taschenrechner++");
        System.out.println("Welche Berechnung möchten sie durchführen ?");
        System.out.println("+ = Addition \n- = Subtraktion \n* = Multiplikation \n/ = Division");
        operator = eingabe.next();
     
        if(operator.equals("+")) {
            System.out.println("Das ergebnis lautet: "+ addition(operator, eingabe, x, y, ausgabe));
         
        } else if(operator.equals("-")) {
            System.out.println("Das ergebnis lautet: "+ subtraktion(operator, eingabe, x, y, ausgabe));
         
        } else if(operator.equals("/")) {
            System.out.println("Das ergebnis lautet: "+ division(operator, eingabe, x, y, ausgabe));
     
        } else if(operator.equals("*")) {
            System.out.println("Das ergebnis lautet: "+ multiplikation(operator, eingabe, x, y, ausgabe));
     
        } else {
            System.out.println("Ungültiger Operator: "+ operator);
        }
     
    }
 

    //Addition
    private static double addition(String text, Scanner eingabe, Double x, Double y, Double ausgabe) {
        System.out.print("Bitte geben sie den ersten Summand ein: ");
        x = eingabe.nextDouble();
        System.out.print("Bitte geben sie den zweiten Summand ein: ");
        y = eingabe.nextDouble();
     
        ausgabe = x + y;
        return ausgabe;
     
     
    }
 
    //Subtraktion
    private static double subtraktion(String text, Scanner eingabe, Double x, Double y, Double ausgabe) {
        System.out.print("Bitte geben sie den Minuend ein: ");
        x = eingabe.nextDouble();
        System.out.print("Bitte geben sie den Subtrahend ein: ");
        y = eingabe.nextDouble();
     
        ausgabe = x - y;
        return ausgabe;
     
     
    }

    //Division
    private static double division(String text, Scanner eingabe, Double x, Double y, Double ausgabe) {
        System.out.print("Bitte geben sie den Dividend ein: ");
        x = eingabe.nextDouble();
        System.out.print("Bitte geben sie den Divisor ein: ");
        y = eingabe.nextDouble();
     
        ausgabe = x / y;
        return ausgabe;
     
     
    }

    //Multiplikation
    private static double multiplikation(String text, Scanner eingabe, Double x, Double y, Double ausgabe) {
        System.out.print("Bitte geben sie den Multiplikator ein: ");
        x = eingabe.nextDouble();
        System.out.print("Bitte geben sie den Multiplikand ein: ");
        y = eingabe.nextDouble();
     
        ausgabe = x * y;
        return ausgabe;
     
     
    }
}

[/SPOILER]
 
Hallo,
was mir beim überfliegen aufgefallen ist. Du könntest diese if...else if...else Orgien durch ein switch case ersetzen. Und deine Lösung ist nicht Objektorientiert. Das erinnert eher an C als an Java ;-)

greetz
hroessler
 
Hast du bewusst die Wrapper Klassen für double in deiner Methode Addition usw. benutzt? Macht in meinen Augen in diesem Beispiel keinen Sinn.
 
Nein das war keine Absicht, wusste bis eben nicht, dass es sie gibt ... muss ich mir mal schauen :D
Bzgl. des Switch case - ich schau mir das mal an und ändere es dann
 
hroessler schrieb:
Und deine Lösung ist nicht Objektorientiert. Das erinnert eher an C als an Java ;-)

Dachte ich auch zuerst, aber dann wiederum... So generische Beispiele/Übungsaufgaben strikt Objektorientiert umzusetzen ist dann oft von hinten durch die Brust ins Auge.
 
Ich würde dir empfehlen mehr Kommentare zu schreiben. Es sollte mindestens über jeder Methode/Funktion stehen was diese macht, welche Parameter sie benötigt und was sie zurück gibt. Mag sein, dass es hier jetzt noch selbsterklärend ist, aber irgendwann wenn der Code komplexer wird, ist das meist nicht mehr der Fall.

EDIT: Die Kommantare sind nicht nur für andere gedacht, sondern auch für einen selbst. Merkt man direkt wenn man nach ein paar Wochen wieder an seinem eigenen Code arbeitet... Da ist man häufig über jeden Kommentar den man erstellt hat froh...:D
 
  • Gefällt mir
Reaktionen: DLX23 und Hannibal Smith
Vielen Dank schonmal :D
Ja Kommentare werd ich mir dann angewöhnen müssen, da haste Recht

Nochmal bezüglich der Wrapper Klassen ... was meinst du damit genau ?
 
Ich persönlich würde mit den Operationen anders umgehen und das weder als Switch, noch als If-Else Anweisung so stehen lassen. Bei 4 Operationen mag das ja mal noch gehen aber wenn du mal vor hast da wesentlich mehr mathematische Operationen einzubauen wird das irgendwann ne riesengroße Switch-Case Anwendung.

Ich würde ein Interface definieren für Operationen das ganz primitiv so aussehen könnte.

Java:
public interface IOperation{
    String getOperationId();
    void execute();
}

Alle deine Operationen die du in deinem Taschenrechner haben willst, leiten als Klasse von diesem Interface ab. Wenn das Programm startet registrierst du alle Operationen die in deinem System vorhanden sind in einer Liste

Java:
List<IOperation> operations = .....

Die Registrierung kann erstmal manuell erfolgen, kannst dich später auch mal mit Reflections beschäftigen, dann registrieren die sich von selbst beim Starten.

Um dann schlussendlich die richtige Operation zu starten, die du aus dem Scanner ausließt, brauchst du nur noch über die Liste zu fahren und execute aufzurufen, sobald die ID der Operation mit dem der Eingabe übereinstimmt

Code:
String test_id = "+";
for (IOperation op : operations) {
    if (op.getOperationId().equals(test_id)) {
        op.execute(args);
    }
}

Wenn du also eine neue Operation hinzufügen willst, brauchst du schlussendlich nur noch eine neue Klasse von IOperation abzuleiten und das System macht schon automatisch den Rest, musst nie wieder ne Switch-Case/If-Else Anwendung erweitern
 
Soo hab den Code etwas geändert ....

Hab eine neue Methode die nur einließt (spart das ganze Sysout und einlesen in den rechnenden Methoden)
Code:
    //Gibt dein Eingabewert des Scanners als Double zurück
    private static double get_number(String text, Scanner eingabe) {
        System.out.print(text);
        return eingabe.nextDouble();
    }

Hab die Variable "ausgabe" entfernt ... gebe nur noch die Rechnung zurück
Code:
//Addition Übernimmt Rechnung bei Eingabe: "+"
    private static double addition(String text, Scanner eingabe, Double x, Double y) {
        x = get_number("Bitte geben sie den ersten summand ein: ", eingabe);
        y = get_number("Bitte geben sie den zweiten Summand ein: ", eingabe);
        
        return x+y;
    }


@cppnap ich gucks mir in ruhe an und versuchs mal :)
 
Code:
    private static double addition(String text, Scanner eingabe, Double x, Double y) {
        x = get_number("Bitte geben sie den ersten summand ein: ", eingabe);
Warum wechselst du immer zwischen double und Double?
Warum haben die Methoden Parameter x und y, die du aber für die Berechnung ignorierst?
 
Darlis schrieb:
Code:
    private static double addition(String text, Scanner eingabe, Double x, Double y) {
        x = get_number("Bitte geben sie den ersten summand ein: ", eingabe);
Warum wechselst du immer zwischen double und Double?
Warum haben die Methoden Parameter x und y, die du aber für die Berechnung ignorierst?
Hab ich mich auch schon gefragt, vielleicht wollte er erst die Texte & Werte übergeben und dann später hat es doch nochmal anders geschrieben, die addition-Funktion könnte auch so aussehen:
Code:
    private static double addition(Scanner eingabe) {
        double x = get_number("Bitte geben sie den ersten summand ein: ", eingabe);
        double y = get_number("Bitte geben sie den zweiten Summand ein: ", eingabe);
       
        return x+y;
    }
oder gleich mit "static Scanner" spart man noch mehr Übergabeparameter:
Code:
public class Taschenrechner {
    static Scanner eingabe;
    public static void main(String[] args) {
        eingabe = new Scanner(System.in);
        ...

    //Gibt dein Eingabewert des Scanners als Double zurück
    private static double get_number(String text) {
        System.out.print(text);
        return eingabe.nextDouble();
    }

    private static double addition() {
        double x = get_number("Bitte geben sie den ersten summand ein: ");
        double y = get_number("Bitte geben sie den zweiten Summand ein: ");
       
        return x+y;
    }
 
Darlis schrieb:
Code:
    private static double addition(String text, Scanner eingabe, Double x, Double y) {
        x = get_number("Bitte geben sie den ersten summand ein: ", eingabe);
Warum wechselst du immer zwischen double und Double?
Warum haben die Methoden Parameter x und y, die du aber für die Berechnung ignorierst?

Bei den Methoden für die Berechnung hab ichs angepasst -> Mir war kein Unterschied bewusst :/
Bei der Methode fürs einlesen bekommt ich nen Syntax error wenn ich "eingabe.nextdouble;" versuch
1234.PNG

Ergänzung ()

Habt ihr noch paar Seiten mit guten Übungsaufgaben und den passenden Lösungen für mich ?
Hab hier irgendwo in nen Thread nen Link zu ner Art Forum gefunden wo es Aufgaben gab und jeder konnte seine Lösung einreichen bis irgendwann ne Musterlösung vom Mod kam ... weis jemand was ich meine ?
 
Visual Studio Code kann ich übrigens sehr empfehlen als IDE.
Kommentare sind wichtig und richtig allerdings nur dann wenn die Funktion o.ä. nicht direkt selbsterklärend ist.
im großen und ganzen geht es ja darum den Code sauber und lesbar zu gestalten.
 
Visual Studio ? Dachte das ist nur für VisualBasic ...
Welche Vorteile hätte es denn gegenüber Eclipse ?
Hab hier Eclipse in Verwendung
 
  • Gefällt mir
Reaktionen: Reeii, Hannibal Smith und new Account()
Visual Studio ist eine IDE bzw. Entwicklingsumgebung. Du kannst damit für alle möglichen Sprachen entwickeln wie z.B. C#, Visual C++, Visual Basic, Python usw.

Visual Studio Code ist quasi nur der reine Texteditor aus Visual Studio.
 
  • Gefällt mir
Reaktionen: Hannibal Smith
Vielleicht ist es ja untergegangen ... :)

Habt ihr noch paar Seiten mit guten Übungsaufgaben und den passenden Lösungen für mich ?
Hab hier irgendwo in nen Thread nen Link zu ner Art Forum gefunden wo es Aufgaben gab und jeder konnte seine Lösung einreichen bis irgendwann ne Musterlösung vom Mod kam ... weis jemand was ich meine ?
 
Zurück
Oben