软件工程作业2
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023 |
|---|---|
| 这个作业要求在哪里 | https://www.cnblogs.com/huanghi4833/p/18760121 |
| 这个作业的目标 | 掌握 GitHub 、Git 的基本使用方法, 积累个人编程项目的经验 |
一、PSP表格
| PSP2.1 Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|
| 计划 | 50 | 60 |
| 需求分析 | 20 | 20 |
| 设计 | 60 | 50 |
| 编码 | 60 | 70 |
| 代码复审 | 30 | 30 |
| 单元测试 | 80 | 60 |
| 性能优化 | 60 | 60 |
| 报告撰写 | 60 | 50 |
| 合计 | 420 | 400 |
二、设计方案
1.用户界面 (UI) 设计:
使用Java Swing库创建一个图形用户界面,让用户能够与程序交互。
界面包含输入字段用于显示文件路径,按钮用于选择文件和执行查重操作。
2.文件选择:
提供两个按钮,分别用于让用户选择原文文件和抄袭版文件。
使用JFileChooser组件来弹出文件选择对话框,允许用户从本地文件系统中选择文件。
3.查重逻辑:
当用户点击“查重”按钮时,程序读取两个文件的文本内容。
使用Levenshtein距离算法来计算两个文本之间的差异程度,从而估计相似度。
4.结果显示:
计算出的相似度(重复率)通过对话框显示给用户。
三、核心代码展示
`
import javax.swing.;
import java.io.;
public class PaperPlagiarismCheckerApp {
private JFrame frame;
private JTextField originalFilePathField;
private JTextField plagiarizedFilePathField;
public static void main(String[] args) {
SwingUtilities.invokeLater(PaperPlagiarismCheckerApp::new);
}
public PaperPlagiarismCheckerApp() {
initializeUI();
}
private void initializeUI() {
frame = new JFrame();
frame.setBounds(100, 100, 600, 200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
originalFilePathField = new JTextField();
originalFilePathField.setBounds(10, 10, 400, 25);
frame.getContentPane().add(originalFilePathField);
JButton selectOriginalButton = new JButton("选择原文");
selectOriginalButton.setBounds(420, 10, 150, 25);
frame.getContentPane().add(selectOriginalButton);
selectOriginalButton.addActionListener(e -> selectFile(originalFilePathField));
plagiarizedFilePathField = new JTextField();
plagiarizedFilePathField.setBounds(10, 45, 400, 25);
frame.getContentPane().add(plagiarizedFilePathField);
JButton selectPlagiarizedButton = new JButton("选择抄袭版");
selectPlagiarizedButton.setBounds(420, 45, 150, 25);
frame.getContentPane().add(selectPlagiarizedButton);
selectPlagiarizedButton.addActionListener(e -> selectFile(plagiarizedFilePathField));
JButton checkPlagiarismButton = new JButton("查重");
checkPlagiarismButton.setBounds(250, 80, 100, 25);
frame.getContentPane().add(checkPlagiarismButton);
checkPlagiarismButton.addActionListener(e -> checkPlagiarism());
frame.setVisible(true);
}
private void selectFile(JTextField textField) {
JFileChooser fileChooser = new JFileChooser();
int result = fileChooser.showOpenDialog(frame);
if (result == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
textField.setText(selectedFile.getAbsolutePath());
}
}
private void checkPlagiarism() {
String originalFilePath = originalFilePathField.getText();
String plagiarizedFilePath = plagiarizedFilePathField.getText();
if (originalFilePath.isEmpty() || plagiarizedFilePath.isEmpty()) {
JOptionPane.showMessageDialog(frame, "请选择两个文件。", "错误", JOptionPane.ERROR_MESSAGE);
return;
}
double similarity = checkPlagiarismLogic(originalFilePath, plagiarizedFilePath);
JOptionPane.showMessageDialog(frame, "重复率为: " + similarity + "%", "查重结果", JOptionPane.INFORMATION_MESSAGE);
}
private double checkPlagiarismLogic(String originalFilePath, String plagiarizedFilePath) {
String originalContent = readFileContent(originalFilePath);
String plagiarizedContent = readFileContent(plagiarizedFilePath);
if (originalContent.isEmpty() || plagiarizedContent.isEmpty()) {
return 0.0;
}
int distance = computeLevenshteinDistance(originalContent, plagiarizedContent);
int maxDistance = Math.max(originalContent.length(), plagiarizedContent.length());
return (1 - (double) distance / maxDistance) * 100;
}
private String readFileContent(String filePath) {
StringBuilder contentBuilder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String currentLine;
while ((currentLine = reader.readLine()) != null) {
contentBuilder.append(currentLine).append("\n");
}
} catch (IOException e) {
e.printStackTrace();
}
return contentBuilder.toString();
}
private int computeLevenshteinDistance(CharSequence str1, CharSequence str2) {
int[][] distance = new int[str1.length() + 1][str2.length() + 1];
for (int i = 0; i <= str1.length(); i++)
distance[i][0] = i;
for (int j = 1; j <= str2.length(); j++)
distance[0][j] = j;
for (int i = 1; i <= str1.length(); i++)
for (int j = 1; j <= str2.length(); j++)
distance[i][j] = minimum(
distance[i - 1][j] + 1,
distance[i][j - 1] + 1,
distance[i - 1][j - 1] + ((str1.charAt(i - 1) == str2.charAt(j - 1)) ? 0 : 1));
return distance[str1.length()][str2.length()];
}
private int minimum(int a, int b, int c) {
return Math.min(Math.min(a, b), c);
}
}
`
四、运行结果:


浙公网安备 33010602011771号