BUAAOO第一单元总结

孙喆-21373031 2024-03-23 14:55:48


# OO第一单元总结
## HW1
本次作业需要完成的任务为:读入一个包含加、减、乘、乘方以及括号(其中括号的深度至多为 1 层)的单变量表达式,输出恒等变形展开所有括号后的表达式。
### 一、基于度量的程序结构分析
#### 1. 代码规模
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/75c504f5ef3d44559db44c49b7a52fb8.png)
#### 2. 代码复杂度
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e10c651a32f34df9a64c922b89806de2.png)
![](https://img-blog.csdnimg.cn/direct/b47d65fa08f340a29a02b61e3593649d.png)
#### 3. 类图
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e08d010cf5f946c3900ca5e39a4e3762.png)
### 二、架构设计体验
本次作业中,首先设计PreProcessor类对读入的多项式进行预处理,再以Expression类为入口,通过递归下降的方式分析处理后的表达式,将分析后的语法成分遍历输出,完成去括号的任务。

PreProcessor类中的work()方法,对原表达式以此进行去除多余正负号(AddSub())、负号前补零(addZero())、去除数字前导零(mnumber())、幂次展开(Power())、去处指数前导符号(removeAdd()),返回一个更简洁、更容易进行语法分析的表达式。

Lexer类完成词法分析的任务,逐个字符地分析字符串(getsym()),并存储当前位置(curPos)、当前单词类型(symbol)、当前所读字符串(token),用于语法分析。Parser中根据Lexer返回的单词类型,对语法内容进行分析(parseExpression(), parseItem(), parseFactor()),在Factor类中存储对应实体。

Factor接口下的因子类(Expression, Item, IntFactor, VarFactor)所生成的对象实体,其属性存储相应语法成分的内容,并重写toString()方法完成打印输出。此外,Expression和Item类中的expand()方法(见下图),通过迭代式的因子合并完成去除括号的任务。

![Item类中的expand()方法代码展示](https://img-blog.csdnimg.cn/direct/f0a2254ed85c460da32802d3e6a9d7a5.png)
### 三、bug分析
本次作业在预处理阶段对于多余正负号处理的考虑有所遗漏,导致在某些正负号有冗余的样例下,预处理后无法得到预期的简洁表达式,以至于语法分析器无法正确运行出现错误。

此外,本次作业仅考虑了表达式展开和去括号的完成,并未考虑合并同类项简化表达式,在性能方面有缺陷。
## HW2
本次作业中需要完成的任务为:读入一系列自定义函数的定义以及一个包含幂函数、指数函数、自定义函数调用的表达式,输出恒等变形展开所有括号后的表达式。
### 一、基于度量的程序结构分析

#### 1. 代码规模

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/65bfb147175748e3983c005576886f52.png)


#### 2. 代码复杂度
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/799f225e70f34d76b5ebf5cc4828adc8.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5ac69459a282460b929eb161c6f15ea4.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/99a96824c9d341c8bf30ec725a8ef04b.png)

#### 3. 类图
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bf67f116f8fa4e459aadf69b2d0f54aa.png)


### 二、架构设计体验

本次作业新增内容有三点:引入多层括号嵌套;引入自定义表达式;加入指数函数。

对于括号嵌套,hw1中Item类中的expand方法通过对表达式因子和其他因子的合并已经实现去除嵌套括号的功能。

对于自定义函数,本次作业在PreProcessor类的预处理过程中新增了funcProcess()方法,使用字符串替换的方式,将自定义函数替换为表达式。

而新增的指数函数,在Lexer中新增了对exp()单词的分析,在Lexer中增加对指数函数因子的分析,同时Factor接口下新增IdxFactor类实现指数函数的存储和处理。此外,由于变量因子和指数函数都存在指数幂的形式,故新增PowFunc类对二者进行处理。

### 三、bug分析

本次作业完成了三个新增任务,但由于指数方面的处理新引入了PowFunc类,导致变量因子和指数函数的幂次形式出现混乱。而其余因子的幂次形式没有得到很好的处理。

## HW3

本次作业中需要完成的任务为:读入一系列自定义函数的定义以及一个包含幂函数、指数函数、自定义函数调用、求导算子的表达式,输出恒等变形展开所有括号后的表达式。

### 一、基于度量的程序结构分析

#### 1. 代码规模

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/47b711331ebc4aad91fa308fc132e710.png)


#### 2. 代码复杂度
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/08de887e8b7d4ed7b499bf49d1c41bcc.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/0dc7bb405b654d6cb514b01b3b061e10.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/57bbae226d614b7db471bcdfef45a517.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/63b0af827ef54b90a3834ce7e73b2e2c.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/3d2efc8641094dd3b0ea1e86f47830f9.png)

#### 3. 类图
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/75a09609e95c4e35aeb3c8e16d184b68.png)


### 二、架构设计体验

本次作业新增部分主要聚焦于求导算子的处理。对于求导因子的引入,本次作业采用新增求导函数因子DerFactor类将其引入递归下降的语法分析结构的方式,在求导函数因子内通过derive()方法,返回一个求导后的语法成分。

为了完成求导功能,Factor接口下的所有因子类新增求导入口(deriveWork())、求导方法(derive())以及深克隆方法(clone())。其中,深克隆方法对hw1、hw2的因子合并以及嵌套括号去除的方法进行了重构,用更简洁、更有层次化的方式完成了克隆。

DerFactor类中的derive()方法代码展示:

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b6fff51028e74585874f941bc089bfaf.png)


### 三、bug分析

本次作业在正确性方面性能较好,但在性能优化方面完成情况较差。

## 心得体会

通过第一单元作业的迭代,我对递归下降算法和层次化架构有了更加深入的体会。一个好的架构可以用更少的改动完成功能迭代,同时可以有较为满意的性能效果,层次化的架构是更为科学有效的代码架构方式。此外,对于第一单元作业,我的完成情况仅停留在作业提交,在互测和修复方面没有太大的成果。对此,我将在之后的作业里付出更多的时间精力,在互测和修复上付出努力,取得收获。
 

...全文
45 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

301

社区成员

发帖
与我相关
我的任务
社区描述
2023年北航面向对象设计与构造
学习 高校
社区管理员
  • YannaZhang
  • CajZella
  • C_ecelia
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧