BUAA_OO 2024 第一单元总结

刘一鸣-19373454 2024-03-23 17:24:30

第一单元总结 (表达式解析)

题目要求

作业1:第一次作业内容是完成多变量多项式的括号展开。读入一个包含加、减、乘、乘方以及括号(其中括号的深度至多为 1 层)的多变量表达式,输出恒等变形展开所有括号后的表达式。即对表达式含括号项的展开,以及合并同类项。

作业2:第二次作业内容是完成多项式的括号展开与函数调用、化简。本次作业支持嵌套多层括号 、新增指数函数。本次作业新增自定义函数因子,但自定义函数的函数表达式中不会调用其他函数。新加入可嵌套的括号,自定义函数以及指数函数。

作业3:第三次作业内容是读入一系列自定义函数的定义以及一个包含指数函数、自定义函数调用、求导算子的表达式,输出恒等变形展开所有括号后的表达式。新加入求导因子,可对表达式进行求导。

基于度量的程序结构分析

度量标准:

CogC 认知复杂度

ev(G) 基本圈复杂度,描述非结构化程度

iv(G) 设计复杂度,描述模块耦合度

v(G) 圈复杂度,描述独立路径的数目

架构分享:

hw1:

由于第一次作业的架构选择错误,只是单纯的进行字符串操作,但是在后续的迭代过程中遇到了很多的麻烦,因此在第二次作业中进行了大量重构。第一次作业由于只有一层括号,所以比较容易解析含括号的项。因此,是先对读入的字符串进行解析,按照括号外的加号可分为带括号的项。对于不带括号的项,直接可以进行解析,而对于带括号的,我们提取出括号外的所有元素合成一个新对象,在对括号内的部分合成一个容器,依次相乘相加。

hw2:

在经过理论课的学习后,我决定使用递归下降的解析方法来对表达式进行解析。相较于正则表达式的方法,递归下降的方法的延展性更好,有利于后续几次作业的迭代,因此进行了代码重构。根据格式化描述,我们的表达式可以分成表达式(Expr),项(Term),数字(Number),变量(Var)几个部分,而同时这几项又可以构成的因子(Factor),因此我们设置Factor接口,让这几项去实现Factor。

hw3:

加入了求导因子,我们认为求导是单项式的行为,因此我们要在Factor类中实现求导。我在各个新类中实现求导,在Factor类中实现链式求导以及符合求导即可。

最终版本复杂度分析

Term:

 

 

Main:

 

 

Expr:

 

 Function:

 

Main:函数主体,读取输入,打印输出

Lexer:词法分析器,将字符串解析为词语集合,方便后续文件处理

Parser:语法分析器,将词语集合解析为表达式,并且递归解析项和因子

Function:自定义函数类,获取自定义函数并分析,同时提供自定义函数的代换

Factor:因子接口,用于规范因子的行为

Term:项类

Expr:表达式类

Number:数字类

Exp:指数函数类

Stringsimplify:将字符串进行去除前导0,去除空格,去除多余符号等预处理

优缺点分析:

缺点

我们的方法将所有因子都化为多项式和单项式两种形式,这导致单项式需要承担过多的功能,从而产生了大量的重构函数。这在一定程度上增加了代码维护的难度,并可能导致递归深度增加。

优点

在解析过程中,我们的方法可以方便地进行分类,并且最终会自动将结果归一化为单项式的形式,这对于求导过程非常有利。

在化简过程中,我们遇到了一些关于克隆的问题。有时候,尽管两个容器的内容不同,但使用equals函数可能会判断为true。为了避免在合并时出现不必要的问题,我们选择牺牲一部分空间,尽可能地进行深克隆,以防止出现不必要的bug。此外,在对指数函数进行求导,即进行链式求导时,为了简化指数函数的求导,我们将指数函数的指数统一展开,并在容器中重新添加一定的相同量。在这个过程中,我们也需要使用深克隆,否则可能会出现求导后所有指数都为1的错误情况。

分析程序的bug

  • 第一次作业

        第一次作业第一个bug出在我对指数为0的因子的处理中。我是采用正则表达式匹配然后替换的方法,问题出现在匹配的不完备。当指数存在前导0时,我将只匹配到第一个0,然后将这部分替换成1,导致出现如将x^01替换成11的bug。最后的bug修复是通过判定0之后非数字才停止。第二个bug出在没处理指数的前导正号。

  • 第二次作业

        第二次作业中在传递参数时,没有考虑到传入的时表达式,导致了参数传递出错。并且处理函数的时候没有处理掉空格导致解析表达式错误。

  • 第三次作业

        由于第二次作业还有没能de出的bug,导致第三次作业未能通过公测。

心得体会

经过三次作业的学习,对于架构能力提高了不少。通过构造合适对象对之后的作业迭代有重大的影响。在作业开始的时候应该花多一些时间进行框架的构造,在编写代码时才能顺利进行。对Java中的接口使用也越发熟练,也了解到了正则表达式的使用和递归下降方法。

虽然最后的作业没有通过公测,但是在这个过程中也学习到了许多新知识。希望下一个单元能够顺利完成,并持续进步。

...全文
42 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wujizeze 老师 2024-04-21
  • 打赏
  • 举报
回复

建议围绕你的设计思路做一些梳理和分析,而不只是简单介绍每个能的功能设计。

301

社区成员

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

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