BUAA_OO_2025_第一单元总结

庞亦琛-23230605 2025-03-23 23:58:51

目录

目录

目录

 

BUAA_OO_2025_第一单元总结

第一次作业

架构

Bug

感受

第二次作业

架构

Bug

感受

第三次作业

架构

Bug

总体感受


 

BUAA_OO_2025_第一单元总结

经过了一个单元的学习,有了一些心得体会,取得了能力上的进步和心态上的磨炼。在此记录本单元三次代码的架构、设计思路和bug。

 

第一次作业

架构

 

上面是我重构后的第一次作业。重构前的代码非常奇怪,factor当做父类而非接口使用,并且添加了大量方法,既复杂,也难以扩展。所以在研讨课后借鉴同学思路,改成了上面的架构,仍采用token和lexer读取输入,采用factor接口,并使用Poly和Mono类来计算表达式。

Bug

第一,我第一次作业出现一个愚蠢的错误,在把所有的coef从int类型改为BigInteger类型时,有一处parseInt方法没有改正,导致错误,并且没有进入互测。

第二,还出现了符号的问题。因为表达式有可能作为因子,并且表达式、项、因子均可以携带符号,所以在递归输入处理符号时出现了问题。

第三,关于深克隆和浅克隆的问题,这会导致乘方出错。所有的方法中最好采用深克隆,比如我在每个方法会使用如下方法把返回的对象重新实例化出来。

Object obj = new Object();

第四,化简问题。必须要边做乘法(乘方)边运算,否则会出现内存爆炸问题。譬如

(x+1)^8*(x+1)^8*(x+1)^8*(x+1)^8*(x+1)^8

感受

第一次作业主要重温了面向对象的编程思路,学习了递归下降处理表达式的方法,学习用Token处理数据,同时感受到预先的构造一些测试点在中测基础上进行测试是十分有必要的。如果能够自己构造足够全面的数据,就能提前更正一些非常愚蠢的错误,从而避免强测失败。

另外,还学习了一些小技巧。比如使用replace函数预处理数据。

 

第二次作业

架构

 这是我第二次作业的架构。相比第一次作业,本次作业新增了关于自定义递推函数和三角的相关内容。本次作业是我三次作业中最为惨痛的一次,强测几乎全军覆没,出现了许许多多的有较大影响的bug。

从架构角度,我新增了Fucntion类和FuncParse类用于处理自定义递推函数。这部分也随之产生了许多bug。我的思路是在这部分提前将所有的f替换为正常的表达式,再用Token流读取。另外新增了TrigMono和TrigTerm类用于处理三角函数。

Bug

本次作业我的Bug最多。

第一,预处理部分,函数的边界,形参的边界问题,形参的替换问题等。这部分甚至直到第三次作业的bug处理时我才真正完全处理好。

第二,三角部分,现在的架构是修改后的。原先对三角函数的处理非常潦草。修改后使用TrigMono类来表示一般三角函数的表达式。同时,这部分还有很多相关bug。譬如化简,不能一味追求化简而抛弃性能,甚至导致额外bug。但必要的合并同类项不能缺少。于是需要equal方法。但值得注意的是,有些地方需要两个式子完全相同(三角函数内的子表达式),有些地方不需要系数相同也能合并同类项。

感受

全是泪

为了debug熬了许多夜,但没能取得好成绩。有痛心,有反思,为什么不能提前构造更好的数据,而是只满足于中测全对?这是我在第二单元着重要解决的问题:进入互测。

 

第三次作业

架构

 这是我第三次作业的架构。

第三次作业加入了自定义函数和求导。求导主要参考第二次实验的相关思路,自定义函数则参考递推函数,我把g,h统一到f中一起处理。

Bug

这次主要是两个非常致命的bug。由于我第二次作业debug花费时间过长,导致我没有充分时间来构造测试点测试第三次作业,于是出现以下bug

第一,cos求导居然没有负号。

第二,判断形参是否含函数时把或逻辑写成与逻辑。

这是愚蠢的错误,不可接受的错误。在此反思,下个单元需要在第一次开始写代码时就更专注的完成。

总体感受

第一单元的作业反映出我许多不足。我一次互测也没有进入,这反映出我一次构造代码能力差,debug能力差,构造数据点能力不足的问题。

在以后学习中,不断努力,不断学习,增强自己的实力,争取取得进步。

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

269

社区成员

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

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