2020北航oo第一单元(表达式求导)总结
三次作业分析
1:第一次作业
1.1:题目分析
这次作业是简单的多项式求导。
多项式由加减法连接项,项由乘法连接因子,因子为幂函数和带符号整数。
1.2:实现方案
一共建立了三个类,Main类包括程序的入口,接受输入,并将结果优化后输出。Handle类接受来自Main类的表达式,并进行预处理,比如去掉空格等,再利用正则和for循环,将表达式化为key为幂函数指数,value为系数的Map,并合并同类项,该map用+连接后与原表达式等价,返回该Map。Multinomial类接受到处理后的Map,在求导规则下进行求导,并返回求导后的Map。Main类再进行优化输出。
程序UML图:

1.3:结构分析
此次作业先用Handle类清除多余符号,再用正则和for循环解析表达式,之后用Multinational类的diCo方法求导,并在Main类中优化后输出。
作业度量如下

1.4:得失分析
这次作业仍有很多面向过程的思想,基本上们没有面向对象的思想。强测没有测出bug,但在互测过程中被hack了十几次。在通过观察并测试他人代码时,感到了代码风格的作用,好的代码风格能让人更好的读懂。此外在本次作业,我学到了:
1.Map和Arraylist容器的使用。
2.继承和接口的使用
3.如何debug和修改bug
2:第二次作业
2.1:题目分析
本次作业是包含简单幂函数和简单正余弦函数的表达式求导。
相比于第一次作业:1.新增因子sin(x),cos(x)。2.新增括号。
2.2:实现方案
一共建立了四个类,Main类包括程序的入口,接受输入,并将结果优化后输出。Key类为Map的键,成员为幂函数,正余弦函数的指数,并重写了hashcode和equals方法来用自定义的方式判断两键值是否相等。Handle类接受来自Main类的表达式,并进行预处理,比如去掉空格,将sin(x)替换为s等,再利用正则和for循环,将表达式化为key为自定义的Key类,value为系数的Map,并合并同类项,该map用+连接后与原表达式等价,返回表达式的Map。具体方式为维护三个map,分别为因子、项、表达式,遇到项间的+-*时进行map合并,遇到括号时递归处理,其余情况用正则匹配因子并放入到因子的map中。Multinomial类接受到处理后的Map,在求导规则(map中每一项都是固定的形式,所以求导规则一定)下进行求导,并返回求导后的Map。Main类再进行优化输出。
程序UML图:

2.3:结构分析
此次作业用Handle类简化表达式的预处理,并借助正则,for循环和递归解析表达式成Map,然后在Multinomial类中进行求导,最后在Main类对结果优化后输出。
本次作业度量如下:

2.4:得失分析
这次作业仍然没有用到面向对象的思想,基本上都是面向过程。在强测部分未出现bug,但在互测环节仍然被hack了十几次。不过这些互测样例让我更好的面对我的程序和bug,让我的思维更加的缜密,并在同学的帮助下顺利修复。另外此次作业我学到了:
1.Map是如何判断两个键是否相等,并且怎么用自己的方式定义相等。
2.要考虑周到,巧用正则表达式,但不能全用正则表达式。
3:第三次作业
3.1:题目分析
本次作业是包含幂函数和正余弦函数的表达式求导。
相对与第二次作业:1.新增格式判断。2.新增sin(),cos()嵌套。
3.2:实现方案
一共建立了八个类,Sin类和Cos类管理三角函数,成员包括指数和三角函数括号内的Map引用和对应的三角函数相乘方法。Factoer类为他们的父类,方便管理。Main类包含程序入口,接受输入和输出。Key类为Map的键,成员为幂函数的指数、一个数组代表多个sin相乘、一个数组代表多个cos相乘。PreCheck类为格式检查,利用正则和穷举法来判断输入格式是否正确。Handle类接受来自Main类的表达式,并进行预处理,比如去掉空格,将sin(x)替换为s等,再利用正则和for循环,将表达式化为key为自定义的Key类,value为系数的Map,并合并同类项,该map用+连接后与原表达式等价,返回表达式的Map。具体方式为维护三个map,分别为因子、项、表达式,遇到项间的+-*时进行map合并,遇到括号时递归处理,其余情况用正则匹配因子并放入到因子的map中。Multinomial类接受到处理后的Map,在求导规则(map中每一项都是固定的形式,为系数、幂函数和多个三角函数相乘,所以求导规则一定)下进行求导,返回求导后的字符串。Main类再进行优化输出。
作业的UML图如下:

3.3:结构分析
本次作业了构建因子类,然后先在PreCheck类中进行格式判断,再在Handle类利用正则和for循环构建表达式的Map,之后在Multinational类中进行求导,最后在Main类优化结果并输出。
本次作业度量:

3.4:得失分析
本次作业由于格式判断部分未考虑周全,导致只通过了中测的基础样例,未通过进阶样例,因此未进入互测,而且在强测中只获得了33分。不过在同学和助教的帮助下,顺利修复了bug,完成了此次作业。并且在这次作业中用到了面向对象的思想。本次作业中我学到了:
1.面向对象思想的方便之处。
2.评测机的设计原理。
3.多态的使用。
4:单元分析
本单元的作业有很强的迭代性,但遗憾的是,我在完成作业时,用的更多的说面向过程的思想,很少用到面向对象,导致每次的作业都是重构的,花费了不少的时间。这使我意识到了面向对象的重要性,在下次作业中,我将好好使用这思想。此外,互测阶段让我接触到了其他人的代码,懂得了代码风格的重要性和必要性,在今后的代码路途中,我将更加关注代码风格。
总之,我学到了很多的知识,不仅仅是java,还有很多思想。希望自己在今后的学习中能多多使用这些知识,不断完善自己的技术。

浙公网安备 33010602011771号