第一次个人编程作业

这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/CSGrade21-12
这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/CSGrade21-12/homework/13014
这个作业的目标 运用PSP,github等工具完成论文查重项目
PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
· Planning · 计划 60 30
· Estimate · 估计这个任务需要多少时间 600 540
· Development · 开发 240 240
· Analysis · 需求分析 (包括学习新技术) 240 120
· Design Spec · 生成设计文档 30 0
· Design Review · 设计复审 60 0
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 30 10
· Design · 具体设计 60 120
· Coding · 具体编码 300 180
· Code Review · 代码复审 60 30
· Test · 测试(自我测试,修改代码,提交修改) 120 120
· Reporting · 报告 30 60
· Test Repor · 测试报告 30 30
· Size Measurement · 计算工作量 30 30
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30 30
· 合计 1920 1570

  • 三.模块接口的设计与实现过程


    设计

    模块

    类及其作用
    Main:程序的入口,计算输入的原文文档与抄袭文档的相似度并输出至答案文档中
String filePathOrig = args[0];//原文文档路径为第一个参数
        String filePathCopy = args[1];//抄袭文档路径为第二个参数
        String filePathResult = args[2];//生成结果文档路径为第三个参数
        String content1 = new FileEditor().readFile(filePathOrig);//获取原文文档内容
        String content2 = new FileEditor().readFile(filePathCopy);//获取抄袭文档内容
        float repetition = new Calculator().calculateSimilarity(content1,content2);//计算相似度
        new FileEditor().writeFile(filePathResult,"文本相似度为:" +String.format("%.2f", repetition)+"%");//将结果写入答案文档

FileEditor:文件的写入与读取,readFile()方法读取文档内容转化为字符串并返回,writeFile()方法将指定内容写入指定文档中
Calculator:计算文本相似度,计算两个输入字符串的编辑距离获取对应的相似度

核心算法
 public float calculateSimilarity(String origtext,String copytext) {
        //编辑距离计算文本相似度
        float similarity = 0;
        int d[][]; // 矩阵
        int n = origtext.length();
        int m = copytext.length();
        int i; // 遍历origtext
        int j; // 遍历copytext
        char ch1; // origtext的
        char ch2; // copytext的
        int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1
        if (n == 0 || m == 0) {
            return 0;
        }
        d = new int[n + 1][m + 1];
        for (i = 0; i <= n; i++) { // 初始化第一列
            d[i][0] = i;
        }

        for (j = 0; j <= m; j++) { // 初始化第一行
            d[0][j] = j;
        }

        for (i = 1; i <= n; i++) { // 遍历origtext
            ch1 = origtext.charAt(i - 1);
            // 去匹配copytext
            for (j = 1; j <= m; j++) {
                ch2 = copytext.charAt(j - 1);
                if (ch1 == ch2 || ch1 == ch2 + 32 || ch1 + 32 == ch2) {
                    temp = 0;
                } else {
                    temp = 1;
                }
                // 左边+1,上边+1, 左上角+temp取最小
                d[i][j] = Math.min(Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1), d[i - 1][j - 1] + temp);
            }
        }
        similarity = (1 - (float) d[n][m] / Math.max(origtext.length(), copytext.length())) * 100F;//将编辑距离转换为相似度

FileEditorTest:FileEditor的测试类,包含文档读取与文档写入的测试
CalculatorTest:Calculator的测试类,包含相同文本测试,空文本测试,类似文本测试

  • 四.模块接口部分的性能改进



  • 五.模块部分单元测试展示


    FileEditorTest

    CalculatorTest

  • 六.模块部分异常处理说明

命令行参数异常处理

if(args.length!=3){
            System.out.println("参数输入有误!");//参数数量错误提示
            return;
        }

文件读取异常处理

       try {
            FileReader fr = new FileReader(filePath);
            BufferedReader br = new BufferedReader(fr);
            while (br.ready()) {
                content = content + br.readLine() + "\n";
            }

        }
        catch(IOException e){
            System.out.println("读取文件失败!");
        }

文件写入异常处理

try {
            FileWriter writer = new FileWriter(filePath);
            writer.write(text);
            writer.close();
        }
        catch(IOException e){
            System.out.println("写入文件失败!");
        }
posted @ 2023-09-17 12:20  龙猫球  阅读(38)  评论(0)    收藏  举报