BUAA-OO第一单元总结

刘发源-19373612 2024-03-30 20:25:42

一、第一次作业

本作业的代码架构分析如下

  1. 主要的类设计

    • Expr类:表示整个表达式,包含一个ArrayList用于存储多个Term对象。
    • Term类:表示表达式中的一个项,包含一个ArrayList用于存储多个Factor对象。
    • Factor类:表示表达式中的一个因子,有三种类型:幂函数、常数因子和表达式因子。
  2. 表达式解析

    • 使用递归下降算法进行表达式解析。递归下降算法包括Lexer(词法分析器)和Parser(解析器)两个部分。
    • Lexer将表达式分解成一系列基本语法单元(tokens)。
    • Parser根据表达式的形式化定义,依靠Lexer提供的tokens,递归地生成表达式、项和因子的对象。
  3. 表达式展开

    • 对于表达式的展开,具体的实现方式可能需要根据具体要求进行设计。
    • 可以在Expr类中添加展开方法,根据乘法法则和幂函数的展开规则对表达式进行展开操作。

通过递归下降算法和类的设计,可以实现对输入表达式的解析和生成相应的对象表示。然后可以根据具体需求进行进一步操作,例如展开表达式等。这样的代码架构能够使代码结构清晰、易于维护,并且方便扩展和修改。

理解递归下降算法的过程是第一个难点。关键是将整个解析过程看作是一个建树递归的过程,只不过是在多个函数之间的递归。函数之间有明显的层级关系,例如ParserExpr函数调用ParserTerm函数,ParserTerm函数调用ParserFactor函数。递归下降算法的核心是这三个函数之间的调用关系。ParserExpr函数是最顶层的解析表达式函数,它调用ParserTerm函数来解析表达式的每一项,然后ParserTerm函数又调用ParserFactor函数来解析项的每一个因子。

第二个难点是如何利用语法树进行括号展开。由于括号展开的结果一定是关于x的多项式,可以使用HashMap容器来存储语法树每个节点的状态,即每一项x的指数对应的系数。在递归回溯的展开计算过程中,可以维护每个节点的状态,并最终根据根节点的状态进行输出。

通过理解递归下降算法的调用关系和利用语法树进行括号展开的方法,可以解决第二次作业中的难点。这些理解和方法能够帮助我们设计和实现相应的代码逻辑,处理复杂的语法单元和括号展开要求。


二、第二次作业 

第二次作业在第一次作业的基础上增加了三角函数因子、求和函数因子和自定义函数因子,使得解析的复杂度进一步提高。递归下降方法可以继续沿用,只需要增加几种语法单元即可。

  1. 嵌套括号处理:

    • 在因子的解析中,当遇到左括号时,需要递归调用解析表达式的方法来解析括号内的表达式。
    • 可以在ParserFactor函数中添加对左括号的处理逻辑,调用ParserExpr函数来解析括号内的表达式。
  2. 自定义函数处理:

    • 在因子的解析中,当遇到自定义函数时,需要解析函数名、实参,并将实参传入到函数定义式中进行计算。
    • 可以在ParserFactor函数中添加对自定义函数的处理逻辑,解析函数名和实参,并将实参传入到相应的函数定义式中进行计算。
  3. 指数函数处理:

    • 在因子的解析中,当遇到指数函数时,需要解析指数的底数和指数,并进行相应的计算。
    • 可以在ParserFactor函数中添加对指数函数的处理逻辑,解析指数的底数和指数,并进行计算。

第二次作业的难点主要有两个:单项式类的建立,合并优化的问题。

  1. 单项式类的建立:

    • 多项式类的建立相对简单,可以使用一个ArrayList来存储多个单项式对象。单项式类的建立较为复杂,因为在第二次作业的架构中,最小项的形式为ax^bexp(Poly),所以单项式类的属性需要包含指数内的多项式Poly。
    • 在设计单项式类时,需要考虑是否使用字符串形式表示指数内的多项式,以及是否需要在单项式类中包含多项式对象。根据实际需求和设计思路,可以选择合适的方式来表示和处理。
  2. 合并优化问题:

    • 由于指数函数的存在,判断两个单项式是否能够合并变得复杂,需要在多项式类和单项式类中重载isEqual方法。
    • 在设计合并优化逻辑时,需要考虑不同情况下的合并规则,并根据具体需求进行实现。

三、第三次作业 

第三次作业太过复杂,未能思考清楚,在此给出设计思路

  1. 表达式求导:

    • 在多项式类和单项式类中添加求导的方法,用于计算表达式的导数。
    • 对于多项式类,可以遍历每个单项式,对每个单项式进行求导,并将求导结果添加到新的多项式中。
    • 对于单项式类,根据指数幂次法则和链式法则计算导数。
  2. 自定义函数嵌套:

    • 在解析器中添加对自定义函数嵌套的处理逻辑,可以在解析因子时判断是否为自定义函数,并递归调用解析表达式的方法来解析自定义函数内部的表达式。
    • 在自定义函数类中添加对自定义函数嵌套的支持,即在函数定义式中可以包含其他表达式。

四、单元总结

本单元作业经过三次迭代,层层加码,复杂度稳步提升,对面向对象的理解也逐渐深入。

  • 第一次仅包含加、减、乘、乘方、单层括号的表达式处理
  • 增加了嵌套括号处理、自定义函数处理、指数函数处理
  • 进一步迭代实现表达式求导与自定义函数嵌套

个人收获总结:通过实践,我更深入地理解了面向对象的思想和设计原则。面向对象的编程方式强调将问题分解为对象,每个对象都有自己的属性和方法,并通过对象之间的交互来解决问题。这种思想使得代码更加模块化、可维护和可扩展。在完成程序设计过程中,我学会了如何设计良好的类和对象。通过合理划分类的职责和功能,将属性和方法封装在类中,使得代码结构清晰,易于理解和修改。同时通过继承、封装和多态等面向对象的特性,提高了代码的重用性和灵活性。

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

301

社区成员

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

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