第二次作业
[实验目的]
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(); } }); } }
七、运算结果




数据库中存储的运算结果

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

浙公网安备 33010602011771号