Untitled
unknown
plain_text
2 years ago
12 kB
5
Indexable
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayDeque; import java.util.Deque; import javax.swing.*; public class Calculator { public static void main(String[] args) { JFrame cw = new JFrame(); cw.setTitle("Calculator"); cw.setPreferredSize(new Dimension(600, 800)); cw.setVisible(true); cw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); cw.getContentPane().setBackground(Color.WHITE); Container C = cw.getContentPane(); C.setLayout(null); int counter = 1; JTextArea screen = new JTextArea("0"); screen.setBounds(20, 420 - 210, 400, 160); screen.setBackground(Color.YELLOW); screen.setFont(new Font("Arial", Font.BOLD, 22)); screen.setBorder(BorderFactory.createLineBorder(Color.BLACK)); screen.setLineWrap(true); screen.setWrapStyleWord(false); screen.setOpaque(true); screen.setEditable(false); screen.setHighlighter(null); screen.setAlignmentX(JTextArea.LEFT_ALIGNMENT); screen.setAlignmentY(JTextArea.BOTTOM_ALIGNMENT); cw.add(screen); CalculatorButton zeroButton = new CalculatorButton(20, 700, 100, 70, "0", Color.YELLOW); cw.add(zeroButton.myButton); CalculatorButton periodButton = new CalculatorButton(120, 700, 100, 70, ".", Color.YELLOW); cw.add(periodButton.myButton); CalculatorButton equalsButton = new CalculatorButton(220, 700, 100, 70, "=", Color.YELLOW); cw.add(equalsButton.myButton); CalculatorButton plusButton = new CalculatorButton(320, 700, 100, 70, "+", Color.YELLOW); cw.add(plusButton.myButton); CalculatorButton minusButton = new CalculatorButton(320, 630, 100, 70, "-", Color.YELLOW); cw.add(minusButton.myButton); CalculatorButton multiplyButton = new CalculatorButton(320, 560, 100, 70, "*", Color.YELLOW); cw.add(multiplyButton.myButton); CalculatorButton divideButton = new CalculatorButton(320, 490, 100, 70, "/", Color.YELLOW); cw.add(divideButton.myButton); CalculatorButton clearButton = new CalculatorButton(320, 420, 100, 70, "CE", Color.YELLOW); cw.add(clearButton.myButton); CalculatorButton powerButton = new CalculatorButton(220, 420, 100, 70, "x^y", Color.YELLOW); cw.add(powerButton.myButton); CalculatorButton RparenthesisButton = new CalculatorButton(120, 420, 100, 70, ")", Color.YELLOW); cw.add(RparenthesisButton.myButton); CalculatorButton LparenthesisButton = new CalculatorButton(20, 420, 100, 70, "(", Color.YELLOW); cw.add(LparenthesisButton.myButton); for (int row = 1; row <= 3; row++) { for (int column = 0; column < 3; column++) { CalculatorButton numberButton = new CalculatorButton(20 + (100 * column), 700 - (70 * row), 100, 70, counter + "", Color.YELLOW); cw.add(numberButton.myButton); final Integer innercounter = new Integer(counter); numberButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if ((screen.getText().substring(screen.getText().length() - 1).equals("0")) && screen.getText().length() == 1) screen.setText(""); screen.setText(screen.getText() + innercounter); } }); counter++; } } LparenthesisButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if ((screen.getText().substring(screen.getText().length() - 1).equals("0")) && screen.getText().length() == 1) screen.setText(""); screen.setText(screen.getText() + "("); } }); RparenthesisButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if ((screen.getText().substring(screen.getText().length() - 1).equals("0")) && screen.getText().length() == 1) screen.setText(""); screen.setText(screen.getText() + ")"); } }); powerButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if(isNumber(screen.getText().substring(screen.getText().length() - 1)) || screen.getText().substring(screen.getText().length() - 1).equals(")")) screen.setText(screen.getText() + "^"); } }); periodButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (isNumber(screen.getText().substring(screen.getText().length() - 1))) screen.setText(screen.getText() + "."); } }); zeroButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if ((screen.getText().substring(screen.getText().length() - 1).equals("0")) && screen.getText().length() == 1) return; screen.setText(screen.getText() + "0"); } }); plusButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (isNumber(screen.getText().substring(screen.getText().length() - 1)) || screen.getText().substring(screen.getText().length() - 1).equals(")")) screen.setText(screen.getText() + "+"); } }); minusButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (isNumber(screen.getText().substring(screen.getText().length() - 1)) || screen.getText().substring(screen.getText().length() - 1).equals(")")) screen.setText(screen.getText() + "-"); } }); multiplyButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (isNumber(screen.getText().substring(screen.getText().length() - 1)) || screen.getText().substring(screen.getText().length() - 1).equals(")")) screen.setText(screen.getText() + "*"); } }); divideButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { if (isNumber(screen.getText().substring(screen.getText().length() - 1)) || screen.getText().substring(screen.getText().length() - 1).equals(")")) screen.setText(screen.getText() + "/"); } }); clearButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { screen.setText("0"); } }); equalsButton.myButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { screen.setText("" + evaluate(screen.getText())); } }); System.out.println(evaluate("3^2")); cw.pack(); cw.setVisible(true); cw.validate(); } public static boolean isNumber(String str) { try { Double.parseDouble(str); return true; } catch (NumberFormatException e) { return false; } } public static double evaluate(String expression) { Deque<Double> operands = new ArrayDeque<>(); Deque<Character> operators = new ArrayDeque<>(); for (int i = 0; i < expression.length(); i++) { char c = expression.charAt(i); if (Character.isDigit(c)) { // Parse the number and push it to the operand stack int j = i; while (j < expression.length() && (Character.isDigit(expression.charAt(j)) || expression.charAt(j) == '.')) { j++; } double num = Double.parseDouble(expression.substring(i, j)); operands.push(num); i = j - 1; } else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '^' || c == '(') { // Push the operator to the operator stack operators.push(c); } else if (c == ')') { // Pop operators and operands until we reach the matching '(' while (!operators.isEmpty() && operators.peek() != '(') { char op = operators.pop(); double b = operands.pop(); double a = operands.pop(); double result = applyOperator( a, b, op); operands.push(result); } if (!operators.isEmpty() && operators.peek() == '(') { operators.pop(); // Discard the '(' } } else if (c == ' ') { // Ignore whitespace } else { throw new IllegalArgumentException("Invalid operator: " + c); } // Check if we need to perform multiplication if (i < expression.length() - 1 && (c == ')' || Character.isDigit(c)) && (expression.charAt(i + 1) == '(' || expression.charAt(i + 1) == '.' || Character.isDigit(expression.charAt(i + 1)))) { // We need to perform multiplication, so push a '*' operator to the operator stack operators.push('*'); } } // Perform any remaining operations while (!operators.isEmpty()) { char op = operators.pop(); double b = operands.pop(); double a = operands.pop(); double result = applyOperator( a, b, op); operands.push(result); } return operands.pop(); } public static boolean hasPrecedence(char op1, char op2) { if (op2 == '(' || op2 == ')') { return false; } if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) { return false; } if (op1 == '^' && (op2 == '*' || op2 == '/' || op2 == '+' || op2 == '-')) { return false; } return true; } public static double applyOperator(double a, double b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if (b == 0) { throw new ArithmeticException("Division by zero"); } return a / b; case '^': return Math.pow(a, b); } return 0; } }
Editor is loading...