软件工程作业2

news/2025/3/10 1:11:46/文章来源:https://www.cnblogs.com/sscxc/p/18761726
这个作业属于哪个课程 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);
}

}
`

四、运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/896182.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

How Far Can We Go with Practical Function-Level Program Repair? 论文笔记

介绍 (1) 背景现有的很多基于 LLM 的 APR 方法针对的是 single-line 或者代 hunk-level 的程序修复,但它们通常依靠语句级别的故障定位技术。然而,人们普遍认为,准确识别陈述级的断层基本上可能是代价高昂的,即要求细粒度的输入或强有力的假设,从而有可能限制它们的适用性…

Ubuntu安装最新版本的cmake

1、下载地址 Index of /files/LatestRelease ,目前最新的是3.31.6 或者命令行方式下载wget https://cmake.org/files/LatestRelease/cmake-3.31.6-linux-x86_64.tar.gz2、解压tar -zxvf cmake-3.31.6-linux-x86_64.tar.gz3、替换已有的cmake,mv命令必须目标路径为空,所以使用…

[AI/GPT] Anything-LLM : (MIT)

概述: Anything LLM 简述一体式桌面和Docker AI应用程序,内置RAG、AI代理、无代码代理构建器等。urlhttps://anythingllm.com https://github.com/Mintplex-Labs/anything-llm20250220 : 3.7k fork / 38.1K star创建公司:Mintplex Labs Inc.创立时间:2023年12月(首次公开)…

再次认识java反射

一、概述 在认识java反射之前我们先来认识一下什么是动态语言与静态语言。 动态语言 是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以 被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。 主要…

【问题】HashMap的computeIfAbsent方法丢失数据问题分析

问题背景 前段时间碰到客户问题发现是 ConcurrentHashMap的computeIfAbsent导致死循环(ConcurrentHashMap死循环问题分析)就很好奇HashMap的computeIfAbsent会不会也有问题,一试之下发现确实存在问题,相同的代码在HashMap中会丢失插入的数据。 发生原因 【循环添加】时,如…

CFA学习

定量分析 利率 利率的定义:被认为是 ① 平衡借贷双方的平衡点(equilibrium interest rates)② 贴现率(货币的时间价值)③ 机会成本 利率的组成:通货膨胀➕各种风险 计算【现值/终值】用时间轴确实一目了然! # 经济学 # 财务报表分析 # 公司理财 # 投资组合管理 # 权益投…

INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性

INFINI Labs 产品更新发布!此次更新,Easysearch 增加了新的功能和数据类型,包括 wildcard 数据类型、Point in time 搜索 API、异步搜索 API、数值和日期字段的 doc-values 搜索支持,Console 新增了日志查询功能。 INFINI Easysearch v1.11.0 INFINI Easysearch 是一个分布…

语法trick

for (int i = 1; i <= n; ++i) {cout << dist[i] << " \n"[i == n];}

百万架构师第四十七课:并发编程的原理(二)|JavaGuide

原文链接 JavaGuide《并发编程的艺术》 并发编程的实现原理 目标上节课内容回顾 synchronized 原理分析 wait 和 notify Lock 同步锁回顾原子性 可见性 有序性JMM ​ JMM 是 JAVA 里边定义的内存模型。定义了多线程和我们内存交互的规范。屏蔽了硬件和操作系统访问内存的差异。…

[极客大挑战 2019]Havefun 1

进网站显示一只猫,于是看源代码 发现下面有注释<!--$cat=$_GET[cat];echo $cat;if($cat==dog){echo Syc{cat_cat_cat_cat};}-->所以在后面加上/index.php?cat=dog即可(小猫可爱捏)

提取excel中的图片

需求: 提取excel中嵌入单元格的图片 实现思路: 用pandas读取文件,对于嵌入图片的单元格则会显示其函数 问题:wps与office嵌入方法有所不同,wps使用函数嵌套,而office则是设置随单元格大小变动,对于后者,会被视为是悬浮的图片,使用pandas无法提取任何一张图片 源文件如…