其他分享
首页 > 其他分享> > 2022OO第一单元总结

2022OO第一单元总结

作者:互联网

2022OO第一单元总结

一、第一次作业分析

1.总类图以及架构分析

2.代码复杂度分析

由于第一次作业功能较少,所以代码量不大,但是词法分析的两个类ExprLexer两个类写的过于臃肿,分析代码发现有大量重复的代码,例如识别括号符号等小符号的方法可以融合到一个方法中。

本次作业没有臃肿的方法,这是比较好一点,但是有些方法也写的太开了,导致有许多一两行的方法。另外有几个方法没有注意优化,导致圈复杂度较高。

本次作业由于难度不大,所以十分类的复杂度不高,各个类之间的耦合度也不高,但是有Lexer这么一个臃肿的类,原因还是之前的,将功能分的太细,反而有反作用。

3.优缺点分析

4.数据构造与测评

目标:

尽可能的覆盖所有情况,并且覆盖到边界特殊情况,并且符合标准输入条件。

数据生成器

5.bug分析

hack策略

课程组的本意是想我们读别人的代码,来实现hack,但是一个房间几个人,每人上千行的代码实在难以阅读,所以此次hack主要还是采用黑盒的方式。先写一个类能够运行所有代码,首先手工输入一些边界数据hack,在将代码丢到评测机里,实现大规模数据的自动化测评。

bug

由于自己数学知识的匮乏,导致强测出现了一个bug,具体是把负数的0次方错误输出为-1,同时也说明了数据生成器在边界数据上的不足。由于错了一个点,导致房间等级不高,这次写的数据生成器都没怎么用,最后用了一下保证人人中刀,总计hack到了14次,其中非同质bug有

二、第二次作业分析

1.总类图以及架构分析

2.代码复杂度分析

第二次作业代码量陡增,主要就是为每个因子均增加了sub和deepclone方法,deepclone下一次可以考虑使用抽象类,以降低代码复杂度,不然每增加一个因子均要添加该方法。

本次作业依然没有比较臃肿的方法,但是sub方法依旧写的比较烂,另外就是deepclone下次可以使用继承写在父类上。

本次作业由于需要多次代入,同一个类肯调用其他好几个类,所以有几个类的耦合度比较高,其实这个时候正确的做法或许是使用工厂类。解析的类依旧比较臃肿(由于这次有几个比较致命的bug一直每de出来,所以来不及优化代码结构)。

3.优缺点分析

4.数据构造与测评

新增常量池

public static final String [] getTriExprMul = {
            "(sin(x**2)**4+sin(x)+1)**0","(sin(x**0)**1-sin(x)+1)**2",
            "(-cos(x**3)**4+cos(x)+1)**3","(-cos(x**3)**0-cos(x)+1)**3",
            "(sin(x**2)**4+sin(x)+1)","(sin(x**0)**3-sin(x)+1)",
            "(-cos(x**4)**4+cos(x)+1)","(-cos(x**3)**3-cos(x)+1)",
            "(sin(x)**2+sin(x)+1)","(sin(x)**2-sin(x)+1)",
            "(-cos(x)**2+cos(x)+1)","(-cos(x)**2-cos(x)+1)"
    };

这次主要新增了一些三角函数的数据

随机生成基础因子

这次由于代入的要求,所以需要生成一些简单的因子,依旧采用Random控制生成,例如三角函数的生成如下

public static String triGen (Random random) {
        return (random.nextInt(2) == 1 ? "sin" : "cos") + "(" + facGen(random) + ")**"  + random.nextInt(8);
    }
    public static String facGen (Random random) {
        int op = random.nextInt(5);
        if (op == 0) {
            return  String.valueOf(random.nextInt());
        } else if (op <3) {
            return "x**" + random.nextInt(4);
        } else {
            return String.valueOf(random.nextInt(1000));
        }
    }

由于这次作业可能存在多重嵌套所以降低了指数的大小,以防止指数过大。另外还可以使用一些简单的数学知识控制生成的概率。

自定义函数生成

这是本次数据生成比较困难的一个点,依旧是随机数生成的方式,先利用随机数选择函数个数,再随机选择变量的个数,然后生成函数表达式,利用相应的函数变量替换x,最后将函数存到hashMap当中方便后续代入。这次的数据生成器有一些小缺陷,同一个项中无法包含两个变量,手动构造数据时应当自己构造。

具体代码如下

public static String funcGen (Random random) {
        StringBuilder sb = new StringBuilder();
        varNum = new int[3];
        num = random.nextInt(4);
        sb.append(num + "\n");
        for (int i = 0; i < num; i++) {
            sb.append(name[i] + "(");
            HashMap<Character , Boolean> vars = new HashMap();
            for (int j = 0; j < 3; j++) {
                vars.put(var[j], false);
            }
            int varlength = random.nextInt(3) + 1;
            varNum[i] = varlength;
            char [] varSet = new char[varlength];
            for (int j = 0; j < varlength; j++) {
                int index = random.nextInt(3);
                while (vars.get(var[index])) {
                    index = random.nextInt(3);
                }
                varSet[j] = var[index];
                vars.replace(var[index], true);
                sb.append(var[index]);
                if (j != varlength - 1)
                    sb.append(",");
            }
            sb.append(")=");
            int termlengh = random.nextInt(2) + 1;
            for (int j = 0; j < termlengh; j++) {
                sb.append(getSign(random));
                sb.append(getTerm(random).replace("x", String.valueOf(varSet[random.nextInt(varlength)])));
            }
            sb.append("\n");
        }
        return sb.toString();
    }

测评

由于本次作业有自定义函数,所以只能采用对拍的方式,不过我看到讨论区有大佬发了先手动解析消除掉自定义函数的方法,我自己其实也想到一些正则替换的方法,不过本次作业差点就寄在了中测,所有没有来得及实现。

5.Bug分析

本次作业由于一个小bug找了一整天,所以各类数据都试了一遍,互测和强测均未被hack,也没有hack到别人,不过我看到同房的同学有处理sin(0)的错误(没想到第三次作业就成了我自己的bug)。

三、第三次作业分析

第三次作业总体增量不大,代码大概只增加了几十行,而且功能在第二次作业已经能够完全实现,方法的复杂度也没有太大的区别,而且新增的方法大部分是新增的优化,由于前两次的容器选取太烂,所以此次主要分析代码的一些重构思路。

1.优化与重构

2.数据生成

由于第二次写的数据生成器已经比较完善,所以此次几乎没有太大的改动,只需要允许调用其他函数即可,反而此次大部分时间都放在了降低复杂度上。之前由于没有控制数据生成的上下限,所以很多数据都递归太深或者系数太大,很容易TLE,也不满足课程组的要求。

3.Bug分析

由于此次大面积重构,以及化简写的不太完善,出现了不少bug,强测和互测中个被hack一个点,另外我自己在提交之后也发现了一个bug

四、个人反思与感想

1.架构与设计反思

2.个人提升

3.课程建议

OO的课程已经相当完善,我只能提一个浅薄的建议,主要是在互测上的。

个人认为第三次互测的要求完全可以放在第二次,第二次作业大家的bug都比较少,主要就是sum函数和自定义函数都不能使用,而第三次作业仅仅开放了sum,而且互测的要求明显是第二次作业就能够完成的,这种情况下第三次作业依然有大量hack,说明第二次作业的测试强度不够,一些bug被保留到了第三次,我认为第二次作业起码能够开放sum的互测,第三次可以开放自定义函数

标签:总结,2022OO,random,作业,Term,因子,表达式,方法,单元
来源: https://www.cnblogs.com/shliba/p/16058501.html