ychunx

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
这个作业属于哪个课程 软件工程
这个作业要求在哪里 作业要求
这个作业的目标 结对合作+生成四则运算题目程序/检查器
项目成员1 3119005481 杨春晓 Github项目地址
项目成员2 3119005488 钟理恩 Github项目地址

目录

1.作业 GitHub 链接
2.开发环境
3.PSP 表格
4.效能分析
5.设计与实现过程
6.代码说明
7.测试运行
8.项目小结

作业 GitHub 链接

杨春晓(ychunx)链接:https://github.com/ychunx/FourArithmeticGenerator
钟理恩(CharlesZhongLE)链接:https://github.com/CharlesZhongLE/FourArithmeticGenerator
exe 已经发布至仓库的 release 文件夹内


开发环境

  • 编程语言:Java 16
  • 编程工具:IDEA 2021.2
  • 项目构建工具:maven
  • 性能分析工具:JProfiler 12
  • 单元测试框架:JUnit 4.12

效能分析

性能分析看来,生成四则运算方面耗能最多,其中用于约分的接口占比最大,充分说明对于本生成器而言,小学生需要在分数运算上多下功夫。

全部性能

类的占用情况

CPU view


设计与实现过程

通过题目生成类生成题目和答案,储存在数组中,由文本输出类输出。文本输入类读取作业和答案文件,通过批改作业类批改,生成成绩要求格式,输出文本文件。

主要的包
  • appMain包:主程序 Main 包
  • Util包:有三个主要类,如下述
主要的类
  • GenerateUtil 类:生成题目的类
  • FileIOUtil 类:文件输入输出类,包括作业的读入和成绩、练习的输出
  • JudgeUtil 类:批改类,通过简单思路判断作业对错

代码说明

批改函数

由于要求作业文件和答案文件都是包含题目和答案的,所以只需要判断文本文件读出的字符串数组中,每个对应元素是否相等就可以完成该功能

public static void judge(String[] e,String[] a){

        ArrayList rCount =new ArrayList();
        ArrayList wCount =new ArrayList();
        //int rCount[]=new int[e.length];
        //int wCount[]=new int[a.length];
        //int rightNum=0; //记录正确数目
        //int wrongNum=0; //记录错误数目

        //根据学生提交的作业(包含题目和答案)判断是否与原题目和答案相等做出简单判断
        for(int i=0;i<e.length;i++){
            if(e[i].equals(a[i])) {
                rCount.add(i+1);    //记录正确题号
                //rightNum++;
            }
            else {
                wCount.add(i+1);    //记录错误题号
                //wrongNum++;
            }
        }
        String r = "";
        String w = "";

        //拼接题号字符串
        for(int i=0;i<rCount.size();i++){
            r = r.concat(rCount.get(i).toString() + ",");
        }
        for(int i=0;i<wCount.size();i++){
            w = w.concat(wCount.get(i).toString() + ",");
        }
        String[] s = new String[2];
        s[0] = "Correct:" + rCount.size() + "(" + r + ")";
        s[1] = "Wrong:" + wCount.size() + "(" + w + ")";

        //输出至文本文件
        FileIOUtil.outPut(s,2);
    }
文本输出函数

outPut 是简单的根据传入的参数判断需要输出的文件类型
out 是将字符串数组输出成文本文件

public static void outPut(String[] s,int i) {
        if(i == 0){
            String path = "Exercise.txt";   //题目
            out(s,path);
        }else if(i == 1){
            String path = "Answers.txt";    //答案
            out(s,path);
        }else if(i == 2){
            String path = "Grade.txt";  //成绩
            out(s,path);
        } else if(i == 3){
            String path = "exerciseAns.txt";    //题目和答案
            out(s,path);
        }
    }

public static void out(String[] s,String path){
        File file = new File(path);
        try {
            FileWriter fw = new FileWriter(file, true);
            for(int i=1;i<s.length+1;i++){
                fw.write(i + "、" + s[i-1]+"\n");    
            }
            fw.close();
        } catch (IOException e) {
            System.out.println("文件保存失败。");
        }
    }
真假分数转换

将假分数转换为带分数,直接输出真分数。对于分子大于分母的数字,利用整除与求余,求得带分数的整数与分数部分并输出,余数为0或分子小于分母的数则直接输出。

public static String divide(int a, int b){
        if(a>=b){
            int c,d;
            c=a/b;
            d=a%b;
            if(d==0)return c+"";
            else return c+"'"+d+"/"+b;
        }
        else return a+"/"+b;
    }
约分

将分数进行约分。利用穷举法求出公因子,分子分母同时除以公因子约分。并用divide()将数字以真分数形式输出。

public static String reductionOfAFraction(int a, int b) {
        int maxfactor = 1;
        for (int i = a; i >= 1; i--) {
            if (a % i == 0 && b % i == 0) {
                maxfactor = i;
                break;
            }
        }
        int numerator = a / maxfactor;
        int denominator = b / maxfactor;
        if (numerator == 0) return "0";
        if (denominator == 1) return numerator + "";
        else return divide(numerator, denominator);
    }

测试运行

运行结果

一、生成题目部分

首先命令行输入 Myapp.exe -n 10000 -r 100 可以得到三个文件,分别为题目、答案、题目和答案

能够生成10000个题目,该图是包含题目和答案的 exerciseAns.txt ,而题目和答案分别在 Exercise.txt 和 Answers.txt

二、批改部分

根据上面生成的题目和答案文件 exerciseAns.txt ,随机修改几题的答案作为学生提交的作业,测试时命名 exerciseAns1.txt(作业包含题目和答案,答案文件也包括题目和答案)
命令行输入 Myapp.exe -e C:\Users...\FourArithmeticGenerator\release\exerciseAns.txt -a C:\Users...\FourArithmeticGenerator\release\exerciseAns1.txt
生成 Grade.txt 成绩文件

单元测试

本次单元测试设置了10个测试用例,共分为6类

1、测试CreateExercise()生成四则运算,对生成数的范围和大小进行测试
2、测试JudgeUtil()校对答案,自定义字符串进行测试
3、测试divide()假分数转带分数、真分数显示,对不同大小分子分母进行测试
4、测试reductionOfAFraction()约分,对带0情况以及是否能继续约分进行测试
5、测试in()文件输入
6、测试out()文件输出


项目小结

成员1:杨春晓(ychunx)小结

本次作业还是有功能没有实现:查重、括号和多个运算符号,也只能基于字符串进行编写代码,确实是比较遗憾。但是学习了四则运算题的生成思路和熟悉的各类间的传参、各函数间的传参,同时学会了打包成 exe 的方法。最重要的是这次作业是初步尝试与他人合作完成,是不错的体验。

成员2:钟理恩(CharlesZhongLE)小结

本次作业主要负责四则运算的生成以及测试接口,对于各函数参数传递有了更深刻认识,也首次接触了jar包生成exe过程,学到了很多东西。


PSP 表格

PSP 2.1
Personal Software Process Stage
预估耗时(分钟)
实际耗时(分钟)
Planning 计划 60 60
Estimate 估计这个任务需要多少时间 20 25
Development 开发 600 720
Analysis 需求分析 (包括学习新技术) 120 120
Design Spec 生成设计文档 60 50
Design Review 设计复审 30 20
Coding Standard 代码规范 (为目前的开发制定合适的规范) 10 20
Design 具体设计 30 60
Coding 具体编码 120 240
Code Review 代码复审 30 20
Test 测试(自我测试,修改代码,提交修改) 60 45
Reporting 报告 60 80
Test Repor 测试报告 60 60
Size Measurement 计算工作量 20 30
Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 30 45
合计 1310 1595
posted on 2021-10-26 00:23  ychunx  阅读(57)  评论(0编辑  收藏  举报