Java Taschenrechner Konsole so okay ?

Hannibal Smith

Lieutenant
Dabei seit
Apr. 2015
Beiträge
810
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]
 
H

hroessler

Gast
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
 

Hades85

Commander
Dabei seit
Jan. 2008
Beiträge
2.276
Hast du bewusst die Wrapper Klassen für double in deiner Methode Addition usw. benutzt? Macht in meinen Augen in diesem Beispiel keinen Sinn.
 

Hannibal Smith

Lieutenant
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
810
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
 

TopperHarley87

Lieutenant
Dabei seit
März 2011
Beiträge
615
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
 

Hannibal Smith

Lieutenant
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
810
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 ?
 

cppnap

Lt. Junior Grade
Dabei seit
Nov. 2008
Beiträge
465
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
 

Hannibal Smith

Lieutenant
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
810
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 :)
 

Darlis

Commodore
Dabei seit
Jan. 2011
Beiträge
4.262
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?
 

lynxx

Lt. Junior Grade
Dabei seit
Feb. 2005
Beiträge
391
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;
    }
 

Hannibal Smith

Lieutenant
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
810
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 ?
 

DLX23

Ensign
Dabei seit
Sep. 2015
Beiträge
255
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.
 

Hannibal Smith

Lieutenant
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
810
Visual Studio ? Dachte das ist nur für VisualBasic ...
Welche Vorteile hätte es denn gegenüber Eclipse ?
Hab hier Eclipse in Verwendung
 

andy_m4

Commander
Dabei seit
Aug. 2015
Beiträge
2.785
Visual Studio ? Dachte das ist nur für VisualBasic ...
Du verwechselst Visual Studio mit Visual Studio Code:
https://de.wikipedia.org/wiki/Visual_Studio_Code

Welche Vorteile hätte es denn gegenüber Eclipse ?
Für Java bringt es in der Tat wenig. Der Schwerpunkt liegt mehr auf Web. Ich glaube, er verwechselt Java mit Javascript. :-)
 

TopperHarley87

Lieutenant
Dabei seit
März 2011
Beiträge
615
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.
 

Hannibal Smith

Lieutenant
Ersteller dieses Themas
Dabei seit
Apr. 2015
Beiträge
810
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 ?
 
Top