Untitled
unknown
plain_text
3 years ago
12 kB
8
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...