第一单元总结
第一单元总结
本单元作业表达式化简作业整体思维难度不高,但是需要实现的功能较为繁琐。由于本人并没有懒得参透递归下降的奥义,所以使用的方法相较于大众化的思路有很大差别。我所使用的方法是暴力扫描式子中的各种符号并递归展开,牺牲了一定的时间复杂度(最优O(nlogn)最差O(n^2)),但降低了维护和迭代的难度,使得第三次作业后总文件并未超过400行。
第一次作业
1、类图与解释

用上述方法以表达式、项、因子的层次调用divide逐步将表达式分解,直至分解为基本项。用这样的方法,对实现括号的嵌套这一功能的迭代十分友好。至于优化部分,我以多项式标准化格式Standard类对每一个表达式、项、因子做了实时简化。
2、类与方法度量
| Method | CogC | ev(G) | iv(G) | v(G) |
|---|---|---|---|---|
| Element.divide(String) | 10 | 3 | 8 | 9 |
| Expression.divide(String) | 13 | 2 | 11 | 12 |
| MainClass.main(String[]) | 0 | 1 | 1 | 1 |
| Standard.Standard(HashMap<Integer, BigInteger>) | 0 | 1 | 1 | 1 |
| Standard.Standard(String) | 2 | 1 | 3 | 3 |
| Standard.addOrSub(Standard, char) | 12 | 1 | 5 | 5 |
| Standard.multiply(Standard) | 7 | 1 | 4 | 4 |
| Standard.toString() | 23 | 3 | 13 | 16 |
| Xiang.divide(String) | 10 | 2 | 9 | 10 |
| Class | OCavg | OCmax | WMC | |
| Element | 6 | 6 | 6 | |
| Expression | 6 | 6 | 6 | |
| MainClass | 1 | 1 | 1 | |
| Standard | 4.8 | 11 | 24 | |
| Xiang | 6 | 6 | 6 |
由此可以看出,我此次代码的的编写,并未体现出面向对象的优越性,但重构太过麻烦,因此下面的迭代只能依托此继续进行。
3、bug分析
本次作业构造较为明了,并未发现bug。
第二次作业
1、类图与解释

此次作业的难点是加入了三角函数,我并未找到合适的处理方式,而仅将其作为字符串进行处理,以至于出现了将sin(x)**3展开成了sin(x)*sin(x)*sin(x)这样的负优化。对于三角函数的字符串,将其组合进Coefficient类中表示其与多项式的组合,仍然以Standard为标准类。
对于sum函数和自定义函数,则可以直接使用字符串代换的方式进行处理后再调用表达式的divide。
2、类与方法度量
| Method | CogC | ev(G) | iv(G) | v(G) |
|---|---|---|---|---|
| Coefficient.Coefficient() | 0 | 1 | 1 | 1 |
| Coefficient.Coefficient(BigInteger) | 0 | 1 | 1 | 1 |
| Coefficient.Coefficient(HashMap<String, BigInteger>) | 0 | 1 | 1 | 1 |
| Coefficient.Coefficient(String) | 0 | 1 | 1 | 1 |
| Coefficient.addOrSub(Coefficient, char) | 12 | 1 | 5 | 5 |
| Coefficient.getHashMap() | 0 | 1 | 1 | 1 |
| Coefficient.multiply(Coefficient) | 23 | 1 | 14 | 14 |
| Element.divide(String, HashMap<Character, Function>) | 19 | 5 | 17 | 19 |
| Expression.divide(String, HashMap<Character, Function>) | 13 | 2 | 11 | 12 |
| Function.Function(String) | 4 | 3 | 3 | 4 |
| Function.getFunction(String[]) | 3 | 1 | 4 | 4 |
| MainClass.main(String[]) | 1 | 1 | 2 | 2 |
| Standard.Standard(HashMap<Integer, Coefficient>) | 0 | 1 | 1 | 1 |
| Standard.Standard(String) | 5 | 1 | 4 | 4 |
| Standard.addOrSub(Standard, char) | 3 | 1 | 3 | 3 |
| Standard.multiply(Standard) | 7 | 1 | 4 | 4 |
| Standard.toString() | 66 | 4 | 22 | 27 |
| Xiang.divide(String, HashMap<Character, Function>) | 11 | 2 | 9 | 11 |
| Class | OCavg | OCmax | WMC | |
| Coefficient | 2.57 | 8 | 18 | |
| Element | 12 | 12 | 12 | |
| Expression | 6 | 6 | 6 | |
| Function | 4 | 4 | 8 | |
| MainClass | 2 | 2 | 2 | |
| Standard | 6.2 | 19 | 31 | |
| Xiang | 7 | 7 | 7 |
同上,此次代码的的编写,并未体现出面向对象的优越性。
3、bug分析
本次作业构造较为明了,并未发现bug。
第三次作业
1、类图与解释

此次需实现自定义函数及三角函数的嵌套,自定义函数以我的方法已经能够实现嵌套,而三角函数则需要改变纯字符串的写法。则需要将三角函数的内部以因子的方式处理完毕再转成字符串形式,然后进行合并。此次迭代的改动较少,因此第三次作业几乎没有消耗多少精力。
2、类与方法度量
| Method | CogC | ev(G) | iv(G) | v(G) |
|---|---|---|---|---|
| Coefficient.Coefficient() | 0 | 1 | 1 | 1 |
| Coefficient.Coefficient(BigInteger) | 0 | 1 | 1 | 1 |
| Coefficient.Coefficient(HashMap<String, BigInteger>) | 0 | 1 | 1 | 1 |
| Coefficient.Coefficient(String) | 0 | 1 | 1 | 1 |
| Coefficient.addOrSub(Coefficient, char) | 12 | 1 | 5 | 5 |
| Coefficient.getHashMap() | 0 | 1 | 1 | 1 |
| Coefficient.multiply(Coefficient) | 23 | 1 | 14 | 14 |
| Element.divide(String, HashMap<Character, Function>) | 27 | 5 | 21 | 24 |
| Expression.divide(String, HashMap<Character, Function>) | 13 | 2 | 11 | 12 |
| Function.Function(String) | 4 | 3 | 3 | 4 |
| Function.getFunction(String[]) | 3 | 1 | 4 | 4 |
| MainClass.main(String[]) | 1 | 1 | 2 | 2 |
| Standard.Standard(HashMap<Integer, Coefficient>) | 0 | 1 | 1 | 1 |
| Standard.Standard(String, HashMap<Character, Function>) | 26 | 1 | 12 | 16 |
| Standard.addOrSub(Standard, char) | 3 | 1 | 3 | 3 |
| Standard.multiply(Standard) | 7 | 1 | 4 | 4 |
| Standard.toString() | 66 | 4 | 22 | 27 |
| Xiang.divide(String, HashMap<Character, Function>) | 11 | 2 | 9 | 11 |
| Class | OCavg | OCmax | WMC | |
| Coefficient | 2.57 | 8 | 18 | |
| Element | 16 | 16 | 16 | |
| Expression | 6 | 6 | 6 | |
| Function | 4 | 4 | 8 | |
| MainClass | 2 | 2 | 2 | |
| Standard | 7.6 | 19 | 38 | |
| Xiang | 7 | 7 | 7 |
同上,此次代码的的编写,并未体现出面向对象的优越性。
3、bug分析
本次作业通过了强测,在互测时发现1个bug。即在迭代的时候没有考虑到sum()中的自变量可能超出int范围的情况。尽管从客观来讲这种情况并不合理,但还是没有逃过善于发现各种漏洞的hacker们。
hack策略
由于我对hack缺乏兴趣,也并不像别人对hack到的分散感兴趣,也不想去尝试理解别人冗长的代码,因此常年处于与世无争的状态,但在被hack的经验来看,hack数据大多属于在翻阅了指导书无数遍后找到的漏洞和极端数据。
总结
总的来说,我因为没有使用标准方法,而凑巧使用了一个代码量较小而复杂度较高的方法。尽管消耗了更少的精力解决了同样的问题,但并未体现面向对象的优越性,并未完全达到练习预期的效果。
posted on 2022-03-22 23:04 hacker_killer 阅读(70) 评论(0) 收藏 举报
浙公网安备 33010602011771号