Code auskommentiert

This commit is contained in:
2021-04-19 20:06:15 +02:00
parent 70ddae16be
commit 5622aa2f92
3 changed files with 94 additions and 60 deletions

View File

@@ -18,7 +18,6 @@ public class GUI extends JFrame {
buttonBerechnen.addActionListener(new ActionListener() { buttonBerechnen.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
//TODO: Text vom Text field zu Eingabe übergeben
try { try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException classNotFoundException) { } catch (ClassNotFoundException classNotFoundException) {

View File

@@ -41,11 +41,13 @@ public class Rechenmaschine {
public boolean scanne(String pEingabe) { public boolean scanne(String pEingabe) {
char[] eingabe = pEingabe.toCharArray(); char[] eingabe = pEingabe.toCharArray();
//Klammercounter, Endzustand wird nur akzeptiert, wenn dieser 0 ist, ähnlich wie bei einem Kellerautomaten
klammern = 0; klammern = 0;
int state = 0; int state = 0;
StringBuilder currentToken = new StringBuilder(); StringBuilder currentToken = new StringBuilder();
for (char buchstabe : eingabe) { for (char buchstabe : eingabe) {
switch (state) { switch (state) {
//Anfangszustand, Erlaubte Buchstaben: "0..9",".","("
case 0: case 0:
switch (buchstabe) { switch (buchstabe) {
case '0' -> { case '0' -> {
@@ -57,11 +59,11 @@ public class Rechenmaschine {
state = 2; state = 2;
} }
case '.' -> { case '.' -> {
System.out.println("Am anfang des Termes kann kein . stehen."); System.out.println("Am anfang des Termes kann kein \".\" stehen.");
return false; return false;
} }
case '+', '-', '*', '/' -> { 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; return false;
} }
case '(' -> { case '(' -> {
@@ -70,19 +72,20 @@ public class Rechenmaschine {
klammern++; klammern++;
} }
case ')' -> { case ')' -> {
System.out.println("Der Term darf nicht mit ) beginnen"); System.out.println("Der Term darf nicht mit \")\" beginnen");
return false; return false;
} }
default -> { 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; return false;
} }
} }
break; break;
case 1: case 1:
//Zustand nach eingabe einer 0. Erlaube Buchstaben: ".","+-*/",")"
switch (buchstabe) { switch (buchstabe) {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> { 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; return false;
} }
case '.' -> { case '.' -> {
@@ -103,16 +106,17 @@ public class Rechenmaschine {
klammern--; klammern--;
} }
case '(' -> { 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; return false;
} }
default -> { 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; return false;
} }
} }
break; break;
case 2: case 2:
//Zustand nach eingabe einer "Zahl != 0" Erlaube Buchstaben: "0..9",".","+-*/",")"
switch (buchstabe) { switch (buchstabe) {
case '.' -> { case '.' -> {
currentToken.append(buchstabe); currentToken.append(buchstabe);
@@ -136,28 +140,30 @@ public class Rechenmaschine {
klammern--; klammern--;
} }
case '(' -> { 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; return false;
} }
default -> { 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; return false;
} }
} }
break; break;
case 3: case 3:
//Zustand unmittelbar nach Eingabe eines ".". Erlaubte Buchstaben: "0..9"
switch (buchstabe) { switch (buchstabe) {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
currentToken.append(buchstabe); currentToken.append(buchstabe);
state = 4; state = 4;
} }
case '+', '-', '*', '/', '(', ')' -> { case '+', '-', '*', '/', '(', ')', '.' -> {
System.out.println("Nach einem . darf kein Rechenoperator, oder eine Klammer folgen"); System.out.println("Nach einem \".\" darf kein weiterer \".\", Rechenoperator, oder Klammer folgen");
return false; return false;
} }
} }
break; break;
case 4: case 4:
//Zustand nachdem eine Zahl nach einem "." erfasst wurde. Erlaubte Buchstaben: "0..9","+-*/",")"
switch (buchstabe) { switch (buchstabe) {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' -> {
currentToken.append(buchstabe); currentToken.append(buchstabe);
@@ -170,7 +176,7 @@ public class Rechenmaschine {
state = 5; state = 5;
} }
case '.' -> { case '.' -> {
System.out.println("Eine Dezimalzahl kann nur ein . haben."); System.out.println("Eine Dezimalzahl kann nur ein \".\" haben.");
return false; return false;
} }
case ')' -> { case ')' -> {
@@ -181,16 +187,17 @@ public class Rechenmaschine {
klammern--; klammern--;
} }
case '(' -> { 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; return false;
} }
default -> { 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; return false;
} }
} }
break; break;
case 5: case 5:
//Zustand nach einem Operator. Erlaube Buchstaben: "0..9","("
switch (buchstabe) { switch (buchstabe) {
case '0' -> { case '0' -> {
currentToken.append(buchstabe); currentToken.append(buchstabe);
@@ -201,7 +208,7 @@ public class Rechenmaschine {
state = 2; state = 2;
} }
case '.' -> { case '.' -> {
System.out.println("Nach einem Operator kann kein . stehen."); System.out.println("Nach einem Operator kann kein \".\" stehen.");
return false; return false;
} }
case '+', '-', '*', '/' -> { case '+', '-', '*', '/' -> {
@@ -214,15 +221,16 @@ public class Rechenmaschine {
klammern++; klammern++;
} }
case ')' -> { case ')' -> {
System.out.println("Nach einem Operator darf kein ) folgen."); System.out.println("Nach einem Operator darf kein \")\" folgen.");
return false; return false;
} }
default -> { 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; return false;
} }
} }
break; break;
//Zustand nach Eingabe einer "(". Erlaube Buchstaben:"0..9","+-","("
case 6: case 6:
switch (buchstabe) { switch (buchstabe) {
case '0' -> { case '0' -> {
@@ -238,23 +246,28 @@ public class Rechenmaschine {
state = 5; state = 5;
} }
case '*', '/' -> { case '*', '/' -> {
System.out.println("Unmittelbar nach ( darf kein Operator oder ) folgen."); System.out.println("Unmittelbar nach \"(\" darf kein Operator oder \")\" folgen.");
return false; return false;
} }
case '(' -> { case '(' -> {
tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe))); tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe)));
klammern++; klammern++;
} }
case '.' -> {
System.out.println("Nach \"(\" darf kein \".\" stehen.");
return false;
}
default -> { 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; return false;
} }
} }
break; break;
case 7: case 7:
//Zustand nach eingabe einer ")". Erlaubte Buchstaben:"0..9","+-*/",")"
switch (buchstabe) { switch (buchstabe) {
case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '(' -> { 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; return false;
} }
case '+', '-', '*', '/' -> { case '+', '-', '*', '/' -> {
@@ -265,15 +278,19 @@ public class Rechenmaschine {
tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe))); tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe)));
klammern--; klammern--;
} }
case '.' -> {
System.out.println("Nach \")\" darf kein \".\" stehen.");
return false;
}
default -> { 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; return false;
} }
} }
break; break;
} }
} }
//Prüft auf Endzustand
if (state == 5) { if (state == 5) {
fehler = "Fehler im Wort " + pEingabe + ":\nDas Wort darf nicht mit einem Operator enden!"; fehler = "Fehler im Wort " + pEingabe + ":\nDas Wort darf nicht mit einem Operator enden!";
return false; return false;
@@ -288,11 +305,9 @@ public class Rechenmaschine {
return false; return false;
} else { } else {
tokenlist.toLast(); tokenlist.toLast();
//stellt sicher, dass letztes Token in der Liste landet
if (tokenlist.hasAccess()) { if (tokenlist.hasAccess()) {
if (!tokenlist.getContent().getToken().equals(")")) { if (!tokenlist.getContent().getToken().equals(")")) tokenlist.append(new Token("OPERAND", currentToken.toString()));
tokenlist.append(new Token("OPERAND", currentToken.toString()));
}
} else { } else {
tokenlist.append(new Token("OPERAND", currentToken.toString())); tokenlist.append(new Token("OPERAND", currentToken.toString()));
} }
@@ -326,8 +341,6 @@ public class Rechenmaschine {
fehler = "Unbekanntes Token: " + currentToken.getType(); fehler = "Unbekanntes Token: " + currentToken.getType();
return false; return false;
} }
case 1: case 1:
if (currentToken.getType().equals("OPERATOR")) { if (currentToken.getType().equals("OPERATOR")) {
state = 0; state = 0;
@@ -336,7 +349,7 @@ public class Rechenmaschine {
fehler = "Auf einen Operanden darf kein Operand folgen!"; fehler = "Auf einen Operanden darf kein Operand folgen!";
return false; return false;
} else if (currentToken.getToken().equals("(")) { } else if (currentToken.getToken().equals("(")) {
fehler = "Auf einen Operanden kann kein ( folgen"; fehler = "Auf einen Operanden kann kein \"(\" folgen";
return false; return false;
} else if (currentToken.getToken().equals(")")) { } else if (currentToken.getToken().equals(")")) {
state = 1; state = 1;
@@ -366,9 +379,12 @@ public class Rechenmaschine {
tokenlist.next(); tokenlist.next();
} }
//Endzustände werden geprüft
if (state == 0) { 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; return false;
} else { } else {
return true; return true;
@@ -391,19 +407,23 @@ public class Rechenmaschine {
} }
private void punktVorStrich(List<Token> pList) { private void punktVorStrich(List<Token> pList) {
//Liste wird durchlaufen
pList.toFirst(); pList.toFirst();
while (pList.hasAccess()) { 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("*")) { if (pList.getContent().getToken().equals("*")) {
pList.remove(); pList.remove();
Double faktor1 = Double.parseDouble(pList.getContent().getToken()); 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); pList.current = pList.getPrevious(pList.current);
Double faktor2 = Double.parseDouble(pList.getContent().getToken()); Double faktor2 = Double.parseDouble(pList.getContent().getToken());
//vorderer Faktor wird entfernt
pList.remove(); 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)); pList.getContent().setToken(String.valueOf(faktor2 * faktor1));
} else if (pList.getContent().getToken().equals("/")) { } else if (pList.getContent().getToken().equals("/")) {
//Siehe logik oben
pList.remove(); pList.remove();
Double divisor = Double.parseDouble(pList.getContent().getToken()); Double divisor = Double.parseDouble(pList.getContent().getToken());
@@ -503,16 +523,21 @@ public class Rechenmaschine {
private double berechne(List<Token> pList) { private double berechne(List<Token> pList) {
double result1 = 0; double result1 = 0;
//punkt wird vor Strich gerechnet ;)
punktVorStrich(pList); punktVorStrich(pList);
pList.toFirst(); 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()) { while (pList.hasAccess()) {
Token currentToken = pList.getContent(); Token currentToken = pList.getContent();
//wenn currentToken ein Operator ist, wird dieser in last Operator gespeichert
if (currentToken.getType().equals("OPERATOR")) { 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")) { if (currentToken.getType().equals("OPERAND")) {
switch (previous) { switch (lastOperator) {
case "+", "" -> result1 += Double.parseDouble(currentToken.getToken()); case "+", "" -> result1 += Double.parseDouble(currentToken.getToken());
case "-" -> result1 -= Double.parseDouble(currentToken.getToken()); case "-" -> result1 -= Double.parseDouble(currentToken.getToken());
} }

View File

@@ -1,14 +1,17 @@
#BlueJ package file #BlueJ package file
dependency1.from=Rechenmaschine dependency1.from=GUI
dependency1.to=List dependency1.to=Rechenmaschine
dependency1.type=UsesDependency dependency1.type=UsesDependency
dependency2.from=Rechenmaschine dependency2.from=Rechenmaschine
dependency2.to=Token dependency2.to=List
dependency2.type=UsesDependency dependency2.type=UsesDependency
editor.fx.0.height=1056 dependency3.from=Rechenmaschine
editor.fx.0.width=1936 dependency3.to=Token
editor.fx.0.x=-8 dependency3.type=UsesDependency
editor.fx.0.y=-8 editor.fx.0.height=0
editor.fx.0.width=0
editor.fx.0.x=0
editor.fx.0.y=0
objectbench.height=111 objectbench.height=111
objectbench.width=1256 objectbench.width=1256
package.divider.horizontal=0.6 package.divider.horizontal=0.6
@@ -19,8 +22,8 @@ package.editor.x=100
package.editor.y=25 package.editor.y=25
package.frame.height=875 package.frame.height=875
package.frame.width=1296 package.frame.width=1296
package.numDependencies=2 package.numDependencies=3
package.numTargets=3 package.numTargets=4
package.showExtends=true package.showExtends=true
package.showUses=true package.showUses=true
project.charset=UTF-8 project.charset=UTF-8
@@ -29,24 +32,31 @@ readme.name=@README
readme.width=49 readme.width=49
readme.x=10 readme.x=10
readme.y=10 readme.y=10
target1.height=50 target1.height=70
target1.name=List target1.name=GUI
target1.showInterface=false target1.showInterface=false
target1.type=ClassTarget target1.type=ClassTarget
target1.width=150 target1.width=120
target1.x=430 target1.x=160
target1.y=160 target1.y=10
target2.height=50 target2.height=50
target2.name=Token target2.name=List
target2.showInterface=false target2.showInterface=false
target2.type=ClassTarget target2.type=ClassTarget
target2.width=80 target2.width=150
target2.x=70 target2.x=430
target2.y=70 target2.y=160
target3.height=50 target3.height=50
target3.name=Rechenmaschine target3.name=Token
target3.showInterface=false target3.showInterface=false
target3.type=ClassTarget target3.type=ClassTarget
target3.width=130 target3.width=80
target3.x=170 target3.x=70
target3.y=210 target3.y=70
target4.height=50
target4.name=Rechenmaschine
target4.showInterface=false
target4.type=ClassTarget
target4.width=130
target4.x=170
target4.y=210