2020_BUAA_OO_UNIT1 单元总结

2020_BUAA_OO_UNIT1 单元总结

HomeWork1

1、整体思路

第一次的作业要求比较简单,并且本人当时对面向对象的思想也并没有什么领悟,于是采用了延展性极差的操作方法。

初始化:将表达式中的项统一为[+-]a*x**b|[+-]a的形式

1.由于数据保证了一定合法,我们可以大胆的去掉所有的空白字符

2.进行符号替换,将++|--替换成++-|-+替换成-

3.检查表达式开头有无符号,没有的话增加一个+

4.将省略情况补全,-x替换为-1*x+x替换为+1*x

拆项:

根据指导书的形式化表述构造正则表达式,利用matcher类的findgroup函数将每一项识别出来,并且将其导数的系数作为value,导数的指数作为key,存入hashmap中(如果没有就新建,有的话将value值相加作为新的value值)。

输出:

第一项优先输出系数为正的项,可以减少答案长度,剩下的项便利hashmap输出。

2、度量分析

UML:

2020_BUAA_OO_UNIT1 单元总结_第1张图片

从UML类图可以看出这开两个类完全是为了强行仿效面向对象思想,实际上还是面向过程。

行数分析:

复杂度分析:

2020_BUAA_OO_UNIT1 单元总结_第2张图片

3、bug分析

强测互测中均未被找到bug

HomeWork2

1、整体思路

第二次作业在第一次基础上增加了因子cos(x)、sin(x),并且需要判断输入格式是否合法。大体思路与第一次作业一致,将表达式中的项统一为[+-]a*x**b*sin(x)**c*cos(x)**d的形式,不过在初始化之前增加了一个判断表达式是否合法的过程,根据指导书的形式化表达构建正则表达式,并与输入的表达式进行匹配检查是否合法。

2、度量分析

UML:

2020_BUAA_OO_UNIT1 单元总结_第3张图片

这次拥有了一点面向对象的思想了,将box类改成了项类,而不再像第一次作业一样单纯的当工具人。

行数分析:

复杂度分析:

2020_BUAA_OO_UNIT1 单元总结_第4张图片

可以看出部分方法耦合度过高,难以隔离、维护和复用。

3、bug分析

强测互测中均未被找到bug

HomeWork3

1、整体思路

第三次作业的加入了嵌到,使得HM1、HM2的方法不再适用,也是这次作业才逼迫我感受到了一点面向对象的思想的门道。第三次的基本思想是递归,对表达式中的每一项设置好其基本的求导规则,然后进行递归操作进行递归求导。作业的难点是输出的优化,包括去除括号‘合并同类项等。由于本人太菜,仅仅实现了括号优化(还出了bug)和*0优化。

基础类构造:

public class Basic {
    private String cont;//存自身字符串
    private ArrayList sons = new ArrayList<>();//儿子集
    private BigInteger deg;//指数
    private int sign;//符号
    private String diffcont;//导数字符串
}

每次构建对象时,都检测传进来的字符串是否合法,并且将该对象的子元素拆分出来并且构建子元素对象(实现了递归)存入儿子集中(如表达式项的子元素是项,常数因子等没有子元素),然后按照求导规则计算出本对象的导数并存储。

初始化:

检查空格错误,包括非法字符和空白字符位置错误

检查符号错误,包括连续的4个符号,三个连续符号接x/cos/sin等等

去掉空格,优化符号(类似前两次作业)

递归:

将初始化后的表达式创建为一个对象,并且输出该对象的导数

2、度量分析

UML:

2020_BUAA_OO_UNIT1 单元总结_第5张图片

面向对象的思想比之前两次作业浓多了,有点内味儿了。

行数分析:

复杂度分析:

2020_BUAA_OO_UNIT1 单元总结_第6张图片

方法就多了许多,因为每一个类都需要有一个自己的求导方法。

3、bug分析

强测和互测中各找到了一个bug

BUG1:cos/sin括号中的因子为带符号数时,如果符号和数字分开属于WF,但是我考虑时漏了这种情况。所在的类为main类,在进行WF判断是产生了漏判。

BUG2:cos/sin的因子求导时括号省略出现问题,导致会出现输出结果形式不合法的情况。问题所在的类为sin、cos类,将因子求导的最终结果加上一个括号即可修复。

发现别人程序BUG的策略

三次作业均采用自动化评测,数据构造方法无偏向性,属于碰运气钓鱼型找bug方法。幸运的是,三次互测中均钓鱼成功,找到了别人的bug。不过自动化测评找出的不同数据是否属于同质bug仍需手动检验,建议不要重复交同质bug的数据来hack别人搞心态,毕竟一次修复了你根本得不了更多的分,还浪费时间卡着CD交数据,有这时间去做点其他事(RUSH B)它不香吗。

应用对象创建模式

第一、二次作业因为类种类少,因此什么方法都没用。

第三次作业的对象创建模式可以使用工厂模式来构造,将表达式传递进去自动分类构建。

对比和心得体会

研讨课上听了一个同学分享的满分优化代码的思路,发现自己第二次作业的优化不足就已经为第三次作业的优化不足打下了基础,其实自己也有过一些想法都是都因为感到实现起来很复杂而放弃深度思考,仅仅实现了一下自认为“性价比”(收益/代码量)比较高的优化,然而在见识到了大佬们的优化以后,我不禁为自己的懒惰感到羞愧。

其实从第一次作业开始,就应该充分感受面向对象的思想,可以提前看看往年学长们的博客,感受一下他们的思路,思考一下作业怎么写才能有更好的扩展性,为后面的作业做准备(这次的第三次作业本人从头开始重写,十分痛苦)。不能只为了图这次作业的简便,而导致下次作业的暴毙(是我本人)。

不过收获还是相当多的,包括对java应用的熟练,对脚本语言的了解等等,虽然这三周过的挺累的,但是成效却也是十分显著。

你可能感兴趣的:(2020_BUAA_OO_UNIT1 单元总结)