Написал калькулятор на swing, не работает приоритет операций - Java
Формулировка задачи:
Вот код. Проблема в следующем: например 2+2*2 он считает как 8, а не 6. Не могу написать алгоритм, что бы он учитывал приоритет операций.
import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class mycalculator { JPanel WindowContent; JFormattedTextField displayFiled; JButton button[] = new JButton[10]; JButton buttonPoint; JButton buttonEqual; JButton buttonPlus; JButton buttonMinus; JButton buttonDel; JButton buttonUmnog; JButton buttonC; JButton buttonBackspase; JButton buttonPercent; JButton buttonQuert; JPanel p1; JPanel p2; mycalculator(){ WindowContent = new JPanel(); BorderLayout b1 = new BorderLayout(); WindowContent.setLayout(b1); displayFiled = new JFormattedTextField(); displayFiled.setHorizontalAlignment(SwingConstants.RIGHT); WindowContent.add("North",displayFiled); for (int i = 0; i <10 ; i++) { button[i] = new JButton(""+ i); } buttonPoint = new JButton("."); buttonEqual = new JButton("="); buttonPlus = new JButton("+"); buttonMinus = new JButton("-"); buttonDel = new JButton("/"); buttonUmnog = new JButton("*"); buttonC = new JButton("C"); buttonBackspase = new JButton("Backspase"); buttonPercent= new JButton("%"); buttonQuert= new JButton("$"); p1 = new JPanel(); GridLayout g1 = new GridLayout(4,3); p1.setLayout(g1); p2 = new JPanel(); GridLayout g2 = new GridLayout(4,2); p2.setLayout(g2); for (int i = 0; i <10 ; i++) { p1.add(button[i]); } p1.add(buttonPoint); p1.add(buttonEqual); WindowContent.add("Center", p1); p2.add(buttonC); p2.add(buttonBackspase); p2.add(buttonPercent); p2.add(buttonQuert); p2.add(buttonPlus); p2.add(buttonMinus); p2.add(buttonDel); p2.add(buttonUmnog); WindowContent.add("East", p2); JFrame frame = new JFrame("Calculator"); frame.setContentPane(WindowContent); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); frame.pack(); frame.setResizable(false); CalculatorEngine calcEngine = new CalculatorEngine(); for (int i = 0; i <10 ; i++) { button[i].addActionListener(calcEngine); } buttonPoint.addActionListener(calcEngine); buttonEqual.addActionListener(calcEngine); buttonPlus.addActionListener(calcEngine); buttonMinus.addActionListener(calcEngine); buttonDel.addActionListener(calcEngine); buttonUmnog.addActionListener(calcEngine); buttonC.addActionListener(calcEngine); buttonBackspase.addActionListener(calcEngine); buttonPercent.addActionListener(calcEngine); buttonQuert.addActionListener(calcEngine); } public class CalculatorEngine implements ActionListener { private double a, b, res; int flag = 0,count = 0, point = 0; public void actionPerformed(ActionEvent e){ String str; String s = displayFiled.getText(); for (int i = 0; i <10 ; i++) { if(e.getSource() == button[i]){ displayFiled.setText(displayFiled.getText() + i); } } if(e.getSource() == buttonPoint){ if((s.length() > 0)&&(point == 0)) { displayFiled.setText(displayFiled.getText() + "." ); point++; } else if(point == 0){ displayFiled.setText(displayFiled.getText() + 0 + "." ); point++; } } if(s.length() > 0) { if(e.getSource() == buttonPlus){ point = 0; flag = 1; if(count > 0){ b = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); a += b; } else{ a = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); count++; } } if(e.getSource() == buttonMinus){ point = 0; flag = 2; if(count > 0){ b = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); a -= b; } else{ a = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); count++; } } if(e.getSource() == buttonDel){ point = 0; flag = 3; if(count > 0){ b = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); a /= b; } else{ a = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); count++; } } if(e.getSource() == buttonUmnog){ point = 0; flag = 4; if(count > 0){ b = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); a *= b; } else{ a = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); count++; } } if(e.getSource() == buttonPercent){ point = 0; flag = 5; a = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); } if(e.getSource() == buttonQuert){ point = 0; a = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); displayFiled.setText(displayFiled.getText() + Math.sqrt(a)); } if(e.getSource() == buttonC){ point = 0; displayFiled.setText(""); } if(e.getSource() == buttonBackspase){ str = displayFiled.getText(); displayFiled.setText(""); displayFiled.setText(displayFiled.getText() + str.substring(0,str.length()- 1) ); } if(e.getSource() == buttonEqual){ point = 0; b = Double.valueOf(displayFiled.getText()); displayFiled.setText(""); switch(flag){ case 1: res = a + b; break; case 2: res = a - b; break; case 3: res = a / b; break; case 4: res = a * b; break; case 5: res = (a / 100) * b; break; default: System.out.println("Hui!"); } displayFiled.setText(displayFiled.getText() + res); a = 0; b = 0; count = 0; res = 0; } } } } public static void main (String[] args){ mycalculator cal = new mycalculator(); } }
Решение задачи: «Написал калькулятор на swing, не работает приоритет операций»
textual
Листинг программы
ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript"); String expression = "6*3+8/2-2.3"; try { float result = Float.valueOf(engine.eval(expression).toString()); System.out.println(result); } catch (ScriptException e) { e.printStackTrace(); } catch (NumberFormatException e) { e.printStatckTrace(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д