第二次作业
一,实验目的
1.掌握软件开发的基本流程
2.掌握常用的软件开发方式和工具。
二,实验内容
1.设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。
三,实验要求
1.完成软件的UI设计、使用Visio设计软件中所涉及的所有流程图。
2.选择合适的集成开发环境和工具完成计算器软件的开发
3.将开发好软件进行测试并截图
4.将本次实验过程写成实验报告提交在本次作业的链接中
5.关键代码部分以代码块格式粘贴在实验报告正文中
6.软件架构以及开发技术不限\
四,流程图
1.登录流程图

2.计算流程图

五,代码
1,登录页面代码
<!DOCTYPE html>
<html>
<head>
<title>计算器登录页面</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #6666FF;
}
.container {
width: 300px;
margin: 100px auto;
background-color: #fff;
padding: 20px;
border-radius: 5px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
h2 {
text-align: center;
}
input[type="text"],
input[type="password"] {
width: 100%;
padding: 10px;
margin-bottom: 15px;
border: 1px solid #ccc;
border-radius: 3px;
}
input[type="submit"] {
width: 100%;
background-color: #33FFCC;
color: #fff;
border: none;
padding: 10px;
border-radius: 3px;
cursor: pointer;
}
input[type="submit"]:hover {
background-color: #45a049;
}
</style>
</head>
<body>
<div class="container">
<h2>king计算器登录</h2>
<form action="calculator.html" method="post">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
<input type="submit" value="登录">
</form>
</div>
</body>
</html>
2,登录页面

3,计算器代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
public class CalculatorApp extends JFrame {
private JTextField inputField;
private JTextArea historyArea;
private String currentUsername;
public CalculatorApp() {
setTitle("Calculator");
setSize(400, 500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
JPanel loginPanel = createLoginPanel();
add(loginPanel);
setVisible(true);
}
private JPanel createLoginPanel() {
JPanel panel = new JPanel(new BorderLayout());
JPanel loginPanel = new JPanel(new FlowLayout());
JLabel usernameLabel = new JLabel("Username:");
JTextField usernameField = new JTextField(15);
JButton loginButton = new JButton("Login");
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
currentUsername = usernameField.getText();
remove(panel);
initializeCalculator();
}
});
loginPanel.add(usernameLabel);
loginPanel.add(usernameField);
loginPanel.add(loginButton);
panel.add(loginPanel, BorderLayout.CENTER);
return panel;
}
private void initializeCalculator() {
JPanel calculatorPanel = new JPanel(new BorderLayout());
inputField = new JTextField();
historyArea = new JTextArea(15, 30);
historyArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(historyArea);
JPanel buttonPanel = new JPanel(new GridLayout(5, 4));
String[] buttonLabels = {
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", ".", "=", "+",
"sqrt", "C"
};
for (String label : buttonLabels) {
JButton button = new JButton(label);
button.addActionListener(new CalculatorButtonListener());
buttonPanel.add(button);
}
calculatorPanel.add(inputField, BorderLayout.NORTH);
calculatorPanel.add(scrollPane, BorderLayout.CENTER);
calculatorPanel.add(buttonPanel, BorderLayout.SOUTH);
add(calculatorPanel);
revalidate();
repaint();
}
private class CalculatorButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JButton source = (JButton) e.getSource();
String buttonText = source.getText();
if (buttonText.equals("=")) {
evaluateExpressionAndSaveHistory();
} else if (buttonText.equals("C")) {
clearInputField();
} else if (buttonText.equals("sqrt")) {
calculateSquareRoot();
} else {
inputField.setText(inputField.getText() + buttonText);
}
}
private void evaluateExpressionAndSaveHistory() {
String expression = inputField.getText();
if (!expression.isEmpty()) {
try {
double result = evaluateExpression(expression);
String history = currentUsername + ": " + expression + " = " + result;
historyArea.append(history + "\n");
saveHistoryToFile(history);
inputField.setText(String.valueOf(result));
} catch (ArithmeticException | NumberFormatException ex) {
showError("Error in expression: " + ex.getMessage());
}
} else {
showError("Please enter an expression.");
}
}
private double evaluateExpression(String expression) {
// 实现计算逻辑,这里简单起见,直接使用Java的eval函数
return (double) new javax.script.ScriptEngineManager().getEngineByName("js").eval(expression);
}
private void saveHistoryToFile(String history) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter("history.txt", true))) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
LocalDateTime now = LocalDateTime.now();
writer.write(dtf.format(now) + " - " + history + "\n");
} catch (IOException e) {
showError("Error saving history to file: " + e.getMessage());
}
}
private void clearInputField() {
inputField.setText("");
}
private void calculateSquareRoot() {
String expression = inputField.getText();
if (!expression.isEmpty()) {
try {
double number = Double.parseDouble(expression);
if (number >= 0) {
double result = Math.sqrt(number);
String history = currentUsername + ": sqrt(" + expression + ") = " + result;
historyArea.append(history + "\n");
saveHistoryToFile(history);
inputField.setText(String.valueOf(result));
} else {
showError("Square root of a negative number is not allowed.");
}
} catch (NumberFormatException ex) {
showError("Invalid input for square root calculation.");
}
} else {
showError("Please enter a number for square root calculation.");
}
}
private void showError(String message) {
JOptionPane.showMessageDialog(null, message, "Error", JOptionPane.ERROR_MESSAGE);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new CalculatorApp();
}
});
}
}
4,计算器页面
(1)8+2=10


(2)6×2=12



六,总结
(1)实操代码实现过程,增加实操经验
(2)登录页面部分与计算器应用部分代码的连接还需要改进,个人能力需要进一步提升

浙公网安备 33010602011771号