Wie findet ihr meinen Java Taschenrechner?
public static void main(String args []) {
Scanner s = new Scanner (System.in);
System.out.println("Hallo, dies ist ein Taschenrechner");
Methode();
System.out.println("Möchtest du nochmal rechnen?: j/n");
String Nochmal = s.next();
if (Nochmal.equals("j")) {
Methode();
}
else
{
System.out.println("Vielen Dank und auf Wiedersehen!");
}
}
public static void Methode() {
Scanner s = new Scanner (System.in);
boolean bool;
System.out.println("Wähle eine Rechenoperation aus. Zur Auswhl stehen: +,-,/,");
String Operationszeichen = s.next();
do {
if (Operationszeichen.equals("+")) {
System.out.println("Eingabe bestätigt.");
bool = true;
}
else if (Operationszeichen.equals("-")) {
System.out.println("Eingabe bestätigt.");
bool = true;
}
else if (Operationszeichen.equals("/")) {
System.out.println("Eingabe bestätigt.");
bool = true;
}
else if (Operationszeichen.equals("")) {
System.out.println("Eingabe bestätigt.");
bool = true;
}
else {
bool = false;
System.out.println("Eingabe nicht verstanden. Bitte wähle eine gültige Rechenoperation aus.");
Operationszeichen = s.next();
}
}
while(bool == false);
System.out.println("Nun gib zwei Zahlen ein, mit denen gerechnet werden soll");
double a = s.nextInt();
double b = s.nextInt();
double c;
if (Operationszeichen.equals("+")) {
c = a + b;
}
else if (Operationszeichen.equals("-")) {
c = a - b;
}
else if (Operationszeichen.equals("/")) {
c = a / b;
}
else {
c = a * b;
}
System.out.println("Das ergebnis lautet: " + c);
}
7 Antworten
Hallo stupidity430,
Du fragst nach meiner ehrlichen Meinung, hier ist meine ehrliche, persönliche Meinung. Der Code ist für einen Java-Anfänger, bzw. einen Programmieranfänger hinnehmbar. Einen Blumentopf gewinnt man damit natürlich nicht. Als Übung ist es ein Anfang und evtl. eine Basis um weitere Übungen durchzuführen.
Bei Taschenrechner denke ich natürlich nicht an einen Konsolenapplikation, sondern an eine UI, die einen Taschenrechner nachbildet. Das wäre vielleicht als nächste Übung ganz nett.
Zum Code und zur Funktionalität selbst.
- Der Nutzer wird nach erfolgter Berechnung gefragt ob er nochmal rechnen möchte und kann dies tun. Danach kann er jedoch nicht nochmals Rechnen, da das Programm beendet wird. Was ist das für ein seltsames Verhalten?
- Die Multiplikation ist nicht erreichbar (auch bei Leereingabe nicht)
- Du bist noch in der static-Hölle. Keine Objektorientierung, aber schön alles statisch. Wobei alles natürlich recht wenig ist.
- Variablennamen schreibt man klein (z.B. Operationszeichen)
- Variablennamen sollten Aussagekräftig sein (bool ist zu generisch, wie wäre es mit operationGewaehlt)
- Methodennamen schreibt man klein
- Die Methode "Methode" ist sehr schlecht benannt (generische Namen helfen nicht dem Verständnis)
- Es werden mehrere Scanner erzeugt, warum? Einer reicht doch.
- Was ist die Aufgabe von Methode? Eine Methode sollte im Idealfall genau eine Aufgabe erfüllen. Deine "Methode" erledigt Eingabe, Ausgabe, Rechenoperation und dazu noch eine Schleife
- Die Multiplikation fehlt in der Liste der möglichen Rechenoperationen (der Code sieht dies jedoch "halb" vor).
- Viel zu viele Literale im Code, die sich dazu noch wiederholen (z.B. "Eingabe bestätigt")
- Du verwendest "nextInt()", aber als Variablentyp "double". Bei Eingabe von einem double Wert kommt es zu einer "InputMismatchException"
- Allgemein wird bei Eingaben nicht genügend auf Falscheingaben geprüft. ExceptionHandling erfolgt überhaupt nicht.
- "Ergebnis" wird groß geschrieben. User facing Text sollte korrekt geschrieben werden.
Wahrscheinlich lassen sich noch ein paar Punkte finden, aber das war erstmal das Grobe.
Gruß
was war an seiner sehr umfangreichen Verbesserungsliste unfreundlich?
"
- Du bist noch in der static-Hölle. Keine Objektorientierung, aber schön alles statisch. Wobei alles natürlich recht wenig ist.
"
Wenn das schon unfreundlich ist, ok, dann war der Post unfreundlich.
"static-Hölle" ist einfach ein Begriff und meiner Meinung nach auch nicht unpassend. Ich behaupte mal, dass sehr, sehr viele Anfänger, die mit Java einsteigen irgendwann mal Bekanntschaft mit der static-Hölle machen. Mich selbst übrigens eingeschlossen.
Gruß
Das ist unfreundlich, das aber nicht. "aber schön alles statisch. Wobei alles natürlich recht wenig ist."
Dass alles statisch ist, ist eine Feststellung. "Schön" ist evtl. unangebracht; aber bitte, wie sanft muss es denn sein?
Wobei alles natürlich recht wenig ist.
Das "recht wenig" war nicht nicht negativ gemeint. Da es wenig ist und nur eine statische Methode überhaupt existiert, ist die Schlussfolgerung, dass stupidity430 alles statisch macht natürlich einzuschränken. Aus dem kurzen Code kann man nicht ablesen ob der Nutzer das generell so macht. Der Verdacht lag nur nahe.
Gruß
Ich danke dir für deine Kritik, aber ich bin noch ein Anfänger. Ich finde das alles total spannend, aber mache es erst seit zwei Wochen.
Ich sagte ja, für einen Anfänger hinnehmbar. Ich würde das auch nicht negativ verstehen, gibt halt viel zu lernen.
Viel Spaß dabei
Gruß
Als Ergänzung zu oben:
1) Schließe die Verbindung des Scanners zum Eingabestream, wenn du mit ihm nicht mehr liest.
2) Formatiere deinen Code, wenn du ihn hier postest oder nutze Seiten wie pastebin.com.
Nervig.
Ich mag Programme nicht, die so mitteilsam sind. Und trotzdem das Programm alles kommentiert, wird eine Division durch 0 weder abgefangen, noch beanstandet!
Wenn ich im Taschenrechner 3+4 rechnen will, möchte ich auch 3+4 eingeben und "=" drücken und mich nicht durch zig Dialoge quälen!
Zudem schreibt man "Auswahl" mit "a" vor dem h und "Ergebnis" schreibt man groß.
Also: nein, das ist nichts!
Ist jetzt nichts besonderes. Du könntest die ganzen if Else durch 2 Switch austauschen.
Und die Abfrage ob man nochmal rechnen will würde am Ende der Methode mehr Sinn machen. Dann könnte man es beliebig oft machen und nicht nur 2 mal.
bool == false ist eigentlich auch unschön. Besser wäre !bool
OK danke, das war mein Problem. Ich werds mal versuchen!
Kann man machen, muss man aber net. Die if-Abfragen kannste entweder durch switch-Case vereinfachen oder, nur deutlich weniger Code, durch RegEx. Außerdem haste die Schleife in der main-Methode vergessen die Wiederholgungen zulässt.
Die zweite if-Abfrage kannste auch wieder durch switch-Case vereinfachen. Zudem kannste dir die Variable "c" eigentlich sparen. Außerdem sollte man Variablen am Anfang einer Methode deklarieren.
Dann wären da noch die Codeconventions (Variablen klein schreiben, Methodennamen in Camelcase usw.).
http://www.oracle.com/technetwork/java/codeconventions-135099.html
Dann wäre da noch die kleine Problematik, dass du deine Scanner nicht schließt.
Achja teilen durch 0 sollte eig. auch nicht möglich sein und beim Einlesen der Doubles sollteste drauf achten, dass der Typ auch stimmt.
Bei der Gelegenheit dann noch die Idee, dass du einen Scanner als Parameter übergibst, wenn du eh einen in der main hast.
Das ganze mal so ungefähr:
Hallo stupidity430 🖐️
Also als erstes bin ich auch noch in Anfänger, verstehe aber deinen Code.
Also fangen wir an:
Du hättest statt a, b und c,
double zahl1 = s.nexInt();
double zahl2 = s.nextInt();
double ergebnis;
machen können.
Das war's xD (Bin halt auch noch Anfänger xD)
Du bist teilweise sehr unfreundlich. Das finde ich nicht gut. Deine Punkte sind korrekt.
mfg