Code auskommentiert

This commit is contained in:
Artem Didytschuk 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() {
@Override
public void actionPerformed(ActionEvent e) {
//TODO: Text vom Text field zu Eingabe übergeben
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException classNotFoundException) {

View File

@ -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<Token> 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<Token> 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());
}

View File

@ -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