第一单元总结
第一单元总结
本单元作业表达式化简作业整体思维难度不高,但是需要实现的功能较为繁琐。由于本人并没有懒得参透递归下降的奥义,所以使用的方法相较于大众化的思路有很大差别。我所使用的方法是暴力扫描式子中的各种符号并递归展开,牺牲了一定的时间复杂度(最优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 阅读(67) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架