forked from IF-LK-2020/rechenmaschine
Code auskommentiert
This commit is contained in:
parent
70ddae16be
commit
5622aa2f92
1
GUI.java
1
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) {
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue