commit 9757ac0c967106e338f818043d3eb0429fa37115 Author: gxy <2107831483@qq.com> Date: Wed Oct 9 11:12:03 2024 +0800 6218 diff --git a/UML.iml b/UML.iml new file mode 100644 index 0000000..37cc804 --- /dev/null +++ b/UML.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/Calculator6218.java b/src/Calculator6218.java new file mode 100644 index 0000000..0191cb9 --- /dev/null +++ b/src/Calculator6218.java @@ -0,0 +1,200 @@ + +import javafx.application.Application; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.TextField; +import javafx.scene.layout.*; +import javafx.stage.Stage; + +import java.util.Stack; + +public class Calculator6218 extends Application { + private TextField display; + private StringBuilder currentInput = new StringBuilder(); + + public static void main(String[] args) { + launch(args); + } + + @Override + public void start(Stage primaryStage) { + VBox root = getRoot(); + Scene scene = new Scene(root, 300, 400); + primaryStage.setTitle("计算器"); + primaryStage.setScene(scene); + primaryStage.show(); + } + + private VBox getRoot() { + // 显示区域 + display = new TextField("0"); + display.setEditable(false); + display.setAlignment(Pos.CENTER_RIGHT); + display.setStyle("-fx-font-size: 24; -fx-background-color: #FFFFFF; -fx-border-color: #000000;"); + + // 按钮布局 + GridPane buttonGrid = new GridPane(); + buttonGrid.setPadding(new Insets(10)); + buttonGrid.setHgap(10); + buttonGrid.setVgap(10); + + // 创建按钮 + String[] buttonLabels = { + "%", "CE", "C", "×", + "1/x", "x²", "√", "÷", + "7", "8", "9", "-", + "4", "5", "6", "+", + "1", "2", "3", "=", + "+/-", "0", "." + }; + + int index = 0; + for (int row = 0; row < 5; row++) { + for (int col = 0; col < 4; col++) { + Button button = new Button(buttonLabels[index]); + button.setMinSize(50, 50); + button.setOnAction(event -> handleButtonClick(button.getText())); + buttonGrid.add(button, col, row); + index++; + } + } + + // 主布局 + VBox root = new VBox(10); + root.setPadding(new Insets(20)); + root.getChildren().addAll(display, buttonGrid); + return root; + } + + private void handleButtonClick(String buttonText) { + // 处理按钮点击 + switch (buttonText) { + case "C": + display.setText("0"); + currentInput.setLength(0); + break; + case "CE": + currentInput.setLength(0); + display.setText("0"); + break; + case "=": + try { + double result = evaluateExpression(currentInput.toString()); + display.setText(String.valueOf(result)); + currentInput.setLength(0); + currentInput.append(result); + } catch (Exception e) { + display.setText("错误"); + } + break; + case "+": + case "-": + case "×": + case "÷": + case "√": + case "x²": + case "1/x": + currentInput.append(convertOperator(buttonText)); + display.setText(currentInput.toString()); + break; + default: + currentInput.append(buttonText); + display.setText(currentInput.toString()); + break; + } + } + + private String convertOperator(String operator) { + switch (operator) { + case "×": + return "*"; + case "÷": + return "/"; + case "√": + return "Math.sqrt("; + case "x²": + return "^(2)"; + case "1/x": + return "(1/("; + default: + return operator; + } + } + + private double evaluateExpression(String expression) throws Exception { + // 使用简单的后缀表达式来评估表达式 + String[] tokens = expression.split("(?<=[-+*/()])|(?=[-+*/()])"); + Stack values = new Stack<>(); + Stack operations = new Stack<>(); + + for (String token : tokens) { + if (isNumeric(token)) { + values.push(Double.parseDouble(token)); + } else if (isOperator(token)) { + while (!operations.isEmpty() && precedence(token) <= precedence(operations.peek())) { + double b = values.pop(); + double a = values.pop(); + String op = operations.pop(); + values.push(applyOperation(a, b, op)); + } + operations.push(token); + } + } + + while (!operations.isEmpty()) { + double b = values.pop(); + double a = values.pop(); + String op = operations.pop(); + values.push(applyOperation(a, b, op)); + } + + return values.pop(); + } + + private boolean isNumeric(String str) { + return str.matches("-?\\d+(\\.\\d+)?"); + } + + private boolean isOperator(String str) { + return str.equals("+") || str.equals("-") || str.equals("*") || str.equals("/") || + str.equals("√") || str.equals("x²") || str.equals("1/x"); + } + + private int precedence(String operator) { + switch (operator) { + case "+": case "-": + return 1; + case "×": case "÷": + return 2; + case "√": case "x²": + return 3; + default: + return 0; + } + } + + private double applyOperation(double a, double b, String operator) throws Exception { + switch (operator) { + case "+": + return a + b; + case "-": + return a - b; + case "*": + return a * b; + case "/": + if (b == 0) throw new Exception("除以零"); + return a / b; + case "√": + return Math.sqrt(b); + case "x²": + return Math.pow(a, 2); + case "1/x": + if (a == 0) throw new Exception("除以零"); + return 1 / a; + default: + return 0; + } + } +} \ No newline at end of file diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..fe7aa2b --- /dev/null +++ b/src/Main.java @@ -0,0 +1,15 @@ +//TIP 要运行代码,请按 或 +// 点击装订区域中的 图标。 +public class Main { + public static void main(String[] args) { + //TIP 当文本光标位于高亮显示的文本处时按 + // 查看 IntelliJ IDEA 建议如何修正。 + System.out.printf("Hello and welcome!"); + + for (int i = 1; i <= 5; i++) { + //TIP 按 开始调试代码。我们已经设置了一个 断点 + // 但您始终可以通过按 添加更多断点。 + System.out.println("i = " + i); + } + } +} \ No newline at end of file