使用Java生成计算器 ,实现基本数学运算、函数等功能:加、减、乘、除、阶乘、正弦、余弦和指数的多则运算
时间: 2023-09-15 09:16:27 浏览: 67
好的,以下是一个基于JavaFX实现的计算器示例,支持加减乘除、阶乘、正弦、余弦和指数等多则运算:
Calculator.java
```java
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
public class Calculator extends Application {
private TextField inputField;
private Label resultLabel;
@Override
public void start(Stage primaryStage) throws Exception {
// 创建界面布局
GridPane gridPane = new GridPane();
gridPane.setPadding(new Insets(10));
gridPane.setVgap(10);
gridPane.setHgap(10);
// 创建输入框和结果标签
inputField = new TextField();
inputField.setPrefWidth(200);
resultLabel = new Label();
// 创建数字键和运算符键
Button[][] buttons = new Button[4][5];
String[][] buttonLabels = {
{"7", "8", "9", "+", "C"},
{"4", "5", "6", "-", "x!"},
{"1", "2", "3", "*", "sin"},
{"0", ".", "=", "/", "cos"}
};
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 5; j++) {
Button button = new Button(buttonLabels[i][j]);
button.setPrefWidth(50);
button.setOnAction(event -> {
String label = button.getText();
String text = inputField.getText();
if (label.equals("C")) {
inputField.setText("");
resultLabel.setText("");
} else if (label.equals("=")) {
try {
double result = calculate(text);
resultLabel.setText(String.format("%.2f", result));
} catch (Exception e) {
resultLabel.setText("Error!");
}
} else {
inputField.setText(text + label);
}
});
buttons[i][j] = button;
gridPane.add(button, j, i + 1);
}
}
// 添加输入框和结果标签
gridPane.add(inputField, 0, 0, 4, 1);
gridPane.add(resultLabel, 4, 0, 1, 2);
// 创建场景和窗口
Scene scene = new Scene(gridPane);
primaryStage.setTitle("Calculator");
primaryStage.setScene(scene);
primaryStage.show();
}
// 计算表达式的值
private double calculate(String expression) {
expression = expression.replaceAll("sin", "s");
expression = expression.replaceAll("cos", "c");
expression = expression.replaceAll("x!", "!"); // 将乘法因子阶乘符号替换为!
String[] tokens = expression.split("(?<=[+\\-*/!sct])|(?=[+\\-*/!sct])");
double result = Double.parseDouble(tokens[0]);
for (int i = 1; i < tokens.length; i += 2) {
String operator = tokens[i];
double operand = Double.parseDouble(tokens[i + 1]);
switch (operator) {
case "+":
result += operand;
break;
case "-":
result -= operand;
break;
case "*":
result *= operand;
break;
case "/":
if (operand == 0) {
throw new ArithmeticException("Divide by zero error!");
}
result /= operand;
break;
case "!":
if (result < 0 || result != (int) result) {
throw new IllegalArgumentException("Invalid operand for factorial!");
}
result = Calculator.factorial((int) result);
break;
case "s":
result = Math.sin(Math.toRadians(result));
break;
case "c":
result = Math.cos(Math.toRadians(result));
break;
case "^":
result = Math.pow(result, operand);
break;
default:
throw new IllegalArgumentException("Invalid operator!");
}
}
return result;
}
// 计算阶乘
private static long factorial(int n) {
if (n < 0) {
throw new IllegalArgumentException("Negative number!");
}
long result = 1;
for (int i = 2; i <= n; i++) {
result *= i;
}
return result;
}
public static void main(String[] args) {
launch(args);
}
}
```
该示例中,将输入的表达式字符串按运算符和数字分割成一个字符串数组,然后按顺序计算每个操作数与运算符之间的结果,并根据运算符进行相应的计算。另外,阶乘、正弦、余弦和指数等函数的计算使用了Java Math库中的函数。