[实验目的]
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
);