301
社区成员
发帖
与我相关
我的任务
分享目录

lexer为词法分析器,parser为输入解析器,expr,term,varible,number满足factor接口,expr存取各个term,term中存取各个factor。所有factor转换成legalexpr进行运算,产生包括legalexpr,legalterm的结果,最后由最顶层的expr转化成的legalexpr储存、输出结果。
第一次作业个人主要基于第一次实验的代码,先利用lexer与parser进行词法分析与解析,在expr-term-factor的递归下降中分析输入的表达式,为了统一运算,加入legalterm与legalexpr类来对输入的单项式、多项式进行化简与合并。在后续的迭代开发中,第一次作业仍是处于核心地位,第二三次作业则是模块拓展。
具体而言,个人本来尝试利用接口factor来直接控制表达式构建与输出,但在输出处的处理遇到瓶颈,最后决定听取同学建议,新建一个有规范表达a*x^b的legalterm类与合并其的legalexpr来实现运算与合并。乘作为链接项中各个因子的存在,将乘法统一到legalterm中,加法减法作为链接各个项的存在,将其放到legalexpr中,在最终输出时实现一边加一遍合并。而factor中仍保留了其它运算方法。取反作为我处理正负号的方法,将其放在factor中,乘方也是一样。合并过程由规范表达来寻找相同项,实现合并。
个人在第一次作业纠结很久,担心架构对后续作业产生影响,做出了一些拓展。个人实现了多个变量(即a~z)加入运算。但很可惜,后续所有作业并没有出现这一要求。
第一次的bug较简单,是由粗心导致的,缺失了一行代码没写,使得代码无法处理-x^a的情况。
第一次的优化仅限于性能分方面的,即减少正负号叠加,省去0与*1的无效输出。

lexer为词法分析器,parser为输入解析器,expr,term,varible,number满足factor接口,expr存取各个term,term中存取各个factor。所有factor转换成legalexpr进行运算,产生包括legalexpr,legalterm的结果,最后由最顶层的expr转化成的legalexpr储存、输出结果。
function类为定义的函数格式,并不包含引入的参数。derivation类为求导式子,exp为exp类。
第二三次作业我的架构没有进行大改,尤其第三次作业在实际实现时拓展规模更小,所以统一描述架构设计。
第二次作业先是括号嵌套,然而这在递归下降的架构中早已得到解决,exp函数的导入个人通过在词法分析中特判“exp”字符来识别exp,随后构建了一个满足factor的新类exp,其包括一个factor属性来保存exp括号内的值,并且factor中的power函数实现其特殊的乘方运算。exp的的导入使得legalterm的规范表达式变为a*x^b*exp(...),并基于此来进行同类项识别。自定义函数的实现,个人是先新建Function类,在解析类中新建一个Arraylist<Function>属性来表示其满足的自定义函数,在解析正式运算式前先用新建的方法defFunction来解析函数,并构建一个Function,放入Arraylist,在最后解析正式表达式时引入这些函数。 函数中出现的多变量所幸我在第一次作业实现了多变量运算因而可以轻松处理。同时,个人代码也允许随意函数名的函数出现,即支持命名函数为a~zA~z。
第三次作业加入求导因子,这与第二次出现exp时的处理相似,新建满足factor的类,以factor存放要求导的式子,但在将其转化为legalexpr时进行求导,变为求完导后的结果参与到与其他项的运算。而自定义函数调用自定义函数可以很简单的在每次定义函数时,对解析类导入之前定义的函数就可实现。同时,个人为了与之前作业中支持的多变量运算保持一致,实现了对不同变量求导的功能,也因而实现了在定义函数中允许出现求导的功能,即支持计算dy(x+y)之类的式子。
第二次的作业一是在优化性能分导致的exp((-x))输出成exp(-x),个人随后在优化括号时更改一行代码解决。
其余bug包括cpu超时和指数范围越界,比如强测的x^8嵌套,个人需修改指数的存放类型为BigInteger,同时在解析时加入对输入的简化,如输入多个括号时,检测是否可以直接去除expr-term-factor结构,直接变为factor,以减少用时。
优化其一是对性能分方面的优化,这主要出现在第二次作业的exp处理中,为实现较短长度的输出,将exp内部的项进行常数求最大公因数,如果结果不为1则提出公因数,如exp((2+2*x)) -> exp((1+x))^2,但可能存在如此“优化”后长度没有变短的情况,故而在最后需要判断前后字符串长度来选取较优解。
其二如上文对cpu超时的处理,化简输入结构复杂度,减少时间。

圈复杂度

代码行
第一单元的oo作业使人初步认识多次迭代开发中代码的变化,看到自己之前的选择是否经得起时间的检验。表达式的处理中体现的递归下降思想,为我提供了思路。
未来方向上可以在第一作业中提供多个架构思路,减少在最开始无从下手的情况。