面向对象第一单元博客
面向对象第一单元博客
这次作业由于各种原因只完成第三次作业,在此对第三次作业的一些设计进行分享
类设计
Main
实现程序的顶层逻辑,包括输入,输出处理
Function
表示一个自定义函数
成员变量
- char name 函数的名字即(f、g、h)
- String expr 以字符串的形式保存了函数的表达式
- ArrayList \
funVar 保存了函数自变量的顺序
方法
- parseFunction(String poly) 将函数表达式解析为一个Function对象进行保存
InputPoly
具有的功能:将标准输入中的字符串转化为Poly类对象poly,并实现简化,输出的功能
成员变量
- Poly poly
- PolyParser parser
方法
- InputPoly(String str):将输入的str解析为Poly类对象并赋值给poly
- void simplify():将poly进行合并同类项等优化操作,得到的结果赋值给poly
- public Poly parse(String str)对str进行解析,得到一个Poly对象
parse
功能:对输入串进行预处理与格式检查,然后调用parser生成Poly类对象
PolyParser
功能:使用递归下降方式解析多项式
具体实现:根据形式化定义从左到右扫描出现的符号,遇到可展开的符号就调用相应的函数解析该符号,解析完成就返回并继续向下解析。
对自定义函数解析方式
我对自定义函数处理的方式如下:
*
Poly
具有的功能:表示一个表达式,管理其下所有的项,
成员变量
- Arraylist\
termList - Boolean simplifyFlag:表示该多项式是否被简化过,初值为false
- BigInteger exp:表示该多项式的指数
方法
- Poly simplify():将Poly进行简化并生成新的Poly类对象
- void mergePoly(Poly poly):合并一个多项式,不化简
- static Poly multPoly(Poly src1,Poly src2)实现两个多项式相乘,不化简
simplify
运行逻辑:
- 生成一个新的Poly类对象ret
- 对termList的每个项调用simplify方法进行简化并合并入成多项式ret
- 合并成多项式时合并同类项,每调用一次mergeAndSimplify就合并一次
- ret内部状态是已被化简的
- 根据指数展开多项式,并化简
- 设置simplifyFlag = true,返回ret
polymultPoly
实现两个多项式相乘
- 先对两个多项式进行化简
- 遍历两个多项式的每个项,进行乘法运算然后相加合并成一个多项式并化简返回
Term
表示一个项,管理所有的因子
成员变量
FactorList factorList
方法
Poly simplify():将该项各因子进行简化(去括号)
simplify
运行逻辑:
- 建立一个新的Poly类对象poly
- 检查自身是否已经被化简,若是,则将自身加入poly中并返回
- 遍历factorList
- 记录所有的常数因子和所有的变量因子
- 遇到第一个多项式因子直接合并入poly中,并化简,若不是第一个,调用方法Poly.polymultPoly将该因子与poly合并为一个新多项式并赋值给poly
- 将常数因子和变量因子组成Poly类对象ret,若poly中没有项,判断poly是否因为合并而变为空,若不是,则直接返回ret,然后设simplifyFlag = true,调用方法polyMultPoly合并入ret中
- 并返回ret