目录
1. homework_1
1.0 题目要求
1.1 UML图及架构分析
1.2 代码量
1.3 复杂度分析
1.4 优点
1.5 缺点
2. homework_2
2.0 题目要求
2.1 UML图及架构分析
2.2 代码量
2.3 复杂度分析
2.4 优点
2.5 缺点
3. homework_3
3.0 题目要求
3.1 UML图及架构分析
3.2 代码量
3.3 复杂度分析
3.4 优点
3.5 缺点
4. 出现的bug
5. 基本思路
6. 我的优化
7. 架构设计体验
8. 心得体会
9. 未来方向
1. homework_1
1.0 题目要求
读入一个包含加、减、乘、乘方以及括号的单变量表达式,输出恒等变形展开所有括号后的表达式。
1.1 UML图及架构分析

数据存储类:
解析类:
- Token 存储数据类型
- Lexer
- Parser 按照
Expr -> Term -> Power ->Factor进行递归下降解析
输出类:
- Print对答案进行输出(答案以存有Anstype的数组形式储存)
1.2 代码量

1.3 复杂度分析
类复杂度

方法复杂度(截取部分)

1.4 优点
- 对于
^,我在parserTerm中将其替换为...* ...* ...的形式,使得^和*统一起来。 - 在
Expr、Term、 Factor中均采用数组存储答案,答案的次幂对应其在数组中的位置 。 - 相较于
-1+x,字符串x-1的长度更短,于是在输出中先输出正数项,后输出负数项。 - 由于本次作业架构良好,目前程序已支持嵌套括号,减轻了第二次作业任务量。
1.5 缺点
- 一维数组可拓展性较低,第二次作业进行了大规模修改
2. homework_2
2.0 题目要求
支持嵌套多层括号;新增指数函数因子;新增自定义函数因子。
2.1 UML图及架构分析

数据存储类:(其余架构同homework_1)
- Factor
- varfun (新增)
- anstype加入指数内容expn
操作类(预处理、输出):(架构同homework_1)
解析类:(其余架构同homework_1)
计算类:
- Static
- 将乘法和加法处理方法从表达式化简中剥离
- 存放函数表达式
2.2 代码量

2.3 复杂度分析
类复杂度

方法复杂度(截取部分)

2.4 优点
- 本次作业我利用二维数组储存,方便结构比较清晰,顺序固定。
- 新建Func类,在解析之前,通过字符串替换的方式,将自定义函数代入表达式。
2.5 缺点
- 二维数组深克隆过多导致爆栈
3. homework_3
3.0 题目要求
新增求导算子;支持调用其他“已定义的”函数。
3.1 UML图及架构分析

数据存储类:(其余架构同homework_2)
解析类:(其余架构同homework_2)
操作类:(同homework_2)
3.2 代码量

3.3 复杂度分析
类复杂度

方法复杂度(截取部分)

3.4 优点
- 在上两次的基础上扩展,完成较快
3.5 缺点
- 并没有太多化简
4. 出现的bug
第二次作业强测阶段败在了如下数据,原因是递归超过10层时深克隆导致爆栈。
5. 基本思路
- Parse类对输入进行解析,返回一个完整的expr结构
- 对expr进行化简,返回一个数组
- 对数组进行print
6. 我的优化
- 采用专门的类来存储
a*x^b项,有效解决数组、Hashmap多层嵌套不直观的问题;自己写数据克隆,有效解决数据类型自带克隆的深浅克隆问题。
7. 架构设计体验
- 很感谢助教组提供的递归下降教程和源代码,通过修改源代码,我很快上手了本单元作业,后续为使结构清晰,我将解析与计算解耦。
- 对于可能的新的迭代,我的架构具有良好的可扩展性:面对新的计算类型,修改解析与计算类,而面对自定义函数的变动,则修改Func类。
8. 心得体会
凭着OOpre多次迭代的经验,我在写hw1和hw2时就在有意识地搭建结构清晰、可读性强的架构:在测试部分做的不好,一方面依赖于同学的测评机、自主性不强,另一方面自己构造数据时没有着重构造最简洁、最易错、最麻烦、最大值的数据。
9. 未来方向
感觉教程写的挺好的