作业要求
读入一个包含加、减、乘、乘方以及括号表达式,输出恒等变形展开所有括号后的表达式。
- 第一次作业: 单变量,括号嵌套只有一层
- 第二次作业: 新增指数函数,自定义函数,以及多层嵌套
- 第三次作业 : 新增导数因子
设计思路
第一次作业设有 :
MainClass
, Expr
, Term
, Variable
,Lexer
, Parser
, Factor
第二次作业新增 :
AllDefineFunc
, DefineFunc
, Exp
, ExpFunc
第三次作业新增 :
Differentiation
简单介绍 :
MainClass
- 用于读入输入
- 函数定义处理
- 输入的预处理
- 词法分析和语法解析
- 结果输出
Factor
- 接口~
Expr
- 一个多项式表达式类
- 合拼同类项
- 展开多项式
- 替换因子
遍历表达式中的每个项和因子,如果因子是指数函数则调用指数函数的替换方法,如果是表达式则递归调用方法处理内部的因子替换。
Term
- 添加因子
- 因子分析
- 调用方法处理不同类型因子(指数函数和表达式)之间的运算
Variable
- 获取变量包括单变量(x),系数,新增变量(y),(z),函数fgh等…
- 比较指数变量是否相等
- 检查变量是否不包含 x、y、z 中的任何一个,获取和设置 x、y、z 的指数值等。
Lexer
- 实现方法大致和oolens递归下降篇一样
Parser
- 实现方法大致和oolens递归下降篇一样
AllDefineFunc
- 利用 HashMap 来管理已定义的函数
- 通过 putInFunct 方法添加函数,并通过
getMap
方法获取整个函数映射。
DefineFunc
- 用于处理单个函数的定义和表达式
- 定义一个
initialize
方法用于解析函数定义字符串,并初始化函数的类型、参数和表达式。 - 通过正则表达式匹配来提取函数类型和参数。
- 对函数表达式部分进行预处理,并生成最终的表达式字符串。
- 使用
Lexer
和Parser
对象对表达式字符串进行词法分析和语法解析,生成表达式对象expr
。
Exp
- 对指数项的初始化、获取和设置幂次、复制、比较相等性
- 判断是否可以相乘以及转换为字符串的操作
- 将指数项转换为字符串表示形式
ExpFunc
- 指数函数的初始化、添加指数项、带入因子
- 两个指数函数是否满足加法或减法的条件
- 系数和变量是否匹配
- 变量是否匹配以及指数项数量和内容是否相同
- 将指数函数转换为字符串表示形式
Differentiation
- 指数函数、因子和整个表达式进行求导
- 主要根据不同的输入类型,选择不同的求导方式,并生成新的表达式对象表示导数。
类复杂度
方法复杂度分析
BUG
第一单元的三次作业皆可发现很多bug,甚至在第二第三次的作业被hack爆了,可以发现自己在预处理方面考虑不周全,在指数函数power展开方面也没有处理好,导致没有通过评测。
优缺点
- Factor接口能将不同类型的因子分类,较容易进行修改,并且后面发现迭代作业也很方便
- 有些方法的设计复杂度过高
- 如有增
merge
方法可能会更好(如第二次上机)
心得体会
看了参与过先导课和未参与先导课的有效作业和强测成绩占比,觉得先导课真的很重要,但我不知道有先导课 毕竟国际学院学生在大一大二不能自己选课 ,故没参加先导课。刚接触到第一次作业的任务时,无从下手,对递归下降也完全不了解,庆幸有很多优秀学长姐的博客作为参考,一步一步学上来。对于第一单元的三次作业完成度,我并不满意,希望能在代码性能上完成的更好,可拓展性处理的更好,思想更能面向对象。