第二次作业

一,实验目的

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)登录页面部分与计算器应用部分代码的连接还需要改进,个人能力需要进一步提升

posted @ 2023-12-05 13:09  theking5  阅读(33)  评论(0)    收藏  举报