From 5622aa2f9271bd9d04cbe974e4c5793ffa50a3b3 Mon Sep 17 00:00:00 2001 From: "artem.didytschuk" Date: Mon, 19 Apr 2021 20:06:15 +0200 Subject: [PATCH] Code auskommentiert --- GUI.java | 1 - Rechenmaschine.java | 99 ++++++++++++++++++++++++++++----------------- package.bluej | 54 +++++++++++++++---------- 3 files changed, 94 insertions(+), 60 deletions(-) diff --git a/GUI.java b/GUI.java index e9f19bf..88b81bd 100644 --- a/GUI.java +++ b/GUI.java @@ -18,7 +18,6 @@ public class GUI extends JFrame { buttonBerechnen.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - //TODO: Text vom Text field zu Eingabe übergeben try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException classNotFoundException) { diff --git a/Rechenmaschine.java b/Rechenmaschine.java index 6e9a4f4..d7c6720 100644 --- a/Rechenmaschine.java +++ b/Rechenmaschine.java @@ -41,11 +41,13 @@ public class Rechenmaschine { public boolean scanne(String pEingabe) { char[] eingabe = pEingabe.toCharArray(); + //Klammercounter, Endzustand wird nur akzeptiert, wenn dieser 0 ist, ähnlich wie bei einem Kellerautomaten klammern = 0; int state = 0; StringBuilder currentToken = new StringBuilder(); for (char buchstabe : eingabe) { switch (state) { + //Anfangszustand, Erlaubte Buchstaben: "0..9",".","(" case 0: switch (buchstabe) { case '0' -> { @@ -57,11 +59,11 @@ public class Rechenmaschine { state = 2; } case '.' -> { - System.out.println("Am anfang des Termes kann kein . stehen."); + System.out.println("Am anfang des Termes kann kein \".\" stehen."); return false; } case '+', '-', '*', '/' -> { - System.out.println("Der Term darf nicht mir mit dem Operator " + buchstabe + " beginnen."); + System.out.println("Der Term darf nicht mir mit dem Operator \"" + buchstabe + "\" beginnen."); return false; } case '(' -> { @@ -70,19 +72,20 @@ public class Rechenmaschine { klammern++; } case ')' -> { - System.out.println("Der Term darf nicht mit ) beginnen"); + System.out.println("Der Term darf nicht mit \")\" beginnen"); return false; } default -> { - System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); + System.out.println("Der Buchstabe \"" + buchstabe + "\" ist nicht in der Sprache vorhanden."); return false; } } break; case 1: + //Zustand nach eingabe einer 0. Erlaube Buchstaben: ".","+-*/",")" switch (buchstabe) { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> { - System.out.println("Wenn eine 0 am anfang eines Operands ist, muss ein . folgen."); + System.out.println("Wenn eine \"0\" am anfang eines Operands ist, muss ein \".\" folgen."); return false; } case '.' -> { @@ -103,16 +106,17 @@ public class Rechenmaschine { klammern--; } case '(' -> { - System.out.println("Mach einem Operand darf nicht unmittelbar ein ( folgen"); + System.out.println("Mach einem Operand darf nicht unmittelbar ein \"(\" folgen"); return false; } default -> { - System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); + System.out.println("Der Buchstabe \"" + buchstabe + "\" ist nicht in der Sprache vorhanden."); return false; } } break; case 2: + //Zustand nach eingabe einer "Zahl != 0" Erlaube Buchstaben: "0..9",".","+-*/",")" switch (buchstabe) { case '.' -> { currentToken.append(buchstabe); @@ -136,28 +140,30 @@ public class Rechenmaschine { klammern--; } case '(' -> { - System.out.println("Nach einem Operand darf nicht unmittelbar ein ( folgen."); + System.out.println("Nach einem Operand darf nicht unmittelbar ein \"(\" folgen."); return false; } default -> { - System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); + System.out.println("Der Buchstabe \"" + buchstabe + "\" ist nicht in der Sprache vorhanden."); return false; } } break; case 3: + //Zustand unmittelbar nach Eingabe eines ".". Erlaubte Buchstaben: "0..9" switch (buchstabe) { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> { currentToken.append(buchstabe); state = 4; } - case '+', '-', '*', '/', '(', ')' -> { - System.out.println("Nach einem . darf kein Rechenoperator, oder eine Klammer folgen"); + case '+', '-', '*', '/', '(', ')', '.' -> { + System.out.println("Nach einem \".\" darf kein weiterer \".\", Rechenoperator, oder Klammer folgen"); return false; } } break; case 4: + //Zustand nachdem eine Zahl nach einem "." erfasst wurde. Erlaubte Buchstaben: "0..9","+-*/",")" switch (buchstabe) { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> { currentToken.append(buchstabe); @@ -170,7 +176,7 @@ public class Rechenmaschine { state = 5; } case '.' -> { - System.out.println("Eine Dezimalzahl kann nur ein . haben."); + System.out.println("Eine Dezimalzahl kann nur ein \".\" haben."); return false; } case ')' -> { @@ -181,16 +187,17 @@ public class Rechenmaschine { klammern--; } case '(' -> { - System.out.println("Nach einem Operand darf nicht unmittelbar ein ( folgen."); + System.out.println("Nach einem Operand darf nicht unmittelbar ein \"(\" folgen."); return false; } default -> { - System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); + System.out.println("Der Buchstabe \"" + buchstabe + "\" ist nicht in der Sprache vorhanden."); return false; } } break; case 5: + //Zustand nach einem Operator. Erlaube Buchstaben: "0..9","(" switch (buchstabe) { case '0' -> { currentToken.append(buchstabe); @@ -201,7 +208,7 @@ public class Rechenmaschine { state = 2; } case '.' -> { - System.out.println("Nach einem Operator kann kein . stehen."); + System.out.println("Nach einem Operator kann kein \".\" stehen."); return false; } case '+', '-', '*', '/' -> { @@ -214,15 +221,16 @@ public class Rechenmaschine { klammern++; } case ')' -> { - System.out.println("Nach einem Operator darf kein ) folgen."); + System.out.println("Nach einem Operator darf kein \")\" folgen."); return false; } default -> { - System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); + System.out.println("Der Buchstabe \"" + buchstabe + "\" ist nicht in der Sprache vorhanden."); return false; } } break; + //Zustand nach Eingabe einer "(". Erlaube Buchstaben:"0..9","+-","(" case 6: switch (buchstabe) { case '0' -> { @@ -238,23 +246,28 @@ public class Rechenmaschine { state = 5; } case '*', '/' -> { - System.out.println("Unmittelbar nach ( darf kein Operator oder ) folgen."); + System.out.println("Unmittelbar nach \"(\" darf kein Operator oder \")\" folgen."); return false; } case '(' -> { tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe))); klammern++; } + case '.' -> { + System.out.println("Nach \"(\" darf kein \".\" stehen."); + return false; + } default -> { - System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); + System.out.println("Der Buchstabe \"" + buchstabe + "\" ist nicht in der Sprache vorhanden."); return false; } } break; case 7: + //Zustand nach eingabe einer ")". Erlaubte Buchstaben:"0..9","+-*/",")" switch (buchstabe) { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '(' -> { - System.out.println("Nach ) muss ein Operator folgen"); + System.out.println("Nach \")\" muss ein Operator folgen"); return false; } case '+', '-', '*', '/' -> { @@ -265,15 +278,19 @@ public class Rechenmaschine { tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe))); klammern--; } + case '.' -> { + System.out.println("Nach \")\" darf kein \".\" stehen."); + return false; + } default -> { - System.out.println("Der Buchstabe " + buchstabe + " ist nicht in der Sprache vorhanden."); + System.out.println("Der Buchstabe \"" + buchstabe + "\" ist nicht in der Sprache vorhanden."); return false; } } break; } } - + //Prüft auf Endzustand if (state == 5) { fehler = "Fehler im Wort " + pEingabe + ":\nDas Wort darf nicht mit einem Operator enden!"; return false; @@ -288,11 +305,9 @@ public class Rechenmaschine { return false; } else { tokenlist.toLast(); - + //stellt sicher, dass letztes Token in der Liste landet if (tokenlist.hasAccess()) { - if (!tokenlist.getContent().getToken().equals(")")) { - tokenlist.append(new Token("OPERAND", currentToken.toString())); - } + if (!tokenlist.getContent().getToken().equals(")")) tokenlist.append(new Token("OPERAND", currentToken.toString())); } else { tokenlist.append(new Token("OPERAND", currentToken.toString())); } @@ -326,8 +341,6 @@ public class Rechenmaschine { fehler = "Unbekanntes Token: " + currentToken.getType(); return false; } - - case 1: if (currentToken.getType().equals("OPERATOR")) { state = 0; @@ -336,7 +349,7 @@ public class Rechenmaschine { fehler = "Auf einen Operanden darf kein Operand folgen!"; return false; } else if (currentToken.getToken().equals("(")) { - fehler = "Auf einen Operanden kann kein ( folgen"; + fehler = "Auf einen Operanden kann kein \"(\" folgen"; return false; } else if (currentToken.getToken().equals(")")) { state = 1; @@ -366,9 +379,12 @@ public class Rechenmaschine { tokenlist.next(); } - + //Endzustände werden geprüft if (state == 0) { - fehler = "Ein Rechenterm darf nicht auf einen Operator enden!"; + fehler = "Ein Rechenterm darf nicht auf einem Operator enden!"; + return false; + } else if (state == 3) { + fehler = "Ein Rechenterm darf nicht auf eine Klammer auf enden!"; return false; } else { return true; @@ -391,19 +407,23 @@ public class Rechenmaschine { } private void punktVorStrich(List pList) { + //Liste wird durchlaufen pList.toFirst(); while (pList.hasAccess()) { + //wenn auf * Operator getroffen wird, wird dieser entfernt und somit ist der nächste Operand current. + //dieser wird als faktor1 gespeichert. if (pList.getContent().getToken().equals("*")) { pList.remove(); Double faktor1 = Double.parseDouble(pList.getContent().getToken()); - + //anschließend der zweite Faktor mit getPrevious() gespeichert, welches in List.class public gemacht wurde. pList.current = pList.getPrevious(pList.current); Double faktor2 = Double.parseDouble(pList.getContent().getToken()); - + //vorderer Faktor wird entfernt pList.remove(); - + //current ist wieder der hintere Faktor und der Inhalt des Tokens wird auf das Ergebnis gesetzt pList.getContent().setToken(String.valueOf(faktor2 * faktor1)); } else if (pList.getContent().getToken().equals("/")) { + //Siehe logik oben pList.remove(); Double divisor = Double.parseDouble(pList.getContent().getToken()); @@ -503,16 +523,21 @@ public class Rechenmaschine { private double berechne(List pList) { double result1 = 0; + //punkt wird vor Strich gerechnet ;) punktVorStrich(pList); pList.toFirst(); - String previous = ""; + //Operator wird gespeichert, um zu wissen ob der Operand addiert oder Subtrahiert werden muss + String lastOperator = ""; + //pList wird durchlaufen while (pList.hasAccess()) { Token currentToken = pList.getContent(); + //wenn currentToken ein Operator ist, wird dieser in last Operator gespeichert if (currentToken.getType().equals("OPERATOR")) { - previous = currentToken.getToken(); + lastOperator = currentToken.getToken(); } + //ansonsten wird wenn currentToken ein Operand ist, wird dieser je nach lastOperator addier oder Subtrahiert if (currentToken.getType().equals("OPERAND")) { - switch (previous) { + switch (lastOperator) { case "+", "" -> result1 += Double.parseDouble(currentToken.getToken()); case "-" -> result1 -= Double.parseDouble(currentToken.getToken()); } diff --git a/package.bluej b/package.bluej index 662d066..90c95ca 100644 --- a/package.bluej +++ b/package.bluej @@ -1,14 +1,17 @@ #BlueJ package file -dependency1.from=Rechenmaschine -dependency1.to=List +dependency1.from=GUI +dependency1.to=Rechenmaschine dependency1.type=UsesDependency dependency2.from=Rechenmaschine -dependency2.to=Token +dependency2.to=List dependency2.type=UsesDependency -editor.fx.0.height=1056 -editor.fx.0.width=1936 -editor.fx.0.x=-8 -editor.fx.0.y=-8 +dependency3.from=Rechenmaschine +dependency3.to=Token +dependency3.type=UsesDependency +editor.fx.0.height=0 +editor.fx.0.width=0 +editor.fx.0.x=0 +editor.fx.0.y=0 objectbench.height=111 objectbench.width=1256 package.divider.horizontal=0.6 @@ -19,8 +22,8 @@ package.editor.x=100 package.editor.y=25 package.frame.height=875 package.frame.width=1296 -package.numDependencies=2 -package.numTargets=3 +package.numDependencies=3 +package.numTargets=4 package.showExtends=true package.showUses=true project.charset=UTF-8 @@ -29,24 +32,31 @@ readme.name=@README readme.width=49 readme.x=10 readme.y=10 -target1.height=50 -target1.name=List +target1.height=70 +target1.name=GUI target1.showInterface=false target1.type=ClassTarget -target1.width=150 -target1.x=430 -target1.y=160 +target1.width=120 +target1.x=160 +target1.y=10 target2.height=50 -target2.name=Token +target2.name=List target2.showInterface=false target2.type=ClassTarget -target2.width=80 -target2.x=70 -target2.y=70 +target2.width=150 +target2.x=430 +target2.y=160 target3.height=50 -target3.name=Rechenmaschine +target3.name=Token target3.showInterface=false target3.type=ClassTarget -target3.width=130 -target3.x=170 -target3.y=210 +target3.width=80 +target3.x=70 +target3.y=70 +target4.height=50 +target4.name=Rechenmaschine +target4.showInterface=false +target4.type=ClassTarget +target4.width=130 +target4.x=170 +target4.y=210