From 320a48bfea520c49205d408fdeb26905429d33ab Mon Sep 17 00:00:00 2001 From: "artem.didytschuk" Date: Mon, 19 Apr 2021 15:09:32 +0200 Subject: [PATCH] GUI fertig --- GUI.form | 45 ++++++++++ GUI.java | 36 ++++++++ Rechenmaschine.java | 212 +++++++++++++++++++++----------------------- 3 files changed, 184 insertions(+), 109 deletions(-) create mode 100644 GUI.form create mode 100644 GUI.java diff --git a/GUI.form b/GUI.form new file mode 100644 index 0000000..9f0969c --- /dev/null +++ b/GUI.form @@ -0,0 +1,45 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/GUI.java b/GUI.java new file mode 100644 index 0000000..b278843 --- /dev/null +++ b/GUI.java @@ -0,0 +1,36 @@ +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class GUI extends JFrame { + private JPanel panelMain; + private JTextField textFieldRechenterm; + private JLabel labelGibRechentermEin; + private JButton buttonBerechnen; + private JLabel labelErgebnis; + + public GUI(String title){ + super(title); + + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setContentPane(panelMain); + this.pack(); + buttonBerechnen.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //TODO: Text vom Text field zu Eingabe übergeben + Rechenmaschine rechner = new Rechenmaschine(textFieldRechenterm.getText()); + labelErgebnis.setText("Das Ergebnis ist: "+rechner.getResult()); + } + }); + } + + public static void main(String[] args) { + JFrame frame = new GUI("Rechenterme"); + frame.setVisible(true); + } + + private void createUIComponents() { + // TODO: place custom component creation code here + } +} diff --git a/Rechenmaschine.java b/Rechenmaschine.java index 4488450..6e9a4f4 100644 --- a/Rechenmaschine.java +++ b/Rechenmaschine.java @@ -5,39 +5,30 @@ import java.text.DecimalFormat; */ public class Rechenmaschine { - public static void main(String[] args) { - new Rechenmaschine(); - } - private List tokenlist; private String fehler; - private double result; + private String result; private int klammern; - public Rechenmaschine() { + public Rechenmaschine(String eingabe) { tokenlist = new List<>(); - Scanner input = new Scanner(System.in); - System.out.println("Gib einen Term ein und bestätige mit ENTER: "); - String eingabe = input.nextLine(); - input.close(); - - if( !scanne(eingabe) ) { + if (!scanne(eingabe)) { System.out.println("Fehler bei der lexikalischen Analyse:"); System.out.println(fehler); return; } - if( !parse() ) { + if (!parse()) { System.out.println("Fehler bei der syntaktischen Analyse:"); System.out.println(fehler); return; } - if( !analyse() ) { + if (!analyse()) { System.out.println("Fehler bei der semantischen Analyse:"); System.out.println(fehler); return; @@ -47,13 +38,14 @@ public class Rechenmaschine { } - public boolean scanne( String pEingabe ) { + + public boolean scanne(String pEingabe) { char[] eingabe = pEingabe.toCharArray(); klammern = 0; int state = 0; StringBuilder currentToken = new StringBuilder(); - for(char buchstabe: eingabe){ - switch(state){ + for (char buchstabe : eingabe) { + switch (state) { case 0: switch (buchstabe) { case '0' -> { @@ -73,7 +65,7 @@ public class Rechenmaschine { return false; } case '(' -> { - tokenlist.append(new Token("PARANTHESES",Character.toString(buchstabe))); + tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe))); state = 6; klammern++; } @@ -89,7 +81,7 @@ public class Rechenmaschine { break; case 1: 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."); return false; } @@ -104,9 +96,9 @@ public class Rechenmaschine { state = 5; } case ')' -> { - tokenlist.append(new Token("OPERAND",currentToken.toString())); + tokenlist.append(new Token("OPERAND", currentToken.toString())); currentToken = new StringBuilder(); - tokenlist.append(new Token("PARANTHESES",")")); + tokenlist.append(new Token("PARANTHESES", ")")); state = 7; klammern--; } @@ -137,9 +129,9 @@ public class Rechenmaschine { state = 5; } case ')' -> { - tokenlist.append(new Token("OPERAND",currentToken.toString())); + tokenlist.append(new Token("OPERAND", currentToken.toString())); currentToken = new StringBuilder(); - tokenlist.append(new Token("PARANTHESES",")")); + tokenlist.append(new Token("PARANTHESES", ")")); state = 7; klammern--; } @@ -182,9 +174,9 @@ public class Rechenmaschine { return false; } case ')' -> { - tokenlist.append(new Token("OPERAND",currentToken.toString())); + tokenlist.append(new Token("OPERAND", currentToken.toString())); currentToken = new StringBuilder(); - tokenlist.append(new Token("PARANTHESES",Character.toString(buchstabe))); + tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe))); state = 7; klammern--; } @@ -217,7 +209,7 @@ public class Rechenmaschine { return false; } case '(' -> { - tokenlist.append(new Token("PARANTHESES","(")); + tokenlist.append(new Token("PARANTHESES", "(")); state = 6; klammern++; } @@ -232,7 +224,7 @@ public class Rechenmaschine { } break; case 6: - switch(buchstabe) { + switch (buchstabe) { case '0' -> { currentToken.append(buchstabe); state = 1; @@ -242,7 +234,7 @@ public class Rechenmaschine { state = 2; } case '+', '-' -> { - tokenlist.append(new Token("OPERATOR",Character.toString(buchstabe))); + tokenlist.append(new Token("OPERATOR", Character.toString(buchstabe))); state = 5; } case '*', '/' -> { @@ -250,7 +242,7 @@ public class Rechenmaschine { return false; } case '(' -> { - tokenlist.append(new Token("PARANTHESES",Character.toString(buchstabe))); + tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe))); klammern++; } default -> { @@ -260,17 +252,17 @@ public class Rechenmaschine { } break; case 7: - switch(buchstabe) { + switch (buchstabe) { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '(' -> { System.out.println("Nach ) muss ein Operator folgen"); return false; } case '+', '-', '*', '/' -> { - tokenlist.append(new Token("OPERATOR",Character.toString(buchstabe))); + tokenlist.append(new Token("OPERATOR", Character.toString(buchstabe))); state = 5; } case ')' -> { - tokenlist.append(new Token("PARANTHESES",Character.toString(buchstabe))); + tokenlist.append(new Token("PARANTHESES", Character.toString(buchstabe))); klammern--; } default -> { @@ -282,17 +274,17 @@ public class Rechenmaschine { } } - if( state == 5 ) { - fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit einem Operator enden!"; + if (state == 5) { + fehler = "Fehler im Wort " + pEingabe + ":\nDas Wort darf nicht mit einem Operator enden!"; return false; - } else if (state == 3){ - fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit einem . enden!"; + } else if (state == 3) { + fehler = "Fehler im Wort " + pEingabe + ":\nDas Wort darf nicht mit einem . enden!"; return false; - } else if (state ==6){ - fehler = "Fehler im Wort " +pEingabe+ ":\nDas Wort darf nicht mit ( enden!"; + } else if (state == 6) { + fehler = "Fehler im Wort " + pEingabe + ":\nDas Wort darf nicht mit ( enden!"; return false; - } else if (klammern !=0){ - fehler = "Fehler im Wort " +pEingabe+ ":\nIm wort müssen alle Klammern geschlossen sein!"; + } else if (klammern != 0) { + fehler = "Fehler im Wort " + pEingabe + ":\nIm wort müssen alle Klammern geschlossen sein!"; return false; } else { tokenlist.toLast(); @@ -313,62 +305,61 @@ public class Rechenmaschine { int state = 0; tokenlist.toFirst(); - while( tokenlist.hasAccess() ) { + while (tokenlist.hasAccess()) { Token currentToken = tokenlist.getContent(); - switch( state ) { + switch (state) { case 0: - if( currentToken.getType().equals("OPERATOR") ) { + if (currentToken.getType().equals("OPERATOR")) { fehler = "Rechenterm darf nicht mit einem Operator starten!"; return false; - } else if( currentToken.getType().equals("OPERAND") ) { + } else if (currentToken.getType().equals("OPERAND")) { state = 1; break; - } else if( currentToken.getToken().equals("(")){ + } else if (currentToken.getToken().equals("(")) { state = 2; break; - } else if( currentToken.getToken().equals(")")){ + } else if (currentToken.getToken().equals(")")) { state = 1; break; } else { - fehler = "Unbekanntes Token: "+currentToken.getType(); + fehler = "Unbekanntes Token: " + currentToken.getType(); return false; } - case 1: - if( currentToken.getType().equals("OPERATOR") ) { + if (currentToken.getType().equals("OPERATOR")) { state = 0; break; - } else if( currentToken.getType().equals("OPERAND") ) { + } else if (currentToken.getType().equals("OPERAND")) { fehler = "Auf einen Operanden darf kein Operand folgen!"; return false; - } else if( currentToken.getToken().equals("(") ) { + } else if (currentToken.getToken().equals("(")) { fehler = "Auf einen Operanden kann kein ( folgen"; return false; - } else if( currentToken.getToken().equals(")")) { + } else if (currentToken.getToken().equals(")")) { state = 1; break; } else { - fehler = "Unbekanntes Token: "+currentToken.getType(); + fehler = "Unbekanntes Token: " + currentToken.getType(); return false; } case 2: - if( currentToken.getType().equals("OPERATOR") ) { + if (currentToken.getType().equals("OPERATOR")) { state = 0; break; - } else if( currentToken.getType().equals("OPERAND") ) { + } else if (currentToken.getType().equals("OPERAND")) { state = 1; break; - } else if( currentToken.getToken().equals("(")){ + } else if (currentToken.getToken().equals("(")) { state = 2; break; - } else if( currentToken.getToken().equals(")")){ + } else if (currentToken.getToken().equals(")")) { state = 1; break; } else { - fehler = "Unbekanntes Token: "+currentToken.getType(); + fehler = "Unbekanntes Token: " + currentToken.getType(); return false; } } @@ -376,7 +367,7 @@ public class Rechenmaschine { tokenlist.next(); } - if( state == 0 ) { + if (state == 0) { fehler = "Ein Rechenterm darf nicht auf einen Operator enden!"; return false; } else { @@ -386,10 +377,10 @@ public class Rechenmaschine { public boolean analyse() { tokenlist.toFirst(); - while(tokenlist.hasAccess()){ - if(tokenlist.getContent().getToken().equals("/")){ + while (tokenlist.hasAccess()) { + if (tokenlist.getContent().getToken().equals("/")) { tokenlist.next(); - if(tokenlist.getContent().getToken().equals("0")){ + if (tokenlist.getContent().getToken().equals("0")) { fehler = "Es kann nicht durch 0 geteilt werden."; return false; } @@ -399,45 +390,45 @@ public class Rechenmaschine { return true; } - private void punktVorStrich(ListpList){ + private void punktVorStrich(List pList) { pList.toFirst(); - while(pList.hasAccess()){ - if(pList.getContent().getToken().equals("*")){ + while (pList.hasAccess()) { + if (pList.getContent().getToken().equals("*")) { pList.remove(); Double faktor1 = Double.parseDouble(pList.getContent().getToken()); - pList.current=pList.getPrevious(pList.current); + pList.current = pList.getPrevious(pList.current); Double faktor2 = Double.parseDouble(pList.getContent().getToken()); pList.remove(); - pList.getContent().setToken(String.valueOf(faktor2*faktor1)); - } else if(pList.getContent().getToken().equals("/")){ + pList.getContent().setToken(String.valueOf(faktor2 * faktor1)); + } else if (pList.getContent().getToken().equals("/")) { pList.remove(); Double divisor = Double.parseDouble(pList.getContent().getToken()); //Previous Token muss gelöscht werden, tokenlist.getContent != null ist, // wenn der 2. Token am ende des Termes ist. - pList.current=pList.getPrevious(pList.current); + pList.current = pList.getPrevious(pList.current); Double dividend = Double.parseDouble(pList.getContent().getToken()); pList.remove(); - pList.getContent().setToken(String.valueOf(dividend/divisor)); + pList.getContent().setToken(String.valueOf(dividend / divisor)); } pList.next(); } } - private void klammerRegel(ListpList){ - List newTokenlist= new List(); + private void klammerRegel(List pList) { + List newTokenlist = new List(); pList.toFirst(); double berechnet; //Durchlaufe die Tokenliste - while(pList.hasAccess()){ + while (pList.hasAccess()) { // Token gleich ( dann entferne ihn - if(pList.getContent().getToken().equals("(")) { + if (pList.getContent().getToken().equals("(")) { pList.remove(); //anschließend durchlaufe solange, bis auf ) gestoßen wird while (!pList.getContent().getToken().equals(")")) { @@ -475,52 +466,52 @@ public class Rechenmaschine { pList.next(); } } - private double mehrereKlammern(ListpList){ - List newTokenlist= new List(); - double berechnet=0; - //wenn current ( ist - if(pList.getContent().getToken().equals("(")){ - //wird es entfernt - pList.remove(); - //anschließend wird die übergebene tokenliste solange durchlaufen, bis ) auftritt - while(!pList.getContent().getToken().equals(")")){ + + private double mehrereKlammern(List pList) { + List newTokenlist = new List(); + double berechnet = 0; + //wenn current ( ist + if (pList.getContent().getToken().equals("(")) { + //wird es entfernt + pList.remove(); + //anschließend wird die übergebene tokenliste solange durchlaufen, bis ) auftritt + while (!pList.getContent().getToken().equals(")")) { - - if(pList.hasAccess()) { - //wenn current ( ist dann wird diese methode nochmal ab current ausgeführt und anschließend - // das ergebnis in newTokenlist eingefügt - if (pList.getContent().getToken().equals("(") ) { - berechnet = mehrereKlammern(pList); - newTokenlist.append(new Token("OPERAND",String.valueOf(berechnet))); - } - // wenn current nich ) ist, dann wird es in newTokenlist gespeichert und aus der tokenliste entfernt - if (!pList.getContent().getToken().equals(")")) { - newTokenlist.append(pList.getContent()); - pList.remove(); - } + if (pList.hasAccess()) { + //wenn current ( ist dann wird diese methode nochmal ab current ausgeführt und anschließend + // das ergebnis in newTokenlist eingefügt + if (pList.getContent().getToken().equals("(")) { + berechnet = mehrereKlammern(pList); + newTokenlist.append(new Token("OPERAND", String.valueOf(berechnet))); + } + // wenn current nich ) ist, dann wird es in newTokenlist gespeichert und aus der tokenliste entfernt + if (!pList.getContent().getToken().equals(")")) { + newTokenlist.append(pList.getContent()); + pList.remove(); } } - //wenn ) auftritt dann wird es entfernt und anschließend wird die berechnung von newTokenlist rückgegeben. - pList.remove(); - berechnet = berechne(newTokenlist); } + //wenn ) auftritt dann wird es entfernt und anschließend wird die berechnung von newTokenlist rückgegeben. + pList.remove(); + berechnet = berechne(newTokenlist); + } return berechnet; } - private double berechne(List pList){ + private double berechne(List pList) { double result1 = 0; punktVorStrich(pList); pList.toFirst(); - String previous=""; - while( pList.hasAccess() ) { + String previous = ""; + while (pList.hasAccess()) { Token currentToken = pList.getContent(); - if(currentToken.getType().equals("OPERATOR")){ - previous=currentToken.getToken(); + if (currentToken.getType().equals("OPERATOR")) { + previous = currentToken.getToken(); } - if( currentToken.getType().equals("OPERAND") ) { + if (currentToken.getType().equals("OPERAND")) { switch (previous) { case "+", "" -> result1 += Double.parseDouble(currentToken.getToken()); case "-" -> result1 -= Double.parseDouble(currentToken.getToken()); @@ -534,10 +525,13 @@ public class Rechenmaschine { public void run() { klammerRegel(tokenlist); punktVorStrich(tokenlist); - double result=berechne(tokenlist); + double result = berechne(tokenlist); DecimalFormat format = new DecimalFormat("#,##0.####"); - String resultString=format.format(result); - System.out.println("Ergebnis der Ausführung: " + resultString); + String resultString = format.format(result); + this.result= resultString; } -} + public String getResult() { + return result; + } +} \ No newline at end of file