Taschenrechner programmieren?
Ich habe nun in Java einen Taschenrechner programmiert. Ich bin noch ein Anfänger und bereite mich auf mein Studium vor.
Hier erstmal mein Code:
import java.util.Scanner;
public class Taschenrechner {
public static void main(String[] args) {
Scanner benutzereingabe = new Scanner(System.in);
double zahl1;
double zahl2;
char operator;
System.out.println("Geben sie die erste Zahl ein:");
zahl1 = benutzereingabe.nextDouble();
System.out.println("Geben sie die zweite Zahl ein:");
zahl2 = benutzereingabe.nextDouble();
System.out.println("Bitte geben sie ihren gewünschten Rechenoperator ein ('+', '-', '*', '/'):");
operator = benutzereingabe.next().charAt(0);
if (operator == '+') {
System.out.println(zahl1 + zahl2);
} else if (operator == '-') {
System.out.println(zahl1 - zahl2);
} else if (operator == '*') {
System.out.println(zahl1 * zahl2);
} else if (operator == '/') {
System.out.println(zahl1 / zahl2);
} else {
System.out.println("Ihr Rechenoperator ist nicht gültig!");
}
}
}
Meine Frage:
Ich möchte eine Funktion einbauen, bei der ein Text ausgegeben wird:
Bitte geben sie nur Zahlen ein!
Heißt, dass wenn man in die Konsole einen Buchstaben oder ein anderes Symbol eingibt statt eine Zahl, wird dieser Text ausgegeben. Ich habe schon einen Ansatz, aber er ist nicht ganz richtig.
ich würde etwas in die Richtung
if (zahl1 != Zahlen) {
System.out.println("Bitte geben sie nur Zahlen ein!");
}
if (zahl2 != Zahlen) {
System.out.println("Bitte geben sie nur Zahlen ein!");
}
Das Problem was ich habe ist, dass die Variable "Zahlen" ja gar nicht existiert. Ich wüsste auch jetzt nicht, wie man das mit einem Array lösen sollte.
Also man könnte ja ein Array erstellen, wo alle Zahlen zwischen 0 und 9, inklusive Kommazahlen, definiert werden, aber keine Ahnung wie das geht.
3 Antworten
Du kannst um das .nextDouble einfach ein try-catch bauen, das den Fehler abfängt, der bei falscher Eingabe geworfen wird. Und dann im Fehlerfall, also innerhalb des catch-Blocks, deinen gewünschten Text ausgeben.
try {
zahl1 = benutzereingabe.nextDouble();
} catch(InputMismatchException e) {
System.out.println("Bitte geben sie nur Zahlen ein!");
}
Weil du in dem Fall zahl1 nie setzt.
Der Code, um zahl1 zu setzen, konnte ja nicht ausgeführt werden. Weil er einen Fehler geworfen hat.
Du sagst dem Nutzer dann zwar, dass die Eingabe falsch war, aber dein Programm läuft trotzdem einfach weiter.
Hier kannst du
A) Dein Programm abbrechen
oder (finde ich nutzerfreundlicher)
B) Den Nutzer nochmal um eine Eingabe bitten
Was möchtest du machen? Kann dir gerne dabei helfen.
Ok, dann brauchst du im nächsten Schritt noch eine Schleife um dein try-catch. (Am besten erstmal informieren, was Schleifen sind, wenn dir das nichts sagt)
Vor dieser Schleife erstellst du eine boolean Variable, welche als Wiederholungs-Bedingung für die Schleife dient. (Solange diese Variable auf true ist, wiederholt sich der Code in der Schleife).
Bei gültiger Eingabe änderst du die Variable auf false, wodurch die Schleife kein weiteres mal ausgeführt wird.
Wohingegen sie bei einer ungültigen Eingabe nochmal ausgeführt wird, da die Variable (=Wiederholungsbedingung) weiterhin true ist.
boolean repeat = true;
while (repeat) {
try {
// Lass den Nutzer eine Zahl eingeben
repeat = false; // Diese Zeile hier wird nur erreicht, falls das einlesen der Zahl keinen Fehler geworfen hat! -> Gültige Zahl -> Schleife abbrechen
} catch(InputMismatchException exception) {
// Sag dem Nutzer, dass die Eingabe falsch war
}
}
Ich hatte es gerade mit ChatGPT so gelöst:
System.out.println("Geben sie die erste Zahl ein:");
while (true) {
try {
zahl1 = benutzereingabe.nextDouble();
break;
} catch (InputMismatchException e) {
System.out.println("Bitte geben sie eine Zahl ein!");
benutzereingabe.next();
}
}
Stimmt, mit break; geht's auch. Ist noch schöner, als eine extra Variable zu machen.
Genau. Der hat das etwas simpler gelöst. Aber ich danke dir trotzdem vielmals.
Der Scanner-Typ hat eine Methode, mit der man prüfen kann, ob sich eine Zahl im Eingabestream befindet. So lange das nicht der Fall ist, kannst du eine Schleife laufen lassen, die auf neue Eingaben wartet.
Beispiel:
Scanner reader = new Scanner(System.in);
double value;
while (!reader.hasNextDouble()) {
System.out.println("Wrong input!");
reader.next();
}
value = reader.nextDouble();
Jetzt bekomme ich den Fehler, dass zahl1 nicht initialisiert wurde. Komisch.