import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class P9 extends JFrame { private JTextField displayField; public P9() { setTitle("Scientific Calculator"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setResizable(true); displayField = new JTextField(); displayField.setPreferredSize(new Dimension(300, 30)); displayField.setEditable(false); JPanel buttonPanel = new JPanel(new GridLayout(6, 4, 10, 10)); String[] buttonLabels = { "7", "8", "9", "/", "4", "5", "6", "*", "1", "2", "3", "-", "0", ".", "=", "+", "sin", "cos", "tan", "sqrt", "e", "^", "pi", "clr" }; for (String label : buttonLabels) { JButton button = new JButton(label); button.addActionListener(new ButtonClickListener()); buttonPanel.add(button); } setLayout(new FlowLayout()); add(displayField); add(buttonPanel); pack(); setLocationRelativeTo(null); setVisible(true); } private class ButtonClickListener implements ActionListener { public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); String expression = displayField.getText(); if ("=".equals(command)) { calculate(); } else if ("clr".equals(command)) { displayField.setText(""); } else if ("sin".equals(command)) { displayField.setText(String.valueOf(Math.sin(Double.parseDouble(expression)))); } else if ("cos".equals(command)) { displayField.setText(String.valueOf(Math.cos(Double.parseDouble(expression)))); } else if ("tan".equals(command)) { displayField.setText(String.valueOf(Math.tan(Double.parseDouble(expression)))); } else if ("sqrt".equals(command)) { displayField.setText(String.valueOf(Math.sqrt(Double.parseDouble(expression)))); } else { displayField.setText(displayField.getText() + command); } } private void calculate() { String expression = displayField.getText(); try { double result = evaluateExpression(expression); displayField.setText(String.valueOf(result)); } catch (NumberFormatException e) { displayField.setText("Error"); } } private double evaluateExpression(String expression) { return new Object() { int pos = -1, ch; void nextChar() { ch = (++pos < expression.length()) ? expression.charAt(pos) : -1; } boolean eat(int charToEat) { while (ch == ' ') nextChar(); if (ch == charToEat) { nextChar(); return true; } return false; } double parse() { nextChar(); double x = parseExpression(); if (pos < expression.length()) throw new RuntimeException("Unexpected character: " + (char) ch); return x; } double parseExpression() { double x = parseTerm(); while(true) { if (eat('+')) x += parseTerm(); else if (eat('-')) x -= parseTerm(); else return x; } } double parseTerm() { double x = parseFactor(); while (true) { if (eat('*')) x *= parseFactor(); else if (eat('/')) x /= parseFactor(); else return x; } } double parseFactor() { if (eat('+')) return parseFactor(); if (eat('-')) return -parseFactor(); double x; int startPos = this.pos; if (eat('(')) { x = parseExpression(); eat(')'); } else if ((ch >= '0' && ch <= '9') || ch == '.') { while ((ch >= '0' && ch <= '9') || ch == '.') nextChar(); x = Double.parseDouble(expression.substring(startPos, this.pos)); } else if (eat('e')) { x = Math.E; } else if (eat('p')) { eat('i'); x = Math.PI; } else { throw new RuntimeException("Unexpected character: " + (char) ch); } if (eat('^')) x = Math.pow(x, parseFactor()); return x; } }.parse(); } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { new P9(); } }); } }