ok,
suche nach break und mache folgendes:
Achtung, kommt zweimal vor. Das verhindert die Ausgabe.Code:i = 0; break;
import java.util.Scanner;
import java.util.Stack;
public class UPNRechner {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in); //Benutzereingabe
boolean verlassen = false; //boolean zum Verlassen der while-Schleife bei true
Stack<Double> ergebnis = new Stack(); //Stack erstellt
int laengeVomStack = ergebnis.size();
int i = 0;
willkommen(); //Willkommenstext
Scanner scanner = new Scanner(System.in);
while (true) {
eingabe(); //
String nextLine = scanner.nextLine();
Scanner tokenizer = new Scanner(nextLine);
i = 0;
ergebnis.clear();
for (int ii = 0; tokenizer.hasNext(); ii++) {
i++;
String nutzereingabe;
nutzereingabe = tokenizer.next();
double zahl = 0.0;
try {
if (nutzereingabe.startsWith("0x") || nutzereingabe.startsWith("0X")) {
zahl = Integer.parseUnsignedInt(nutzereingabe.substring(2), 16);
} else if (nutzereingabe.startsWith("-0x") || nutzereingabe.startsWith("-0X")) {
zahl = Integer.parseInt(nutzereingabe.substring(3), 16);
} else if (nutzereingabe.startsWith("0b") || nutzereingabe.startsWith("0B")) {
zahl = Integer.parseInt(nutzereingabe.substring(2), 2);
} else if (nutzereingabe.startsWith("-0b") || nutzereingabe.startsWith("-0B")) {
zahl = Integer.parseInt(nutzereingabe.substring(3), 2);
} else {
zahl = Double.parseDouble(nutzereingabe);
}
} catch (NumberFormatException e) {
if (nutzereingabe.equals("+")
|| nutzereingabe.equals("-")
|| nutzereingabe.equals("*")
|| nutzereingabe.equals("x")
|| nutzereingabe.equals("/")
|| nutzereingabe.equals(":")
|| nutzereingabe.equals("pow")
|| nutzereingabe.equals("cos")
|| nutzereingabe.equals("sqrt")
|| nutzereingabe.equals("sin")
|| nutzereingabe.equals("cos")
|| nutzereingabe.equals("ln")
|| nutzereingabe.equals("~")
|| nutzereingabe.equals("e")
|| nutzereingabe.equals("tan")
|| nutzereingabe.equals("exp")
|| nutzereingabe.equals("pi")
|| nutzereingabe.equals("exit")) {
} else {
System.out.println(" Ungültige Eingabe! \n"
+ " Bitte erneut \n versuchen:");
i = 0;
break;
}
}
try {
// Rechenoperatoren
if (nutzereingabe.equals("+")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(ergebnis.pop() + ergebnisTmp);
} else if (nutzereingabe.equals("-")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(ergebnis.pop() - ergebnisTmp);
} else if (nutzereingabe.equals("x")
|| nutzereingabe.equals("*")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(ergebnis.pop() * ergebnisTmp);
} else if (nutzereingabe.equals("/")
|| (nutzereingabe.equals(":"))) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(ergebnis.pop() / ergebnisTmp);
} else if (nutzereingabe.equals("sqrt")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.sqrt(ergebnisTmp));
} else if (nutzereingabe.equals("sin")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.sin(ergebnisTmp));
} else if (nutzereingabe.equals("cos")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.cos(ergebnisTmp));
} else if (nutzereingabe.equals("tan")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.tan(ergebnisTmp));
} else if (nutzereingabe.equals("~")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push((ergebnisTmp * (-1)));
} else if (nutzereingabe.equals("ln")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.log(ergebnisTmp));
} else if (nutzereingabe.equals("exp")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.pow(Math.E, ergebnisTmp));
} else if (nutzereingabe.equals("pi")) {
ergebnis.push(Math.PI);
} else if (nutzereingabe.equals("pow")) {
Double ergebnisTmp = ergebnis.pop();
System.out.println(" Geben Sie einen "
+ "\n Exponenten ein:");
System.out.print(" ");
ergebnis.push(Math.pow(ergebnisTmp, scan.nextDouble()));
} else if (nutzereingabe.equals("e")) {
ergebnis.push(Math.E);
} else if (nutzereingabe.equalsIgnoreCase("exit")) {
System.exit(0);
} else {
ergebnis.push(zahl);
}
} catch (Exception e) {
System.out.println(" Ungültige Eingabe! \n"
+ " Bitte erneut versuchen:");
i=0;
break;
}
}
if (i >= 2 && ergebnis.size() == 1) {
double finErgebnis = ergebnis.peek();
System.out.println(" Ergebnis: ");
System.out.println(" " + finErgebnis);
}
}
}
public static void eingabe() {
System.out.println("\n Eingabe: ");
System.out.print(" ");
}
public static void willkommen() {
System.out.println(" U P N-TASCHENRECHNER");
System.out.println(" ********************");
}
}
Stimmt zwar, aber ich finde es mit switch/case trotzdem etwas besser lesbar:Würde ich so lassen denn swith case gibt den gleichen Dschungel nur mit anderen Schlüsselworten.Kann ich zum Beispiel diesen if-else-Dschungel sauber darstellen
switch (nutzereingabe) {
case "+":
ergebnis.push(ergebnis.pop() + ergebnis.pop());
break;
case "-":
ergebnis.push(-ergebnis.pop() + ergebnis.pop());
break;
case "x":
ergebnis.push(ergebnis.pop() * ergebnis.pop());
break;
...
Würde ich so lassen denn swith case gibt den gleichen Dschungel nur mit anderen Schlüsselworten.Kann ich zum Beispiel diesen if-else-Dschungel sauber darstellen? Geht das überhaupt in der Form mit einem switch-case?
Stimmt zwar, aber ich finde es mit switch/case trotzdem etwas besser lesbar:
operationen.put("+", stack -> stack.push(stack.pop() + stack.pop()));
operationen.put("-", stack -> stack.push(stack.pop() - stack.pop()));
operationen.get(nutzereingabe).consume(ergebnis);
import java.util.Scanner;
import java.util.Stack;
public class UPNRechner {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in); // Benutzereingabe
Scanner scanner = new Scanner(System.in); // zwei Scanner - dieser hier für den "Tokenizer"
Stack<Double> ergebnis = new Stack(); // Stack mit dem Namen "ergebnis" erstellt
willkommen(); // Überschrift/Begrüßungstext
/*
while-Schleife, welche den Großteil des Taschenrechners beinhaltet
*/
int i = 0;
while (true) {
eingabefeld(); // Eingabefeld (Text)
System.out.print(" ");
String nextLine = scanner.nextLine();
Scanner tokenizer = new Scanner(nextLine); // der "Tokenizer" dient zum Zerlegen der Benutzereingabe
i = 0;
ergebnis.clear();
for (int j = 0; tokenizer.hasNext(); j++) {
i++;
String nutzereingabe;
nutzereingabe = tokenizer.next();
double zahl = 0.0;
/*
In dieser try-catch-Anweisung wird die
"Umwandlung" von binären und hexadezimalen
Codes in Integer ausgeführt. Ebenfalls werden
Fehlermeldungen generiert, die eine ungültige
Eingabe bestätigen, und interne Fehlermeldungen
seitens IntelliJ, die das Programm ungewollt
beenden, werden beseitigt.
*/
try {
if (nutzereingabe.startsWith("0x") || nutzereingabe.startsWith("0X"))
zahl = Integer.parseInt(nutzereingabe.substring(2), 16);
else if (nutzereingabe.startsWith("-0x") || nutzereingabe.startsWith("-0X"))
zahl = Integer.parseInt(nutzereingabe.substring(3), 16);
else if (nutzereingabe.startsWith("0b") || nutzereingabe.startsWith("0B"))
zahl = Integer.parseInt(nutzereingabe.substring(2), 2);
else if (nutzereingabe.startsWith("-0b") || nutzereingabe.startsWith("-0B"))
zahl = Integer.parseInt(nutzereingabe.substring(3), 2);
else zahl = Double.parseDouble(nutzereingabe);
}catch (NumberFormatException e) {
if (nutzereingabe.equals("+")
|| nutzereingabe.equals("-")
|| nutzereingabe.equals("*")
|| nutzereingabe.equals("x")
|| nutzereingabe.equals("/")
|| nutzereingabe.equals(":")
|| nutzereingabe.equals("÷")
|| nutzereingabe.equals("pow")
|| nutzereingabe.equals("cos")
|| nutzereingabe.equals("sqrt")
|| nutzereingabe.equals("√")
|| nutzereingabe.equals("sin")
|| nutzereingabe.equals("cos")
|| nutzereingabe.equals("ln")
|| nutzereingabe.equals("~")
|| nutzereingabe.equals("e")
|| nutzereingabe.equals("tan")
|| nutzereingabe.equals("exp")
|| nutzereingabe.equals("pi")
|| nutzereingabe.equals("exit")) {
}else{
ungueltigeEingabe();
i=0;
break;
}
}
/*
In der folgenden try-catch-Anweisung sind die Funk-
tionen der Rechenoperatoren definiert - ebenso wird
hier geprüft, ob die Eingabe des Benutzers richtig
ist und/oder der Reihenfolge entspricht, in der diese
sein soll. Falls sich die Eingabe nicht um den Typ
Double oder um einen definierten Rechenoperatoren,
etc. handelt, soll für den Benutzer eine Fehlermeldung
erscheinen, die den Nutzer dazu auffordert, die
Handlung in korrekter Weise zu wiederholen.
*
*/
/*Hier wurde ein Double "ergebnisTmp" (temporäres
Ergebnis) erstellt. Dieser "speichert" den letzten
Wert im bzw. "auf" dem Stack. Durch "ergebnis.pop()"
wird eine Zahl vom Stapel genommen, mit "ergebnis.push()"
hinzugefügt.
*/
try {
if (nutzereingabe.equals("+")) { // Addition im Stack
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(ergebnis.pop() + ergebnisTmp);
} else if (nutzereingabe.equals("-")) { // Subtraktion im Stack
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(ergebnis.pop() - ergebnisTmp);
} else if (nutzereingabe.equals("x") || // Multiplikation im Stack
nutzereingabe.equals("*")) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(ergebnis.pop() * ergebnisTmp);
} else if (nutzereingabe.equals("/") || // Division im Stack
(nutzereingabe.equals(":"))) {
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(ergebnis.pop() / ergebnisTmp);
} else if (nutzereingabe.equals("sqrt") // Wurzelziehen
|| nutzereingabe.equals("√")){
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.sqrt(ergebnisTmp));
} else if (nutzereingabe.equals("sin")) { // Sinus-Funktion
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.sin(ergebnisTmp));
} else if (nutzereingabe.equals("cos")) { // Cosinus-Funktion
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.cos(ergebnisTmp));
} else if (nutzereingabe.equals("tan")) { // Tangens-Funktion
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.tan(ergebnisTmp));
} else if (nutzereingabe.equals("~")) { // Vorzeichen
Double ergebnisTmp = ergebnis.pop();
ergebnis.push((ergebnisTmp * (-1)));
} else if (nutzereingabe.equals("ln")) { // ln-Logarithmus
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.log(ergebnisTmp));
} else if (nutzereingabe.equals("exp")) { // E-Funktion
Double ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.pow(Math.E, ergebnisTmp));
} else if (nutzereingabe.equals("pi") || // pi-Funktion
nutzereingabe.equals("π")) {
ergebnis.push(Math.PI);
} else if (nutzereingabe.equals("pow")) { // Exponent einer Zahl
Double ergebnisTmp = ergebnis.pop();
exponenteingeben();
ergebnis.push(Math.pow(ergebnisTmp, scan.nextDouble()));
} else if (nutzereingabe.equals("e")) { // Eulersche Zahl
ergebnis.push(Math.E);
} else if (nutzereingabe.equalsIgnoreCase("exit")) { // Verlassen des Programms
System.exit(0);
} else {
ergebnis.push(zahl);
}
}catch (Exception e) {
ungueltigeEingabe(); // ungültige Eingabe
i=0;
break;
}
}
if (ergebnis.size() == 1) { // Wenn die Größe vom Stack "ergebnis" 1 beträgt und der Stack am Ende angelangt ist,..
double finErgebnis = ergebnis.peek(); // ..soll mit .peek() das Ergebnis angezeigt werden.
System.out.print(" Ergebnis: ");
System.out.println(finErgebnis);
System.out.println(" ");
}
}
}
public static void eingabefeld() {
System.out.println(" ********************");
System.out.print(" Eingabe:");
} // "Eingabe:" vor der Benutzereingabe
public static void willkommen() {
System.out.println(" ");
System.out.println(" U P N-TASCHENRECHNER");
} // Begrüßung
public static void ungueltigeEingabe() {
System.out.println(" Ungültige Eingabe. \n" +
" Bitte erneut versuchen!");
} // ungültige Benutzereingabe
public static void exponenteingeben() {
System.out.print(" Geben Sie einen " +"\n" +
" Exponenten ein: ");
} // Exponent eingeben
}
import java.util.Scanner;
import java.util.Stack;
public class UPNRechner {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in); // Benutzereingabe
Scanner scanner = new Scanner(System.in); // zwei Scanner - dieser hier für den "Tokenizer"
Stack<Double> ergebnis = new Stack(); // Stack mit dem Namen "ergebnis" erstellt
willkommen(); // Überschrift/Begrüßungstext
/*
while-Schleife, welche den Großteil des Taschenrechners beinhaltet
*/
int i = 0;
while (true) {
eingabefeld(); // Eingabefeld (Text)
System.out.print(" ");
String nextLine = scanner.nextLine();
Scanner tokenizer = new Scanner(nextLine); // der "Tokenizer" dient zum Zerlegen der Benutzereingabe
i = 0;
ergebnis.clear();
for (int j = 0; tokenizer.hasNext(); j++) {
i++;
String nutzereingabe;
nutzereingabe = tokenizer.next();
double zahl = 0.0;
/*
In dieser try-catch-Anweisung wird die
"Umwandlung" von binären und hexadezimalen
Codes in Integer ausgeführt. Ebenfalls werden
Fehlermeldungen generiert, die eine ungültige
Eingabe bestätigen, und interne Fehlermeldungen
seitens IntelliJ, die das Programm ungewollt
beenden, werden beseitigt.
*/
try {
if (nutzereingabe.startsWith("0x") || nutzereingabe.startsWith("0X"))
zahl = Integer.parseInt(nutzereingabe.substring(2), 16);
else if (nutzereingabe.startsWith("-0x") || nutzereingabe.startsWith("-0X"))
zahl = Integer.parseInt(nutzereingabe.substring(3), 16);
else if (nutzereingabe.startsWith("0b") || nutzereingabe.startsWith("0B"))
zahl = Integer.parseInt(nutzereingabe.substring(2), 2);
else if (nutzereingabe.startsWith("-0b") || nutzereingabe.startsWith("-0B"))
zahl = Integer.parseInt(nutzereingabe.substring(3), 2);
else zahl = Double.parseDouble(nutzereingabe);
}catch (NumberFormatException e) {
if (nutzereingabe.equals("+")
|| nutzereingabe.equals("-")
|| nutzereingabe.equals("*")
|| nutzereingabe.equals("x")
|| nutzereingabe.equals("/")
|| nutzereingabe.equals(":")
|| nutzereingabe.equals("÷")
|| nutzereingabe.equals("pow")
|| nutzereingabe.equals("cos")
|| nutzereingabe.equals("sqrt")
|| nutzereingabe.equals("√")
|| nutzereingabe.equals("sin")
|| nutzereingabe.equals("cos")
|| nutzereingabe.equals("ln")
|| nutzereingabe.equals("~")
|| nutzereingabe.equals("e")
|| nutzereingabe.equals("tan")
|| nutzereingabe.equals("exp")
|| nutzereingabe.equals("pi")
|| nutzereingabe.equals("exit")) {
}else{
ungueltigeEingabe();
i=0;
break;
}
}
/*
In der folgenden try-catch-Anweisung sind die Funk-
tionen der Rechenoperatoren definiert - ebenso wird
hier geprüft, ob die Eingabe des Benutzers richtig
ist und/oder der Reihenfolge entspricht, in der diese
sein soll. Falls sich die Eingabe nicht um den Typ
Double oder um einen definierten Rechenoperatoren,
etc. handelt, soll für den Benutzer eine Fehlermeldung
erscheinen, die den Nutzer dazu auffordert, die
Handlung in korrekter Weise zu wiederholen.
*
*/
/*Hier wurde ein Double "ergebnisTmp" (temporäres
Ergebnis) erstellt. Dieser "speichert" den letzten
Wert im bzw. "auf" dem Stack. Durch "ergebnis.pop()"
wird eine Zahl vom Stapel genommen, mit "ergebnis.push()"
hinzugefügt.
*/
try {
Double ergebnisTmp = ergebnis.pop();
switch (nutzereingabe) {
case "+":
ergebnis.push(ergebnis.pop() + ergebnis.pop());
break;
case "-":
ergebnis.push(ergebnis.pop() - ergebnis.pop());
break;
case "*":
ergebnis.push(ergebnis.pop() * ergebnis.pop());
break;
case "x":
ergebnis.push(ergebnis.pop() * ergebnis.pop());
break;
case "/":
ergebnis.push(ergebnis.pop() * ergebnis.pop());
break;
case ":":
ergebnis.push(ergebnis.pop() * ergebnis.pop());
break;
case "÷":
ergebnis.push(ergebnis.pop() * ergebnis.pop());
break;
case "sqrt":
ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.sqrt(ergebnisTmp));
break;
case "√":
ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.sqrt(ergebnisTmp));
break;
case "sin":
ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.sin(ergebnisTmp));
break;
case "cos":
ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.cos(ergebnisTmp));
break;
case "tan":
ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.tan(ergebnisTmp));
break;
case "~":
ergebnisTmp = ergebnis.pop();
ergebnis.push((ergebnisTmp * (-1)));
break;
case "exp":
ergebnisTmp = ergebnis.pop();
ergebnis.push(Math.pow(Math.E, ergebnisTmp));
break;
case "pi":
ergebnis.push(Math.PI);
break;
case "π":
ergebnis.push(Math.PI);
break;
case "e":
ergebnis.push(Math.E);
break;
case "pow":
ergebnisTmp = ergebnis.pop();
exponenteingeben();
ergebnis.push(Math.pow(ergebnisTmp, scan.nextDouble()));
break;
case "exit":
System.exit(0);
break;
default:
ergebnis.push(zahl);
}
}catch (Exception e) {
ungueltigeEingabe(); // ungültige Eingabe
i=0;
break;
}
}
if (ergebnis.size() == 1) { // Wenn die Größe vom Stack "ergebnis" 1 beträgt und der Stack am Ende angelangt ist,..
double finErgebnis = ergebnis.peek(); // ..soll mit .peek() das Ergebnis angezeigt werden.
System.out.print(" Ergebnis: ");
System.out.println(finErgebnis);
System.out.println(" ");
}
}
}
public static void eingabefeld() {
System.out.println(" ********************");
System.out.print(" Eingabe:");
} // "Eingabe:" vor der Benutzereingabe
public static void willkommen() {
System.out.println(" ");
System.out.println(" U P N-TASCHENRECHNER");
} // Begrüßung
public static void ungueltigeEingabe() {
System.out.println(" Ungültige Eingabe. \n" +
" Bitte erneut versuchen!");
} // ungültige Benutzereingabe
public static void exponenteingeben() {
System.out.print(" Geben Sie einen " +"\n" +
" Exponenten ein: ");
} // Exponent eingeben
}
Einfach so? Oder gibt es auch eine Fehlermeldung?jetzt gibt er die Rechnung nicht aus
Einfach so? Oder gibt es auch eine Fehlermeldung?
e.printStackTrace()
aufrufen. Im StackTrace müsste man die Ursache dann sehen....
for (int j = 0; tokenizer.hasNext(); j++) {
i++;
String nutzereingabe;
nutzereingabe = tokenizer.next();
double zahl = 0.0;
...
Für mich wäre das eine gültige Eingabe. Wenn man 5 eingibt kommt eben 5 heraus. Was ist daran falsch?Wenn ich zum Beispiel nur eine Zahl wie zum Beispiel 5 eingebe
und Enter drücke, kommt einfach nochmal "Eingabe:" ohne dass
es eine Fehlermeldung "Ungültige Eingabe" ausgibt.
>3 3 x 4 4 x
Stack: 9, 16
Anzeige: 16
>+
Stack: 25, Anzeige: 25
Sonst kann man ja gar keine Kettenrechnungen mit Zwischenergebnissen machen.
Wenn man 5 eingibt kommt eben 5 heraus. Was ist daran falsch?
Ist dadurch nicht schwieriger. Man löscht den Stack eben nicht und gibt immer das oberste Element aus. Wäre meines Erachtens sogar ein wenig einfacher.Also der Prof. hat gemeint, dass unser Projekt nur das Endergebnis anzeigen soll. Wäre auch fürs erste Semester etwas weit hergeholt, finde ich.
Kann ich nicht nachvollziehen. Bei mir sieht es so aus, wenn ich 5 eingebe:Kommt eben nicht raus, sondern es fängt einfach eine neue Rechnung an.
U P N-TASCHENRECHNER
********************
Eingabe: 5
Ergebnis: 5.0
********************
Eingabe:
Das widerspricht meinem Beispiel ja nicht. Den Stack habe ich zum Verständnis angegeben. Ausgegeben würde nur jeweils der Anzeigewert.Also der Prof. hat gemeint, dass unser Projekt nur das Endergebnis anzeigen soll.
U P N-TASCHENRECHNER
********************
Eingabe: 5 2 -
Ergebnis: -3.0
********************
Eingabe:
Übrigens rechnet dein Programm bei nicht kommutativen Operationen nicht mehr richtig:
Code:U P N-TASCHENRECHNER ******************** Eingabe: 5 2 - Ergebnis: -3.0 ******************** Eingabe:
Da stimm ich @Meniskusschaden zu, das wäre eher leichter gewordenAlso der Prof. hat gemeint, dass unser Projekt nur das Endergebnis anzeigen soll. Wäre auch fürs erste Semester etwas weit hergeholt, finde ich.
Habe den Fehler gefunden, war in dem Fall Minus und Plus vertauscht...