第二次作业

[实验目的]

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

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

[实验内容]

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

一、实验目的

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

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

二、流程图

                                                                                图(1)

                                                                  图(2)

三、登录界面

        使用swing创建GUI界面并添加注册按钮。

        包含登录、注册以及错误验证等功能。

    public CalculatorApp() {
        // 创建登录界面
        frame = new JFrame("登录");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 150);
        frame.setLayout(null);

        JLabel userLabel = new JLabel("用户名:");
        userLabel.setBounds(10, 10, 80, 25);
        frame.add(userLabel);

        JTextField userField = new JTextField(20);
        userField.setBounds(100, 10, 160, 25);
        frame.add(userField);

        JLabel passwordLabel = new JLabel("密码:");
        passwordLabel.setBounds(10, 40, 80, 25);
        frame.add(passwordLabel);

        JPasswordField passwordField = new JPasswordField(20);
        passwordField.setBounds(100, 40, 160, 25);
        frame.add(passwordField);

        JButton loginButton = new JButton("登录");
        loginButton.setBounds(100, 80, 80, 25);
        frame.add(loginButton);

        JButton registerButton = new JButton("注册");
        registerButton.setBounds(190, 80, 80, 25);
        frame.add(registerButton);

        frame.setVisible(true);

        // 登录按钮点击事件
        loginButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String username = userField.getText();
                String password = new String(passwordField.getPassword());

                // 验证用户名和密码
                if (validateUser(username, password)) {
                    frame.setVisible(false);
                    CalculatorApp.this.username = username;
                    createCalculatorUI();
                } else {
                    JOptionPane.showMessageDialog(frame, "用户名或密码错误!", "错误", JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        // 注册按钮点击事件
        registerButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String username = userField.getText();
                String password = new String(passwordField.getPassword());

                // 注册用户
                if (registerUser(username, password)) {
                    JOptionPane.showMessageDialog(frame, "注册成功!", "消息", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    JOptionPane.showMessageDialog(frame, "注册失败,请重试!", "错误", JOptionPane.ERROR_MESSAGE);
                }
            }
        });
    }

    private boolean validateUser(String username, String password) {
        // 在此处实现用户验证逻辑,比如检查用户名和密码是否匹配
        // 返回true表示验证通过,否则返回false
        return true;
    }

    private boolean registerUser(String username, String password) {
        // 在此处实现用户注册逻辑,比如将用户名和密码存储到数据库中
        // 返回true表示注册成功,否则返回false
        return true;
    }

  运行结果

 四、创建数据库

       创建数据库calculator,下建两个表,分别是calculator_users表calculator_history表用来存储用户登录信息和计算历史记录结果。

       创建数据库表:创建一个名为"calculator_users"的表,用来存放用户登录账号密码

       创建一个名为"calculator_history"的表,用来存放历史计算结果

 五、计算器代码

 import javax.swing.*import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.Stack;

public class CalculatorApp {
private JFrame frame;
private JTextField expressionField;
private JTextField resultField;
private Stack<String> expressionStack;
private boolean isOperatorAdded;

public CalculatorApp() {
// 创建计算器界面
frame = new JFrame("计算器");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setLayout(new BorderLayout());
expressionStack = new Stack<>();
isOperatorAdded = false;

expressionField = new JTextField();
expressionField.setEditable(false);
frame.add(expressionField, BorderLayout.NORTH);

resultField = new JTextField();
resultField.setEditable(false);
frame.add(resultField, BorderLayout.SOUTH);

JPanel buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(5, 4));

String[] buttons = {"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "=", "+",
"C", "←"};

for (String button : buttons) {
JButton btn = new JButton(button);
btn.addActionListener(new ButtonClickListener());
buttonPanel.add(btn);
}

frame.add(buttonPanel, BorderLayout.CENTER);
frame.setVisible(true);
}

private class ButtonClickListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String buttonText = ((JButton) e.getSource()).getText();

// 判断点击的按钮
if (buttonText.equals("=")) {
String expression = expressionField.getText();
double result = evaluateExpression(expression);
resultField.setText(String.valueOf(result));
expressionStack.clear();
expressionStack.push(String.valueOf(result));
} else if (buttonText.equals("C")) {
expressionField.setText("");
resultField.setText("");
expressionStack.clear();
isOperatorAdded = false;
} else if (buttonText.equals("←")) {
if (!expressionStack.isEmpty()) {
String currentExpression = expressionStack.pop();
if (currentExpression.length() > 1) {
expressionField.setText(currentExpression.substring(0, currentExpression.length() - 1));
expressionStack.push(expressionField.getText());
} else {
expressionField.setText("");
isOperatorAdded = false;
}
}
} else if (isOperator(buttonText)) {
if (!isOperatorAdded) {
expressionField.setText(expressionField.getText() + buttonText);
expressionStack.push(expressionField.getText());
isOperatorAdded = true;
}
} else {
expressionField.setText(expressionField.getText() + buttonText);
expressionStack.push(expressionField.getText());
isOperatorAdded = false;
}
}
}

private boolean isOperator(String buttonText) {
return buttonText.equals("+") || buttonText.equals("-") || buttonText.equals("*") || buttonText.equals("/");
}

private double evaluateExpression(String expression) {
// 移除空格
expression = expression.replaceAll("\\s", "");

// 使用JavaScript引擎计算表达式
javax.script.ScriptEngineManager manager = new javax.script.ScriptEngineManager();
javax.script.ScriptEngine engine = manager.getEngineByName("JavaScript");

try {
Object result = engine.eval(expression);
return Double.parseDouble(result.toString());
} catch (Exception e) {
JOptionPane.showMessageDialog(frame, "表达式无效!", "错误", JOptionPane.ERROR_MESSAGE);
return 0.0;
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new CalculatorApp();
}
});
}
}
private
class ButtonClickListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String buttonText
= ((JButton) e.getSource()).getText(); // 判断点击的按钮
if (buttonText.equals("="))
{
// 计算表达式 String expression = expressionField.getText();
double result = evaluateExpression(expression); // 显示结果
resultField.setText(String.valueOf(result)); // 存储计算结果到数据库
storeResult(username, expression, result);
}
else {
// 更新表达式
expressionField.setText(expressionField.getText() + buttonText);
}
}
}
private double evaluateExpression(String expression)
{
// 在此处实现表达式计算逻辑 // 返回计算结果
return 0.0;
}

六、连接数据库

    private void storeResult(String username, String expression, double result) {
        // 连接数据库
        try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/calculator", "username", "password")) {
            String sql = "INSERT INTO calculator_history (username, expression, result) VALUES (?, ?, ?)";
            try (PreparedStatement statement = conn.prepareStatement(sql)) {
                statement.setString(1, username);
                statement.setString(2, expression);
                statement.setDouble(3, result);

                // 执行插入操作
                statement.executeUpdate();
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

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

 七、运算结果

 数据库中存储的运算结果

 八. 总结

        通过本次作业的完成,使我更加了解了软件开发工具的运用。在项目之初我遇到了版本不适配,代码不太熟,终端运行不对命令,连接不上数据库等各种问题,但通过自己的研究以及网上的学习,解决各种问题。在这个过程中我发现,通过这个作业我锻炼了自己的自学能力、动手能力,学到了更多的知识。

 

posted @ 2023-12-05 01:35  xilih  阅读(79)  评论(0)    收藏  举报