154
P9.java
Normal file
154
P9.java
Normal file
@@ -0,0 +1,154 @@
|
||||
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();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user