Thứ Tư, 11 tháng 6, 2025

code1

 package ng;


import java.awt.EventQueue;

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionListener;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.ActionEvent;

import javax.swing.border.BevelBorder;


public class Calculator {

    private JFrame frmCaculator;

    private JTextField display;

    private JTextField textField;


    private double tempFirst = 0.0;

    private String operator = "";

    private boolean startNewNumber = true;

    private boolean resultDisplayed = false;


    public static void main(String[] args) {

        EventQueue.invokeLater(() -> {

            try {

                Calculator window = new Calculator();

                window.frmCaculator.setVisible(true);

            } catch (Exception e) {

                e.printStackTrace();

            }

        });

    }


    public Calculator() {

        initialize();

    }


    private void initialize() {

        frmCaculator = new JFrame();

        frmCaculator.setFont(new Font("Consolas", Font.BOLD, 16));

        frmCaculator.setTitle("Calculator");

        frmCaculator.setBounds(100, 100, 300, 400);

        frmCaculator.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frmCaculator.getContentPane().setLayout(new BorderLayout());

        frmCaculator.addKeyListener(new KeyAdapter() {

            @Override

            public void keyPressed(KeyEvent e) {

                switch (e.getKeyCode()) {

                    case KeyEvent.VK_0: // Người dùng bấm phím "0"

                        handleNumberInput("0");

                        break;

                    case KeyEvent.VK_PLUS: // Người dùng bấm "+"

                        handleOperator("+");

                        break;

                }

            }

        });


        JPanel panel = new JPanel(new BorderLayout());

        frmCaculator.getContentPane().add(panel, BorderLayout.NORTH);


        display = new JTextField("0");

        display.setHorizontalAlignment(SwingConstants.RIGHT);

        display.setFont(new Font("Tahoma", Font.BOLD, 20));

        display.setEditable(false);

        panel.add(display, BorderLayout.CENTER);

        display.setColumns(10);


        textField = new JTextField();

        textField.setHorizontalAlignment(SwingConstants.RIGHT);

        textField.setFont(new Font("Tahoma", Font.PLAIN, 16));

        textField.setEditable(false);

        panel.add(textField, BorderLayout.NORTH);

        textField.setColumns(10);


        JPanel buttonPanel = new JPanel(new GridLayout(6, 4, 5, 5));

        buttonPanel.setBorder(new BevelBorder(BevelBorder.LOWERED));

        frmCaculator.getContentPane().add(buttonPanel, BorderLayout.CENTER);


        String[] buttonLabels = {

            "log", "√", "^", "!",

            "%", "+/-", "C", "←",

            "7", "8", "9", "/",

            "4", "5", "6", "*",

            "1", "2", "3", "-",

            "0", ".", "=", "+"

        };


        for (String label : buttonLabels) {

            JButton button = new JButton(label);

            button.setBackground(Color.GREEN);

            button.setForeground(Color.RED);

            button.setFont(new Font("Tahoma", Font.PLAIN, 18));

            button.addActionListener(e -> handleButtonPress(e.getActionCommand()));

            buttonPanel.add(button);

        }

    }


    private void handleButtonPress(String cmd) {

        if (cmd.matches("\\d") || cmd.equals(".")) {

            handleNumberInput(cmd);

        } else {

            switch (cmd) {

                case "C": clearAll(); break;

                case "←": deleteLastDigit(); break;

                case "=": performCalculation(); break;

                case "%": handlePercentage(); break;

                case "√": handleSquareRoot(); break;

                case "^": handleOperator(cmd); break;

                case "!": handleFactorial(); break;

                case "+/-": toggleSign(); break;

                case "log": handleLog(); break;

                default: handleOperator(cmd);

            }

        }

    }


    private void handleNumberInput(String input) {

        if (resultDisplayed) { 

        display.setText(input);

            textField.setText(input); // Reset biểu thức khi có kết quả mới

            resultDisplayed = false;

        } else if (startNewNumber) {

        //display.setText(input);

            textField.setText(textField.getText() + input); // Nối số vào biểu thức

            startNewNumber = false;

        } else {

        //display.setText(display.getText() + input);

            textField.setText(textField.getText() + input); // Nối tiếp số vào biểu thức

        }

    }

    private void handleOperator(String cmd) {

//        tempFirst = Double.parseDouble(textField.getText());

          operator = cmd;

          System.out.println("ll="+operator);

        textField.setText(textField.getText() + " " + cmd + " "); // Nối phép toán vào biểu thức

        startNewNumber = true;

        resultDisplayed = false;

    }


//    private void performCalculation() {

//        if (!operator.isEmpty()) {

//            double tempSecond = Double.parseDouble(display.getText());

//            double result = calculate(tempFirst, tempSecond, operator);

//            display.setText(formatResult(result));

//            tempFirst = result;

//            operator = "";

//            startNewNumber = true;

//            resultDisplayed = true;

//        }

//    }

    private void performCalculation() {

        if (!operator.isEmpty()) {

            // Tách biểu thức trong textField thành các phần tử

 

            String[] tokens = textField.getText().split(" ");

            if (tokens.length == 3) {

                try {

                    double tempFirst = Double.parseDouble(tokens[0]);

                    double tempSecond = Double.parseDouble(tokens[2]);

                    double result = calculate(tempFirst, tempSecond, operator);

                    display.setText(formatResult(result));

                    //textField.setText(""); // Xóa biểu thức sau khi tính toán

                    operator = "";

                    startNewNumber = true;

                    resultDisplayed = true;

                } catch (NumberFormatException e) {

                    display.setText("Lỗi");

                }

            }

        }

    }


    private void handleSquareRoot() {

        double value = Double.parseDouble(display.getText());

        display.setText(formatResult(Math.sqrt(value)));

    }


    private void handleLog() {

        double value = Double.parseDouble(display.getText());

        display.setText(formatResult(Math.log10(value)));

    }


    private void handlePercentage() {

        double value = Double.parseDouble(display.getText());

        display.setText(formatResult(value / 100));

    }


    private void handleFactorial() {

        int value = Integer.parseInt(display.getText());

        display.setText(String.valueOf(factorial(value)));

    }


    private void toggleSign() {

        double value = Double.parseDouble(display.getText());

        display.setText(formatResult(-value));

    }


    private void deleteLastDigit() {

        String text = display.getText();

        display.setText(text.length() > 1 ? text.substring(0, text.length() - 1) : "0");

    }


    private void clearAll() {

    display.setText("0");

        textField.setText("");

        tempFirst = 0.0;

        operator = "";

        startNewNumber = true;

        resultDisplayed = false;

    }


    private double calculate(double a, double b, String operator) {

        return switch (operator) {

            case "+" -> a + b;

            case "-" -> a - b;

            case "*" -> a * b;

            case "/"  ->{

            if (b == 0) {

                JOptionPane.showMessageDialog(frmCaculator, "Lỗi: Không thể chia cho 0", "Error", JOptionPane.ERROR_MESSAGE);

                yield 0;

            }

            yield a / b;}

            case "^" -> Math.pow(a, b);

            default -> 0;

        };

    }


    public static long factorial(int n) {

        long result = 1;

        for (int i = 2; i <= n; i++) result *= i;

        return result;

    }


    private String formatResult(double result) {

        return result == (int) result ? String.valueOf((int) result) : String.valueOf(result);

    }

Không có nhận xét nào:

Đăng nhận xét

code 2

  package ll; public class CalculatorModel { public double calculate ( String expression ) { return evaluateExpression (...