第二次作业

[实验目的]

1.掌握软件开发的基本流程

2.掌握常用的软件开发方式和工具。

[实验内容]

1.设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。

[实验工具]

1.用eclipse写登录界面和计算器。

2.用Mysql存储数据。

3.用jdbc连接数据库。

4.用Visio绘制流程图。

[流程图]

1.登录流程图:

 

 2.计算器流程图

 

 [登录界面]

  [登录失败]

  [登录成功]

[计算测试]

 

 

[数据库信息]

 

[登录界面代码]

public class Calculator1 {

    private JFrame frame;
    private JPanel panel;
    private JTextField displayField;
    private JButton[] buttons;
    private String[] buttonLabels = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "+", "-", "*", "/", ".", "=" };
    private String displayText = "";

    private Connection conn;

    public Calculator1() {
        frame = new JFrame("计算器");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        panel = new JPanel(new GridLayout(6,1));

        JLabel titleLabel = new JLabel("Log on", SwingConstants.CENTER);
        titleLabel.setFont(new Font("Arial", Font.BOLD, 20));
        panel.add(titleLabel);

        JLabel usernameLabel = new JLabel("用户名:");
        panel.add(usernameLabel);

        JTextField usernameField = new JTextField();
        panel.add(usernameField);

        JLabel passwordLabel = new JLabel("密码:");
        panel.add(passwordLabel);

        JPasswordField passwordField = new JPasswordField();
        panel.add(passwordField);

        JButton loginButton = new JButton("登录");
        loginButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String username = usernameField.getText();
                String password = String.valueOf(passwordField.getPassword());

                if (login(username, password)) {
                    panel.setVisible(false);
                    initializeCalculator();
                } else {
                    JOptionPane.showMessageDialog(frame, "登录失败", "错误", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
        panel.add(loginButton);

        frame.add(panel);

        frame.setSize(500, 600);
        frame.setVisible(true);
    }

  

[Login方法验证用户登录信息]

    private boolean login(String username, String password) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost/calculator?useSSL=false", "root", "123456");

            String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
            PreparedStatement stmt = conn.prepareStatement(sql);
            stmt.setString(1, username);
            stmt.setString(2, password);
            ResultSet rs = stmt.executeQuery();

            if (rs.next()) {
                return true; // 登录成功
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        return false; // 登录失败
    }

  

[计算器界面]

    private void initializeCalculator() {
        JPanel calcPanel = new JPanel(new GridLayout(9, 1));

        JLabel titleLabel = new JLabel("count", SwingConstants.CENTER);
        titleLabel.setFont(new Font("Arial", Font.BOLD, 20));
        calcPanel.add(titleLabel);

        displayField = new JTextField();
        displayField.setEditable(false);
        calcPanel.add(displayField);

        buttons = new JButton[buttonLabels.length];
        for (int i = 0; i < buttonLabels.length; i++) {
            buttons[i] = new JButton(buttonLabels[i]);
            buttons[i].addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    String buttonText = ((JButton) e.getSource()).getText();

                    if (buttonText.equals("=")) {
                        calculate();
                    } else {
                        displayText += buttonText;
                        displayField.setText(displayText);
                    }
                }
            });
            calcPanel.add(buttons[i]);
        }

        frame.add(calcPanel);

        frame.setSize(500, 600);
        frame.revalidate();
    }

  

[EvaluateExpression类来计算表达式的结果]

package 计算器;

import java.util.Stack;

public class EvaluateExpression {
    public static double evaluate(String expression) {
        char[] tokens = expression.toCharArray();

        Stack<Double> values = new Stack<Double>();
        Stack<Character> operators = new Stack<Character>();

        for (int i = 0; i < tokens.length; i++) {
            if (tokens[i] >= '0' && tokens[i] <= '9') {
                StringBuilder sb = new StringBuilder();

                while (i < tokens.length && ((tokens[i] >= '0' && tokens[i] <= '9') || tokens[i] == '.')) {
                    sb.append(tokens[i]);
                    i++;
                }

                values.push(Double.parseDouble(sb.toString()));
                i--;
            } else if (tokens[i] == '(') {
                operators.push(tokens[i]);
            } else if (tokens[i] == ')') {
                while (operators.peek() != '(') {
                    values.push(applyOperator(operators.pop(), values.pop(), values.pop()));
                }
                operators.pop();
            } else if (tokens[i] == '+' || tokens[i] == '-' || tokens[i] == '*' || tokens[i] == '/') {
                while (!operators.empty() && hasPrecedence(tokens[i], operators.peek())) {
                    values.push(applyOperator(operators.pop(), values.pop(), values.pop()));
                }
                operators.push(tokens[i]);
            }
        }

        while (!operators.empty()) {
            values.push(applyOperator(operators.pop(), values.pop(), values.pop()));
        }

        return values.pop();
    }

    private static boolean hasPrecedence(char op1, char op2) {
        if (op2 == '(' || op2 == ')') {
            return false;
        }
        if ((op1 == '*' || op1 == '/') && (op2 == '+' || op2 == '-')) {
            return false;
        }
        return true;
    }

    private static double applyOperator(char operator, double b, double a) {
        switch (operator) {
            case '+':
                return a + b;
            case '-':
                return a - b;
            case '*':
                return a * b;
            case '/':
                if (b == 0) {
                    throw new ArithmeticException("除数不能为零");
                }
                return a / b;
        }
        return 0;
    }
}

 

[计算器调用]

    private void calculate() {
        try {
            double result = EvaluateExpression.evaluate(displayText);
            displayField.setText(String.valueOf(result));
            displayText = "";
        } catch (Exception e) {
            JOptionPane.showMessageDialog(frame, "无效表达式", "错误", JOptionPane.ERROR_MESSAGE);
        }
    }

 

[主函数调用]

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new Calculator1();
            }
        });
    }

 

[Mysql数据库和表]

-- 创建名为"calculator"的数据库
CREATE DATABASE IF NOT EXISTS calculator;

-- 使用"calculator"数据库
USE calculator;

-- 创建名为"users"的表
CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    password VARCHAR(50) NOT NULL
);

  

 

 

 

posted @ 2023-11-21 21:53  11༺零༻11  阅读(65)  评论(0)    收藏  举报